Skip to content

Commit

Permalink
feat: composite discussion
Browse files Browse the repository at this point in the history
  • Loading branch information
bytemain committed Jan 31, 2024
1 parent 11af51f commit 704c906
Show file tree
Hide file tree
Showing 22 changed files with 577 additions and 99 deletions.
36 changes: 33 additions & 3 deletions scripts/extract-webhook-example.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,18 @@ for (const webhook of WEBHOOKS) {
v.action === 'opened' ||
v.action === 'closed'
) {
writeFile(`pull_request_${i}_${v.action}`, v);
writeFile(`pull_request_${v.pull_request.number}_${i}_${v.action}`, v);
}
});
}
if (webhook.name === 'pull_request_review') {
const pull_request_review =
webhook as WebhookDefinition<'pull_request_review'>;
pull_request_review.examples.forEach((v, i) => {
writeFile(`pull_request_review_${i}_${v.action}_${v.review.state}`, v);
writeFile(
`pull_request_review_${v.pull_request.number}_${i}_${v.action}_${v.review.state}`,
v,
);
});
}
if (webhook.name === 'pull_request_review_comment') {
Expand All @@ -42,8 +45,35 @@ for (const webhook of WEBHOOKS) {
v.action === 'created' ||
v.action === 'deleted'
) {
writeFile(`pull_request_review_comment_${i}_${v.action}`, v);
writeFile(
`pull_request_${v.pull_request.number}_review_comment_${i}_${v.action}`,
v,
);
}
});
}
if (webhook.name === 'discussion') {
const discussion = webhook as WebhookDefinition<'discussion'>;
discussion.examples.forEach((v, i) => {
if (v.discussion.number !== 90) {
return;
}
writeFile(`discussion_${v.discussion.number}_${i}_${v.action}`, v);
});
}

if (webhook.name === 'discussion_comment') {
const discussion_comment =
webhook as WebhookDefinition<'discussion_comment'>;
discussion_comment.examples.forEach((v, i) => {
if (v.discussion.number !== 90) {
return;
}

writeFile(
`discussion_comment_${v.discussion.number}_${i}_${v.action}`,
v,
);
});
}
}
139 changes: 71 additions & 68 deletions src/queue/worker/github.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,24 @@ import { IGitHubEventQueueMessage } from '../types';

import { BaseWorker } from '.';

export function createUniqueMessageId(data: {
repository: {
full_name: string;
};
pull_request?: {
number: number;
};
sender: {
login: string;
};
}) {
return `${data.repository.full_name}#${data?.pull_request?.number}#${data?.sender?.login}`;
export function createUniqueMessageId(
data: {
repository: {
full_name: string;
};
pull_request?: {
number: number;
};
discussion?: {
number: number;
};
sender: {
login: string;
};
},
prefix = '',
) {
return `${prefix}#${data?.repository?.full_name}#${data?.pull_request?.number}#${data?.discussion?.number}#${data?.sender?.login}`;
}

export class GitHubEventWorker extends BaseWorker<IGitHubEventQueueMessage> {
Expand All @@ -36,6 +42,11 @@ export class GitHubEventWorker extends BaseWorker<IGitHubEventQueueMessage> {
super();
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
onBatchDoneForTest(results: IResult[]) {
// do nothing
}

async run() {
const byId = groupBy(this.queue, (v) => v.body.botId);

Expand Down Expand Up @@ -100,66 +111,56 @@ export class GitHubEventWorker extends BaseWorker<IGitHubEventQueueMessage> {
return;
}

const results = [] as {
eventName: string;
markdown: MarkdownContent;
}[];
const prReviewResults = new DefaultMap<
string,
PullRequestReviewComposite
>(() => new PullRequestReviewComposite());
const results = [] as IResult[];
const multiViewResults = new DefaultMap<string, EventComposite>(
(key) => new EventComposite(key),
);

setupWebhooksTemplate(
hooks,
{ setting },
async ({ markdown, eventName, payload }) => {
const result = { eventName, markdown };
if (eventName.startsWith('pull_request_review.')) {
const key = createUniqueMessageId(payload);
prReviewResults.get(key).addPullRequestReview(result);
const key = createUniqueMessageId(payload, 'pr_review');
multiViewResults.get(key).setMainView(result);
} else if (eventName.startsWith('pull_request_review_comment.')) {
const key = createUniqueMessageId(payload);
prReviewResults.get(key).addPullRequestReviewComment(result);
const key = createUniqueMessageId(payload, 'pr_review');
multiViewResults.get(key).addSubView(result);
} else if (eventName.startsWith('discussion.')) {
const key = createUniqueMessageId(payload, 'discussion');
multiViewResults.get(key).setMainView(result);
} else if (eventName.startsWith('discussion_comment.')) {
const key = createUniqueMessageId(payload, 'discussion');
multiViewResults.get(key).addSubView(result);
} else {
results.push(result);
}
},
);

const byEvent = groupBy(messages, (v) => v.body.data.name) as Record<
EmitterWebhookEventName,
Message<IGitHubEventQueueMessage>[]
>;

await Promise.allSettled(
Object.entries(byEvent)
.map(([_, messages]) => {
return messages.map(async (message) => {
try {
const { data } = message.body;
await hooks.receive({
id: data.id,
name: data.name as any,
payload: data.payload,
});
message.ack();
} catch (error) {
console.error('github app worker error', error);
message.retry();
}
messages.map(async (message) => {
try {
const { data } = message.body;
await hooks.receive({
id: data.id,
name: data.name as any,
payload: data.payload,
});
})
.flat(),
message.ack();
} catch (error) {
console.error('github app worker error', error);
message.retry();
}
}),
);

prReviewResults.forEach((v) => {
multiViewResults.forEach((v) => {
results.push(...v.toResult());
});

console.log(
`🚀 ~ GitHubEventWorker ~ prReviewResults.forEach ~ results:`,
results,
);
this.onBatchDoneForTest(results);

await Promise.allSettled(
results.map(({ markdown, eventName }) =>
Expand All @@ -177,42 +178,44 @@ export class GitHubEventWorker extends BaseWorker<IGitHubEventQueueMessage> {
}
}

class PullRequestReviewComposite {
reviewData!: IResult;
commentData: IResult[] = [];
class EventComposite {
mainView!: IResult;
subView: IResult[] = [];

constructor(public key: string) {}

addPullRequestReview(data: IResult) {
this.reviewData = data;
setMainView(data: IResult) {
this.mainView = data;
}

addPullRequestReviewComment(data: IResult) {
this.commentData.push(data);
addSubView(data: IResult) {
this.subView.push(data);
}

toResult() {
const { reviewData, commentData } = this;
const { mainView, subView } = this;

const chunked = chunk(commentData, 5);
const chunked = chunk(subView, 5);
const result = [] as IResult[];

chunked.forEach((v, i) => {
let title = '';
let eventName = '';
let text = v.map((d) => d.markdown.text).join('\n\n');

if (i === 0 && reviewData) {
title = reviewData.markdown.title;
eventName = reviewData.eventName;
text = reviewData.markdown.text + '\n\n' + text;
} else if (commentData.length > 0) {
title = commentData[0].markdown.title;
eventName = commentData[0].eventName;
if (i === 0 && mainView) {
title = mainView.markdown.title;
eventName = mainView.eventName;
text = mainView.markdown.text + '\n\n' + text;
} else if (subView.length > 0) {
title = subView[0].markdown.title;
eventName = subView[0].eventName;
}

result.push({
eventName,
markdown: {
title: `${title} (${i + 1}/${chunked.length})`,
title,
text,
},
});
Expand Down
Loading

0 comments on commit 704c906

Please sign in to comment.