Skip to content

Commit d5a92d2

Browse files
authored
fix: firstReviewAt calculation (#77)
* fix: firstReviewAt calculation * fix: build
1 parent 5c95dcf commit d5a92d2

2 files changed

Lines changed: 49 additions & 34 deletions

File tree

apps/api/src/app/github/services/github-code-review.service.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
PullRequest,
1414
PullRequestTracking,
1515
} from "@prisma/client";
16-
import { parallel, pick } from "radash";
16+
import { parallel, pick, sort } from "radash";
1717
import {
1818
getReviewCompareTime,
1919
getTimeForReview,
@@ -23,6 +23,7 @@ import { parseNullableISO } from "../../../lib/date";
2323
import { ResourceNotFoundException } from "../../errors/exceptions/resource-not-found.exception";
2424
import { SweetQueue, addJob } from "../../../bull-mq/queues";
2525
import { findWorkspaceByGitInstallationId } from "../../workspaces/services/workspace.service";
26+
import { parseISO } from "date-fns";
2627

2728
interface Author {
2829
id: string;
@@ -102,9 +103,10 @@ export const syncCodeReviews = async (
102103

103104
await upsertCodeReviewRequests(pullRequest, reviewRequests);
104105
await upsertCodeReviews(pullRequest, reviews);
106+
105107
await updatePullRequestTracking(
106108
pullRequest,
107-
reviews,
109+
reviewEvents,
108110
parseNullableISO(firstReviewerRequestedAt)
109111
);
110112
await upsertActivityEvents(pullRequest, reviewEvents);
@@ -239,7 +241,12 @@ const fetchPullRequestReviews = async (
239241
const pullRequest = response.node;
240242
const { nodes, pageInfo } = pullRequest.reviews;
241243

242-
for (const review of nodes) {
244+
// Sort chronologically
245+
const sortedReviews: any[] = sort(nodes, (node) =>
246+
parseISO(node.submittedAt).getTime()
247+
);
248+
249+
for (const review of sortedReviews) {
243250
const authorHandle = review.author.login;
244251

245252
// Ignore self-reviews
@@ -424,12 +431,12 @@ const upsertCodeReviews = async (
424431

425432
const updatePullRequestTracking = async (
426433
pullRequest: PullRequest & { tracking: PullRequestTracking | null },
427-
reviews: ReviewData[],
434+
reviewEvents: ReviewDataWithId[],
428435
firstReviewerRequestedAt: Date | null
429436
) => {
430-
const firstReviewAt = parseNullableISO(reviews[0]?.createdAt);
437+
const firstReviewAt = parseNullableISO(reviewEvents[0]?.createdAt);
431438
const firstApprovalAt = parseNullableISO(
432-
reviews.find((review) => review.state === CodeReviewState.APPROVED)
439+
reviewEvents.find((review) => review.state === CodeReviewState.APPROVED)
433440
?.createdAt
434441
);
435442

apps/api/src/lib/logger.ts

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,71 +24,79 @@ const loggableFields = {
2424
pullRequest: ["id", "title", "number", "createdAt", "updatedAt"],
2525
};
2626

27-
export const logger = {
28-
info: (msg: string, obj?: object) => {
29-
const cleanObj = { ...(obj || {}) };
27+
const sanitize = (payload?: object) => {
28+
const sanitizedPayload = { ...(payload || {}) };
3029

31-
for (const key of Object.keys(cleanObj)) {
32-
if (
33-
loggableFields[key] &&
34-
typeof cleanObj[key] === "object" &&
35-
cleanObj[key] !== null
36-
) {
37-
cleanObj[key] = pick(cleanObj[key], loggableFields[key]);
38-
}
30+
for (const key of Object.keys(sanitizedPayload)) {
31+
if (
32+
loggableFields[key] &&
33+
typeof sanitizedPayload[key] === "object" &&
34+
sanitizedPayload[key] !== null
35+
) {
36+
sanitizedPayload[key] = pick(sanitizedPayload[key], loggableFields[key]);
3937
}
38+
}
39+
40+
return sanitizedPayload;
41+
};
4042

41-
pinoLogger.info(cleanObj, msg);
43+
export const logger = {
44+
info: (msg: string, payload?: object) => {
45+
const sanitizedPayload = sanitize(payload);
46+
47+
pinoLogger.info(sanitizedPayload, msg);
4248
addBreadcrumb({
4349
message: msg,
4450
category: "log",
4551
level: "info",
46-
data: obj,
52+
data: payload,
4753
});
4854
},
49-
warn: (msg: string, obj?: object) => {
50-
pinoLogger.warn(obj || {}, msg);
55+
warn: (msg: string, payload?: object) => {
56+
pinoLogger.warn(payload || {}, msg);
5157
addBreadcrumb({
5258
message: msg,
5359
category: "log",
5460
level: "warning",
55-
data: obj,
61+
data: payload,
5662
});
5763
},
58-
error: (msg: string, obj?: object) => {
59-
pinoLogger.error(obj || {}, msg);
64+
error: (msg: string, payload?: object) => {
65+
pinoLogger.error(payload || {}, msg);
6066
addBreadcrumb({
6167
message: msg,
6268
category: "log",
6369
level: "error",
64-
data: obj,
70+
data: payload,
6571
});
6672
},
67-
debug: (msg: string, obj?: object) => {
68-
pinoLogger.debug(obj || {}, msg);
73+
debug: (msg: string, payload?: object) => {
74+
const cleanObj = sanitize(payload);
75+
76+
pinoLogger.debug(cleanObj || {}, msg);
6977
addBreadcrumb({
7078
message: msg,
7179
category: "log",
7280
level: "debug",
73-
data: obj,
81+
data: payload,
7482
});
7583
},
76-
trace: (msg: string, obj?: object) => {
77-
pinoLogger.trace(obj || {}, msg);
84+
trace: (msg: string, payload?: object) => {
85+
pinoLogger.trace(payload || {}, msg);
7886
addBreadcrumb({
7987
message: msg,
8088
category: "log",
8189
level: "debug",
82-
data: obj,
90+
data: payload,
8391
});
8492
},
85-
fatal: (msg: string, obj?: object) => {
86-
pinoLogger.fatal(obj || {}, msg);
93+
fatal: (msg: string, payload?: object) => {
94+
pinoLogger.fatal(payload || {}, msg);
8795
addBreadcrumb({
8896
message: msg,
8997
category: "log",
9098
level: "fatal",
91-
data: obj,
99+
data: payload,
92100
});
93101
},
94102
};

0 commit comments

Comments
 (0)