Skip to content

Commit cd6aeb0

Browse files
committed
feat(engine): add pr closed handling
for now, it deletes the pr. look at added TODO to see the wanted behavior. but for now, this is good enough related to #177
1 parent 23ce94c commit cd6aeb0

File tree

7 files changed

+579
-3
lines changed

7 files changed

+579
-3
lines changed

server/src/abstracts/engine.abstract.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export enum AchievibitEventNames {
1313
PullRequestReviewCommentRemoved = 'PullRequestReviewCommentRemoved',
1414
PullRequestReviewCommentEdited = 'PullRequestReviewCommentEdited',
1515
PullRequestReviewSubmitted = 'PullRequestReviewSubmitted',
16-
PullRequestMerged = 'PullRequestMerged'
16+
PullRequestMerged = 'PullRequestMerged',
17+
PullRequestClosed = 'PullRequestClosed'
1718
}
1819

1920
export abstract class Engine<IEventPayload> {
@@ -175,4 +176,6 @@ export abstract class Engine<IEventPayload> {
175176
* @param eventData the event payload
176177
*/
177178
abstract handlePullRequestMerged(eventData: IEventPayload): Promise<void>;
179+
180+
abstract handlePullRequestClosed(eventData: IEventPayload): Promise<void>;
178181
}

server/src/api/webhook-event-manager/webhook-event-manager.service.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ export class WebhookEventManagerService {
9191
this.logger.debug('PullRequestMerged');
9292
await this.githubEngine.handlePullRequestMerged(eventData);
9393
return eventName;
94+
case AchievibitEventNames.PullRequestClosed:
95+
this.logger.debug('PullRequestClosed');
96+
await this.githubEngine.handlePullRequestClosed(eventData);
97+
return eventName;
9498
}
9599
}
96100

@@ -179,6 +183,12 @@ export class WebhookEventManagerService {
179183
return AchievibitEventNames.PullRequestMerged;
180184
}
181185

186+
if (isEqual(eventName, 'pull_request') &&
187+
isEqual(eventData.action, 'closed') &&
188+
!eventData.pull_request.merged) {
189+
return AchievibitEventNames.PullRequestClosed;
190+
}
191+
182192
return;
183193
}
184194
}

server/src/dev-tools/captured-events/pull-request-closed.event.ts

Lines changed: 487 additions & 0 deletions
Large diffs are not rendered by default.

server/src/dev-tools/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export * from './dto.mock-generator';
77
export * from './in-memory-database.module';
88
export * from './captured-events/pull-request-assignee-added.event';
99
export * from './captured-events/pull-request-assignee-removed.event';
10+
export * from './captured-events/pull-request-closed.event';
1011
export * from './captured-events/pull-request-created-organization.event';
1112
export * from './captured-events/pull-request-created.event';
1213
export * from './captured-events/pull-request-edited.event';

server/src/engines/github.engine.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,33 @@ export class GithubEngine extends Engine<IGithubPullRequestEvent> {
301301
throw new Error('Method not implemented.');
302302
}
303303

304+
async handlePullRequestClosed(
305+
eventData: IGithubPullRequestEvent
306+
): Promise<void> {
307+
const {
308+
githubCreator,
309+
githubOwner,
310+
githubPR
311+
} = this.extractGithubEntities(eventData);
312+
const pr = this.extractPullRequest(
313+
githubPR,
314+
this.extractUser(githubCreator),
315+
this.extractRepo(eventData.repository),
316+
this.extractUser(githubOwner)
317+
);
318+
319+
/**
320+
* TODO@Thatkookooguy: #340 Combine PR deletion to a single task
321+
* This should later just flag the PR as closed\merged and should
322+
* be dealt with in the task that runs at the start of the week.
323+
* This way, we can just make the task also delete closed or merged prs
324+
* but give achievements for some actions we want to allow before deleting
325+
* all the data. Something like commiting to a branch with a closed pr
326+
* or re-opening a pr.
327+
*/
328+
await this.pullRequestsService.deleteAsync({ prid: pr.prid });
329+
}
330+
304331
private extractGithubEntities(eventData: IGithubPullRequestEvent) {
305332
return {
306333
githubPR: eventData.pull_request,

server/test/__snapshots__/github-events.e2e-spec.ts.snap

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,35 @@ Array [
114114
]
115115
`;
116116

117+
exports[`AppController (e2e) pr events / (POST) github pull request closed 1`] = `"PullRequestClosed"`;
118+
119+
exports[`AppController (e2e) pr events / (POST) github pull request closed 2`] = `
120+
Array [
121+
Object {
122+
"achievements": Array [],
123+
"avatar": "https://avatars3.githubusercontent.com/u/10427304?v=4",
124+
"organization": false,
125+
"organizations": Array [],
126+
"repos": Array [],
127+
"url": "https://github.com/Thatkookooguy",
128+
"username": "Thatkookooguy",
129+
"users": Array [],
130+
},
131+
]
132+
`;
133+
134+
exports[`AppController (e2e) pr events / (POST) github pull request closed 3`] = `
135+
Array [
136+
Object {
137+
"fullname": "Thatkookooguy/test-new-achievibit-events",
138+
"name": "test-new-achievibit-events",
139+
"url": "https://github.com/Thatkookooguy/test-new-achievibit-events",
140+
},
141+
]
142+
`;
143+
144+
exports[`AppController (e2e) pr events / (POST) github pull request closed 4`] = `Array []`;
145+
117146
exports[`AppController (e2e) pr events / (POST) github pull request created event should create user 1`] = `"PullRequestOpened"`;
118147

119148
exports[`AppController (e2e) pr events / (POST) github pull request created event should create user 2`] = `

server/test/github-events.e2e-spec.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ConfigService } from '@kb-config';
99
import {
1010
pullRequestAssigneeAddedEvent,
1111
pullRequestAssigneeRemovedEvent,
12+
pullRequestClosedEvent,
1213
pullRequestCreatedEvent,
1314
pullRequestEditedEvent,
1415
pullRequestLabelAddedEvent,
@@ -372,8 +373,26 @@ describe('AppController (e2e)', () => {
372373
await confirmPrDataCreated();
373374
});
374375

375-
test.todo('review comment added');
376-
test.todo('review comment removed');
376+
test('/ (POST) github pull request closed', async () => {
377+
const server = app.getHttpServer();
378+
await request(server)
379+
.post('/api/webhook-event-manager')
380+
.set('Accept', 'application/json')
381+
.set('x-github-event', pullRequestCreatedEvent.event)
382+
.send(pullRequestCreatedEvent.payload)
383+
.expect(201);
384+
const sendWebhookResponse = await request(server)
385+
.post('/api/webhook-event-manager')
386+
.set('Accept', 'application/json')
387+
.set('x-github-event',
388+
pullRequestClosedEvent.event)
389+
.send(pullRequestClosedEvent.payload)
390+
.expect(201);
391+
392+
expect(sendWebhookResponse.text).toMatchSnapshot();
393+
394+
await confirmPrDataCreated();
395+
});
377396

378397
async function confirmPrDataCreated() {
379398
const server = app.getHttpServer();

0 commit comments

Comments
 (0)