diff --git a/src/VCS/Adapter.php b/src/VCS/Adapter.php index 1479fbe..43f8816 100644 --- a/src/VCS/Adapter.php +++ b/src/VCS/Adapter.php @@ -252,6 +252,15 @@ abstract public function getCommit(string $owner, string $repositoryName, string */ abstract public function getLatestCommit(string $owner, string $repositoryName, string $branch): array; + /** + * Check if user is a member of an organization + * + * @param string $username Username of the user + * @param string $organization Name of the organization + * @return bool True if user is a member of the organization, false otherwise + */ + abstract public function isUserMemberOfOrganization(string $username, string $organization): bool; + /** * Call * diff --git a/src/VCS/Adapter/Git/GitHub.php b/src/VCS/Adapter/Git/GitHub.php index fd78e23..94b986d 100644 --- a/src/VCS/Adapter/Git/GitHub.php +++ b/src/VCS/Adapter/Git/GitHub.php @@ -640,7 +640,14 @@ public function getEvent(string $event, string $payload): array $authorAvatarUrl = $payload['pull_request']['user']['avatar_url'] ?? ''; $commitHash = $payload['pull_request']['head']['sha'] ?? ''; $headCommitUrl = $repositoryUrl . "/commits/" . $commitHash; - $external = $payload['pull_request']['head']['user']['login'] !== $payload['pull_request']['base']['user']['login']; + + $authorUsername = $payload['pull_request']['user']['login'] ?? ($payload['pull_request']['head']['user']['login'] ?? ''); + $isOrgRepository = ($payload['repository']['owner']['type'] ?? '') === 'Organization'; + if ($isOrgRepository) { + $external = !$this->isUserMemberOfOrganization($authorUsername, $owner); + } else { + $external = $authorUsername !== $owner; + } return [ 'branch' => $branch, @@ -686,4 +693,11 @@ public function validateWebhookEvent(string $payload, string $signature, string { return $signature === ('sha256=' . hash_hmac('sha256', $payload, $signatureKey)); } + + public function isUserMemberOfOrganization(string $username, string $organization): bool + { + $url = "/orgs/{$organization}/memberships/{$username}"; + $response = $this->call(self::METHOD_GET, $url, ['Authorization' => "Bearer $this->accessToken"]); + return $response['headers']['status-code'] >= 200 && $response['headers']['status-code'] < 300; + } } diff --git a/tests/VCS/Adapter/GitHubTest.php b/tests/VCS/Adapter/GitHubTest.php index 6bf4057..3e2c540 100644 --- a/tests/VCS/Adapter/GitHubTest.php +++ b/tests/VCS/Adapter/GitHubTest.php @@ -340,4 +340,13 @@ public function testGetLatestCommit(): void $this->assertEquals('https://avatars.githubusercontent.com/u/43381712?v=4', $commitDetails['commitAuthorAvatar']); $this->assertEquals('https://github.com/vermakhushboo', $commitDetails['commitAuthorUrl']); } + + public function testIsUserMemberOfOrganization(): void + { + $isMember = $this->vcsAdapter->isUserMemberOfOrganization('vermakhushboo', 'test-kh'); + $this->assertTrue($isMember); + + $isNotMember = $this->vcsAdapter->isUserMemberOfOrganization('test-user', 'test-kh'); + $this->assertFalse($isNotMember); + } }