Skip to content

Commit 11c37d3

Browse files
committed
fix: Check org membership to determine external PR
1 parent 0e665ea commit 11c37d3

3 files changed

Lines changed: 25 additions & 1 deletion

File tree

src/VCS/Adapter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ abstract public function getCommit(string $owner, string $repositoryName, string
252252
*/
253253
abstract public function getLatestCommit(string $owner, string $repositoryName, string $branch): array;
254254

255+
abstract public function isUserMemberOfOrganization(string $username, string $organization): bool;
256+
255257
/**
256258
* Call
257259
*

src/VCS/Adapter/Git/GitHub.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,13 @@ public function getEvent(string $event, string $payload): array
640640
$authorAvatarUrl = $payload['pull_request']['user']['avatar_url'] ?? '';
641641
$commitHash = $payload['pull_request']['head']['sha'] ?? '';
642642
$headCommitUrl = $repositoryUrl . "/commits/" . $commitHash;
643-
$external = $payload['pull_request']['head']['user']['login'] !== $payload['pull_request']['base']['user']['login'];
643+
644+
$isOrgRepository = ($payload['repository']['owner']['type'] ?? '') === 'Organization';
645+
if ($isOrgRepository) {
646+
$external = !$this->isUserMemberOfOrganization($owner, $owner);
647+
} else {
648+
$external = $payload['pull_request']['head']['user']['login'] !== $payload['repository']['owner']['login'];
649+
}
644650

645651
return [
646652
'branch' => $branch,
@@ -686,4 +692,11 @@ public function validateWebhookEvent(string $payload, string $signature, string
686692
{
687693
return $signature === ('sha256=' . hash_hmac('sha256', $payload, $signatureKey));
688694
}
695+
696+
public function isUserMemberOfOrganization(string $username, string $organization): bool
697+
{
698+
$url = "/orgs/{$organization}/memberships/{$username}";
699+
$response = $this->call(self::METHOD_GET, $url, ['Authorization' => "Bearer $this->accessToken"]);
700+
return $response['headers']['status-code'] >= 200 && $response['headers']['status-code'] < 300;
701+
}
689702
}

tests/VCS/Adapter/GitHubTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,13 @@ public function testGetLatestCommit(): void
340340
$this->assertEquals('https://avatars.githubusercontent.com/u/43381712?v=4', $commitDetails['commitAuthorAvatar']);
341341
$this->assertEquals('https://github.com/vermakhushboo', $commitDetails['commitAuthorUrl']);
342342
}
343+
344+
public function testIsUserMemberOfOrganization(): void
345+
{
346+
$isMember = $this->vcsAdapter->isUserMemberOfOrganization('hmacr', 'test-org-hmacr');
347+
$this->assertTrue($isMember);
348+
349+
$isNotMember = $this->vcsAdapter->isUserMemberOfOrganization('test-user', 'test-org-hmacr');
350+
$this->assertFalse($isNotMember);
351+
}
343352
}

0 commit comments

Comments
 (0)