From e4808438745717acee05fc41fcd5a8561d3830a1 Mon Sep 17 00:00:00 2001 From: Sebastian Marcet Date: Wed, 22 Nov 2017 17:17:38 -0300 Subject: [PATCH] Updated get member endpoint * added filter by github_user * updated mappings to return ccla_teams relation Change-Id: Ied32b72380d347aaa599005773485b6d1ba4adc7 --- .../Main/OAuth2MembersApiController.php | 1 + app/Http/Utils/Filters/FilterParser.php | 20 ++++- .../AbstractMemberSerializer.php | 15 ++++ app/ModelSerializers/CCLA/TeamSerializer.php | 81 +++++++++++++++++++ app/ModelSerializers/SerializerRegistry.php | 5 ++ app/Models/Foundation/Main/CCLA/Team.php | 77 ++++++++++++++++++ app/Models/Foundation/Main/Member.php | 42 +++++++++- .../Summit/DoctrineMemberRepository.php | 15 ++-- tests/OAuth2MembersApiTest.php | 25 ++++++ update_doctrine.sh | 1 + 10 files changed, 270 insertions(+), 12 deletions(-) create mode 100644 app/ModelSerializers/CCLA/TeamSerializer.php create mode 100644 app/Models/Foundation/Main/CCLA/Team.php diff --git a/app/Http/Controllers/Apis/Protected/Main/OAuth2MembersApiController.php b/app/Http/Controllers/Apis/Protected/Main/OAuth2MembersApiController.php index efaa627b..4a35ebc8 100644 --- a/app/Http/Controllers/Apis/Protected/Main/OAuth2MembersApiController.php +++ b/app/Http/Controllers/Apis/Protected/Main/OAuth2MembersApiController.php @@ -88,6 +88,7 @@ final class OAuth2MembersApiController extends OAuth2ProtectedController 'group_id' => ['=='], 'email_verified' => ['=='], 'active' => ['=='], + 'github_user' => ['=@', '=='], )); } diff --git a/app/Http/Utils/Filters/FilterParser.php b/app/Http/Utils/Filters/FilterParser.php index 1a2f5a32..93e1b565 100644 --- a/app/Http/Utils/Filters/FilterParser.php +++ b/app/Http/Utils/Filters/FilterParser.php @@ -1,4 +1,6 @@ 'first_name:json_string', 'LastName' => 'last_name:json_string', 'Gender' => 'gender:json_string', + 'GitHubUser' => 'github_user:json_string', 'Bio' => 'bio:json_string', 'LinkedInProfile' => 'linked_in:json_string', 'IrcHandle' => 'irc:json_string', @@ -39,6 +40,7 @@ class AbstractMemberSerializer extends SilverStripeSerializer protected static $allowed_relations = [ 'groups', 'affiliations', + 'ccla_teams', ]; /** @@ -61,6 +63,9 @@ class AbstractMemberSerializer extends SilverStripeSerializer if(in_array('groups', $relations)) $values['groups'] = $member->getGroupsIds(); + if(in_array('ccla_teams', $relations)) + $values['ccla_teams'] = $member->getCCLATeamsIds(); + if(in_array('affiliations', $relations)){ $res = []; foreach ($member->getCurrentAffiliations() as $affiliation){ @@ -95,6 +100,16 @@ class AbstractMemberSerializer extends SilverStripeSerializer $values['groups'] = $groups; } break; + case 'ccla_teams': { + if(!in_array('ccla_teams', $relations)) break; + $teams = []; + unset($values['ccla_teams']); + foreach ($member->getCCLATeams() as $t) { + $teams[] = SerializerRegistry::getInstance()->getSerializer($t)->serialize('company', [], ['none']); + } + $values['ccla_teams'] = $teams; + } + break; } } } diff --git a/app/ModelSerializers/CCLA/TeamSerializer.php b/app/ModelSerializers/CCLA/TeamSerializer.php new file mode 100644 index 00000000..595ff74c --- /dev/null +++ b/app/ModelSerializers/CCLA/TeamSerializer.php @@ -0,0 +1,81 @@ + 'name:json_string', + 'CompanyId' => 'company_id:json_int', + ); + + /** + * @param null $expand + * @param array $fields + * @param array $relations + * @param array $params + * @return array + */ + public function serialize($expand = null, array $fields = array(), array $relations = array(), array $params = array() ) + { + $team = $this->object; + + if(!$team instanceof Team) return []; + + $values = parent::serialize($expand, $fields, $relations, $params); + $members = []; + + foreach($team->getMembers() as $member){ + $members[] = $member->getId(); + } + + $values['members'] = $members; + + if (!empty($expand)) { + $expand_to = explode(',', $expand); + foreach ($expand_to as $relation) { + switch (trim($relation)) { + case 'company':{ + if(isset($values['company_id'])) + { + unset($values['company_id']); + $values['company'] = SerializerRegistry::getInstance()->getSerializer($team->getCompany())->serialize($expand); + } + } + break; + case 'members':{ + unset( $values['members']); + $members = []; + foreach($team->getMembers() as $member){ + $members[] = SerializerRegistry::getInstance()->getSerializer($member)->serialize($expand); + } + + $values['members'] = $members; + + } + break; + } + } + } + + return $values; + } +} \ No newline at end of file diff --git a/app/ModelSerializers/SerializerRegistry.php b/app/ModelSerializers/SerializerRegistry.php index 80ff2c06..c2afda02 100644 --- a/app/ModelSerializers/SerializerRegistry.php +++ b/app/ModelSerializers/SerializerRegistry.php @@ -1,4 +1,5 @@ registry['OpenStackComponent'] = OpenStackComponentSerializer::class; $this->registry['OpenStackRelease'] = OpenStackReleaseSerializer::class; + + // ccla + + $this->registry['Team'] = TeamSerializer::class; } /** diff --git a/app/Models/Foundation/Main/CCLA/Team.php b/app/Models/Foundation/Main/CCLA/Team.php new file mode 100644 index 00000000..61a453a4 --- /dev/null +++ b/app/Models/Foundation/Main/CCLA/Team.php @@ -0,0 +1,77 @@ +members = new ArrayCollection(); + } + + /** + * @ORM\ManyToMany(targetEntity="models\main\Member", mappedBy="ccla_teams") + */ + private $members; + + /** + * @ORM\ManyToOne(targetEntity="models\main\Company") + * @ORM\JoinColumn(name="CompanyID", referencedColumnName="ID") + * @var Company + */ + private $company; + + /** + * @return Company + */ + public function getCompany(){ + return $this->company; + } + + /** + * @return Member[] + */ + public function getMembers(){ + return $this->members->toArray(); + } + + /** + * @return string + */ + public function getName(){ + return $this->name; + } + + /** + * @return int + */ + public function getCompanyId(){ + return $this->company->getId(); + } +} \ No newline at end of file diff --git a/app/Models/Foundation/Main/Member.php b/app/Models/Foundation/Main/Member.php index 760cad9a..be53a944 100644 --- a/app/Models/Foundation/Main/Member.php +++ b/app/Models/Foundation/Main/Member.php @@ -13,11 +13,11 @@ * limitations under the License. **/ +use Models\Foundation\Main\CCLA\Team; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Criteria; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; -use Doctrine\ORM\Query\ResultSetMappingBuilder; use models\exceptions\ValidationException; use models\summit\CalendarSync\CalendarSyncInfo; use models\summit\CalendarSync\ScheduleCalendarSyncInfo; @@ -56,6 +56,12 @@ class Member extends SilverstripeBaseModel */ private $last_name; + /** + * @ORM\Column(name="GitHubUser", type="string") + * @var string + */ + private $github_user; + /** * @ORM\OneToMany(targetEntity="models\summit\SummitEventFeedback", mappedBy="owner", cascade={"persist"}) * @var SummitEventFeedback[] @@ -180,6 +186,16 @@ class Member extends SilverstripeBaseModel */ private $groups; + /** + * @ORM\ManyToMany(targetEntity="Models\Foundation\Main\CCLA\Team", inversedBy="members") + * @ORM\JoinTable(name="Team_Members", + * joinColumns={@ORM\JoinColumn(name="MemberID", referencedColumnName="ID")}, + * inverseJoinColumns={@ORM\JoinColumn(name="TeamID", referencedColumnName="ID")} + * ) + * @var Team[] + */ + private $ccla_teams; + /** * @ORM\OneToMany(targetEntity="ChatTeamMember", mappedBy="member", cascade={"persist"}, orphanRemoval=true) * @var ChatTeamMember[] @@ -200,6 +216,7 @@ class Member extends SilverstripeBaseModel parent::__construct(); $this->feedback = new ArrayCollection(); $this->groups = new ArrayCollection(); + $this->ccla_teams = new ArrayCollection(); $this->affiliations = new ArrayCollection(); $this->team_memberships = new ArrayCollection(); $this->favorites = new ArrayCollection(); @@ -405,6 +422,13 @@ class Member extends SilverstripeBaseModel $this->email = $email; } + /** + * @return string + */ + public function getGitHubUser(){ + return $this->github_user; + } + /** * @return bool */ @@ -578,6 +602,21 @@ class Member extends SilverstripeBaseModel return $ids; } + public function getCCLATeamsIds(){ + $ids = []; + foreach ($this->getCCLATeams() as $t) { + $ids[] = intval($t->getId()); + } + return $ids; + } + + /** + * @return Team[] + */ + public function getCCLATeams(){ + return $this->ccla_teams->toArray(); + } + /** * @return string[] */ @@ -924,4 +963,5 @@ SQL; $this->calendars_sync->removeElement($calendar_sync_info); $calendar_sync_info->clearOwner(); } + } \ No newline at end of file diff --git a/app/Repositories/Summit/DoctrineMemberRepository.php b/app/Repositories/Summit/DoctrineMemberRepository.php index c3657650..35a19578 100644 --- a/app/Repositories/Summit/DoctrineMemberRepository.php +++ b/app/Repositories/Summit/DoctrineMemberRepository.php @@ -56,18 +56,19 @@ final class DoctrineMemberRepository if(!is_null($filter)){ $filter->apply2Query($query, [ - 'irc' => 'm.irc_handle:json_string', - 'twitter' => 'm.twitter_handle:json_string', - 'first_name' => 'm.first_name:json_string', - 'last_name' => 'm.last_name:json_string', - 'email' => ['m.email:json_string', 'm.second_email:json_string', 'm.third_email:json_string'], - 'group_slug' => new DoctrineJoinFilterMapping + 'irc' => 'm.irc_handle:json_string', + 'twitter' => 'm.twitter_handle:json_string', + 'first_name' => 'm.first_name:json_string', + 'last_name' => 'm.last_name:json_string', + 'github_user' => 'm.github_user:json_string', + 'email' => ['m.email:json_string', 'm.second_email:json_string', 'm.third_email:json_string'], + 'group_slug' => new DoctrineJoinFilterMapping ( 'm.groups', 'g', "g.code :operator ':value'" ), - 'group_id' => new DoctrineJoinFilterMapping + 'group_id' => new DoctrineJoinFilterMapping ( 'm.groups', 'g', diff --git a/tests/OAuth2MembersApiTest.php b/tests/OAuth2MembersApiTest.php index c341046c..cd8244e7 100644 --- a/tests/OAuth2MembersApiTest.php +++ b/tests/OAuth2MembersApiTest.php @@ -111,4 +111,29 @@ final class OAuth2MembersApiTest extends ProtectedApiTest $this->assertTrue(!is_null($member)); $this->assertResponseStatus(200); } + + public function testGetMembersByGitHubUser() + { + $params = [ + 'filter' => 'github_user=@smarcet', + 'order' => '+first_name,-last_name', + 'expand' => 'groups, ccla_teams' + ]; + + $headers = array("HTTP_Authorization" => " Bearer " . $this->access_token); + $response = $this->action( + "GET", + "OAuth2MembersApiController@getMembers", + $params, + array(), + array(), + array(), + $headers + ); + + $content = $response->getContent(); + $members = json_decode($content); + $this->assertTrue(!is_null($members)); + $this->assertResponseStatus(200); + } } \ No newline at end of file diff --git a/update_doctrine.sh b/update_doctrine.sh index 5019b3f8..a1fe9a68 100755 --- a/update_doctrine.sh +++ b/update_doctrine.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +php composer.phar dump-autoload --optimize; php artisan doctrine:generate:proxies php artisan doctrine:clear:metadata:cache php artisan doctrine:clear:query:cache