/php/commands/organizations.php

https://gitlab.com/blueprintmrk/cli · PHP · 208 lines · 147 code · 13 blank · 48 comment · 15 complexity · 48d131ea1a1866b8dc2b31a5b460a51e MD5 · raw file

  1. <?php
  2. use Terminus\Auth;
  3. use Terminus\Helpers\Input;
  4. use Terminus\Models\User;
  5. use Terminus\Models\Collections\Sites;
  6. use Terminus\Models\Collections\UserOrganizationMemberships;
  7. /**
  8. * Show information for your Pantheon organizations
  9. *
  10. */
  11. class Organizations_Command extends TerminusCommand {
  12. public function __construct() {
  13. Auth::ensureLogin();
  14. parent::__construct();
  15. $this->sites = new Sites();
  16. }
  17. /**
  18. * Show a list of your organizations on Pantheon
  19. *
  20. * @subcommand list
  21. *
  22. */
  23. public function all($args, $assoc_args) {
  24. $user = new User();
  25. $data = array();
  26. foreach ($user->getOrganizations() as $id => $org) {
  27. $org_data = $org->get('organization');
  28. $data[] = array(
  29. 'name' => $org_data->profile->name,
  30. 'id' => $org->get('id'),
  31. );
  32. }
  33. $this->output()->outputRecordList($data);
  34. }
  35. /**
  36. * List an organization's sites
  37. *
  38. * ## OPTIONS
  39. *
  40. * <add|remove|list>
  41. * : subfunction to run
  42. *
  43. * [--org=<id|name>]
  44. * : Organization UUID or name
  45. *
  46. * [--tag=<tag>]
  47. * : Tag name to filter sites list by
  48. *
  49. * [--site=<site>]
  50. * : Site to add to or remove from organization
  51. *
  52. * @subcommand sites
  53. *
  54. */
  55. public function sites($args, $assoc_args) {
  56. $action = array_shift($args);
  57. $org_id = Input::orgid($assoc_args, 'org', null, array('allow_none' => false));
  58. $orgs = new UserOrganizationMemberships();
  59. $org = $orgs->get($org_id);
  60. $org_info = $org->get('organization');
  61. $memberships = $org->site_memberships->all();
  62. switch ($action) {
  63. case 'add':
  64. if (isset($assoc_args['site'])) {
  65. if ($this->siteIsMember($memberships, $assoc_args['site'])) {
  66. $this->failure(
  67. '{site} is already a member of {org}',
  68. array(
  69. 'site' => $assoc_args['site'],
  70. 'org' => $org_info->profile->name
  71. )
  72. );
  73. } else {
  74. $site = $this->sites->get($assoc_args['site']);
  75. }
  76. } else {
  77. $site = $this->sites->get(
  78. Input::menu(
  79. $this->getNonmemberSiteList($memberships),
  80. null,
  81. 'Choose site'
  82. )
  83. );
  84. }
  85. Terminus::confirm(
  86. 'Are you sure you want to add %s to %s ?',
  87. array($site->get('name'), $org_info->profile->name)
  88. );
  89. $workflow = $org->site_memberships->addMember($site);
  90. $workflow->wait();
  91. $this->workflowOutput($workflow);
  92. break;
  93. case 'remove':
  94. if (isset($assoc_args['site'])) {
  95. if (!$this->siteIsMember($memberships, $assoc_args['site'])) {
  96. $this->failure(
  97. '{site} is not a member of {org}',
  98. array(
  99. 'site' => $assoc_args['site'],
  100. 'org' => $org_info->profile->name
  101. )
  102. );
  103. } else {
  104. $site = $this->sites->get($assoc_args['site']);
  105. }
  106. } else {
  107. $site = $this->sites->get(
  108. Input::menu(
  109. $this->getMemberSiteList($memberships),
  110. null,
  111. 'Choose site'
  112. )
  113. );
  114. }
  115. $member = $org->site_memberships->get($site->get('id'));
  116. Terminus::confirm(
  117. 'Are you sure you want to remove %s from %s ?',
  118. array($site->get('name'), $org_info->profile->name)
  119. );
  120. $workflow = $member->removeMember();
  121. $workflow->wait();
  122. $this->workflowOutput($workflow);
  123. break;
  124. case 'list':
  125. default:
  126. foreach ($memberships as $membership) {
  127. if (
  128. isset($assoc_args['tag'])
  129. && !(in_array($assoc_args['tag'], $membership->get('tags')))
  130. ) {
  131. continue;
  132. }
  133. $site = $membership->get('site');
  134. $data_array = array(
  135. 'name' => null,
  136. 'id' => null,
  137. 'service_level' => null,
  138. 'framework' => null,
  139. 'created' => null,
  140. 'tags' => $membership->get('tags')
  141. );
  142. foreach ($data_array as $key => $value) {
  143. if (($value == null) && isset($site->$key)) {
  144. $data_array[$key] = $site->$key;
  145. }
  146. }
  147. $data_array['created'] = date('Y-m-dTH:i:s', $data_array['created']);
  148. $data[] = $data_array;
  149. }
  150. $this->output()->outputRecordList($data);
  151. break;
  152. }
  153. }
  154. /**
  155. * Retrieves a succinct list of member sites
  156. *
  157. * @param [array] $memberships Members of this org
  158. * @return [array] $list
  159. */
  160. private function getMemberSiteList($memberships) {
  161. $list = array();
  162. foreach ($memberships as $membership) {
  163. $site = $membership->get('site');
  164. $list[$site->id] = $site->name;
  165. }
  166. return $list;
  167. }
  168. /**
  169. * Retrieves a succinct list of non-member sites
  170. *
  171. * @param [array] $memberships Members of this org
  172. * @return [array] $list
  173. */
  174. private function getNonmemberSiteList($memberships) {
  175. $members = $this->getMemberSiteList($memberships);
  176. $sites = $this->sites->getMemberList();
  177. $list = array_diff($sites, $members);
  178. return $list;
  179. }
  180. /**
  181. * Determines whether the site is a member of an org
  182. *
  183. * @param [array] $memberships Members of this org
  184. * @return [boolean] $is_member
  185. */
  186. private function siteIsMember($memberships, $site_id) {
  187. $list = $this->getMemberSiteList($memberships);
  188. $is_member = (
  189. isset($list[$site_id])
  190. || (array_search($site_id, $list) !== false)
  191. );
  192. return $is_member;
  193. }
  194. }
  195. Terminus::addCommand('organizations', 'Organizations_Command');