github-issue-tower-defence-management 1.39.0 → 1.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/create-pr.yml +12 -5
- package/CHANGELOG.md +13 -0
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +206 -6
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +111 -16
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +324 -8
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +982 -167
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +177 -26
- package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +3 -4
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +3 -4
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +5 -1
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +2 -3
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
IssueRepository,
|
|
3
|
+
RelatedPullRequest,
|
|
4
|
+
} from './adapter-interfaces/IssueRepository';
|
|
2
5
|
import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
|
|
3
6
|
import { IssueCommentRepository } from './adapter-interfaces/IssueCommentRepository';
|
|
4
7
|
import { WebhookRepository } from './adapter-interfaces/WebhookRepository';
|
|
@@ -23,6 +26,7 @@ export class IllegalIssueStatusError extends Error {
|
|
|
23
26
|
}
|
|
24
27
|
type RejectedReasonType =
|
|
25
28
|
| 'NO_REPORT_FROM_AGENT_BOT'
|
|
29
|
+
| 'REPORT_HAS_NEXT_STEP'
|
|
26
30
|
| 'PULL_REQUEST_NOT_FOUND'
|
|
27
31
|
| 'MULTIPLE_PULL_REQUESTS_FOUND'
|
|
28
32
|
| 'PULL_REQUEST_CONFLICTED'
|
|
@@ -38,7 +42,12 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
38
42
|
>,
|
|
39
43
|
private readonly issueRepository: Pick<
|
|
40
44
|
IssueRepository,
|
|
41
|
-
|
|
45
|
+
| 'get'
|
|
46
|
+
| 'update'
|
|
47
|
+
| 'updateNextActionDate'
|
|
48
|
+
| 'findRelatedOpenPRs'
|
|
49
|
+
| 'getStoryObjectMap'
|
|
50
|
+
| 'getOpenPullRequest'
|
|
42
51
|
>,
|
|
43
52
|
private readonly issueCommentRepository: Pick<
|
|
44
53
|
IssueCommentRepository,
|
|
@@ -84,9 +93,61 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
84
93
|
params.preparationStatus,
|
|
85
94
|
);
|
|
86
95
|
}
|
|
96
|
+
|
|
97
|
+
if (issue.dependedIssueUrls.length === 0) {
|
|
98
|
+
try {
|
|
99
|
+
const storyObjectMap =
|
|
100
|
+
await this.issueRepository.getStoryObjectMap(project);
|
|
101
|
+
for (const storyObject of storyObjectMap.values()) {
|
|
102
|
+
const towerDefenceIssue = storyObject.issues.find(
|
|
103
|
+
(i) => i.url === issue.url,
|
|
104
|
+
);
|
|
105
|
+
if (towerDefenceIssue) {
|
|
106
|
+
issue.dependedIssueUrls = towerDefenceIssue.dependedIssueUrls;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.warn(
|
|
112
|
+
'Failed to enrich dependedIssueUrls from story object map:',
|
|
113
|
+
error,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (issue.dependedIssueUrls.length > 0) {
|
|
119
|
+
issue.status = params.awaitingWorkspaceStatus;
|
|
120
|
+
await this.issueRepository.update(issue, project);
|
|
121
|
+
await this.issueCommentRepository.createComment(
|
|
122
|
+
issue,
|
|
123
|
+
`Issue has dependent issue URLs: ${issue.dependedIssueUrls.join(', ')}`,
|
|
124
|
+
);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (issue.nextActionDate !== null || issue.nextActionHour !== null) {
|
|
129
|
+
issue.status = params.awaitingWorkspaceStatus;
|
|
130
|
+
await this.issueRepository.update(issue, project);
|
|
131
|
+
await this.issueCommentRepository.createComment(
|
|
132
|
+
issue,
|
|
133
|
+
`Issue has next action date or hour set: nextActionDate=${issue.nextActionDate?.toISOString() ?? 'null'}, nextActionHour=${issue.nextActionHour ?? 'null'}`,
|
|
134
|
+
);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
87
138
|
const comments =
|
|
88
139
|
await this.issueCommentRepository.getCommentsFromIssue(issue);
|
|
89
140
|
|
|
141
|
+
const { rejections, approvedPrUrl } = await this.collectRejections(
|
|
142
|
+
issue,
|
|
143
|
+
comments,
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const rejectionStatusMessage =
|
|
147
|
+
rejections.length > 0
|
|
148
|
+
? `Auto Status Check: REJECTED\n${rejections.map((r) => `- ${r.detail}`).join('\n')}`
|
|
149
|
+
: 'Auto Status Check: APPROVED';
|
|
150
|
+
|
|
90
151
|
const lastTargetComments = comments.slice(
|
|
91
152
|
-params.thresholdForAutoReject * 2,
|
|
92
153
|
);
|
|
@@ -95,15 +156,38 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
95
156
|
comment.content.startsWith('Auto Status Check: REJECTED'),
|
|
96
157
|
).length >= params.thresholdForAutoReject &&
|
|
97
158
|
!lastTargetComments.some((comment) =>
|
|
98
|
-
comment.content
|
|
159
|
+
comment.content
|
|
160
|
+
.toLowerCase()
|
|
161
|
+
.includes('failed to pass the check automatically'),
|
|
99
162
|
)
|
|
100
163
|
) {
|
|
101
164
|
issue.status = params.awaitingQualityCheckStatus;
|
|
102
165
|
await this.issueRepository.update(issue, project);
|
|
166
|
+
const escalationStatusLine =
|
|
167
|
+
rejections.length > 0
|
|
168
|
+
? rejectionStatusMessage
|
|
169
|
+
: 'Auto Status Check: APPROVED (escalated due to prior failures)';
|
|
170
|
+
if (rejections.length === 0 && approvedPrUrl !== null) {
|
|
171
|
+
await this.setPrNextActionDate(approvedPrUrl, project);
|
|
172
|
+
}
|
|
103
173
|
await this.issueCommentRepository.createComment(
|
|
104
174
|
issue,
|
|
105
|
-
|
|
175
|
+
`${escalationStatusLine}\n\nFailed to pass the check automatically for ${params.thresholdForAutoReject} times`,
|
|
176
|
+
);
|
|
177
|
+
await this.sendWorkflowBlockerNotification(
|
|
178
|
+
params.issueUrl,
|
|
179
|
+
params.workflowBlockerResolvedWebhookUrl,
|
|
180
|
+
project,
|
|
106
181
|
);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (rejections.length <= 0) {
|
|
186
|
+
issue.status = params.awaitingQualityCheckStatus;
|
|
187
|
+
await this.issueRepository.update(issue, project);
|
|
188
|
+
if (approvedPrUrl !== null) {
|
|
189
|
+
await this.setPrNextActionDate(approvedPrUrl, project);
|
|
190
|
+
}
|
|
107
191
|
await this.sendWorkflowBlockerNotification(
|
|
108
192
|
params.issueUrl,
|
|
109
193
|
params.workflowBlockerResolvedWebhookUrl,
|
|
@@ -112,34 +196,63 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
112
196
|
return;
|
|
113
197
|
}
|
|
114
198
|
|
|
199
|
+
issue.status = params.awaitingWorkspaceStatus;
|
|
200
|
+
await this.issueRepository.update(issue, project);
|
|
201
|
+
|
|
202
|
+
await this.issueCommentRepository.createComment(
|
|
203
|
+
issue,
|
|
204
|
+
rejectionStatusMessage,
|
|
205
|
+
);
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
private collectRejections = async (
|
|
209
|
+
issue: { url: string; labels: string[]; isPr: boolean },
|
|
210
|
+
comments: { content: string }[],
|
|
211
|
+
): Promise<{
|
|
212
|
+
rejections: { type: RejectedReasonType; detail: string }[];
|
|
213
|
+
approvedPrUrl: string | null;
|
|
214
|
+
}> => {
|
|
115
215
|
const rejections: { type: RejectedReasonType; detail: string }[] = [];
|
|
216
|
+
let approvedPrUrl: string | null = null;
|
|
116
217
|
const lastComment = comments[comments.length - 1];
|
|
117
218
|
if (!lastComment || !lastComment.content.startsWith('From:')) {
|
|
118
219
|
rejections.push({
|
|
119
220
|
type: 'NO_REPORT_FROM_AGENT_BOT',
|
|
120
221
|
detail: 'NO_REPORT_FROM_AGENT_BOT',
|
|
121
222
|
});
|
|
223
|
+
} else if (this.reportBodyHasNextStep(lastComment.content)) {
|
|
224
|
+
rejections.push({
|
|
225
|
+
type: 'REPORT_HAS_NEXT_STEP',
|
|
226
|
+
detail: 'REPORT_HAS_NEXT_STEP',
|
|
227
|
+
});
|
|
122
228
|
}
|
|
123
229
|
|
|
124
230
|
const categoryLabels = issue.labels.filter((label) =>
|
|
125
231
|
label.startsWith('category:'),
|
|
126
232
|
);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
233
|
+
const hasLlmAgentLabel = issue.labels.some(
|
|
234
|
+
(l) => l === 'llm-agent' || l.startsWith('llm-agent:'),
|
|
235
|
+
);
|
|
236
|
+
if (
|
|
237
|
+
!hasLlmAgentLabel &&
|
|
238
|
+
(categoryLabels.length <= 0 || categoryLabels.includes('category:e2e'))
|
|
239
|
+
) {
|
|
240
|
+
const prsToCheck = issue.isPr
|
|
241
|
+
? await this.resolveOpenPrsForPrItem(issue.url)
|
|
242
|
+
: await this.issueRepository.findRelatedOpenPRs(issue.url);
|
|
243
|
+
|
|
244
|
+
if (prsToCheck.length <= 0) {
|
|
132
245
|
rejections.push({
|
|
133
246
|
type: 'PULL_REQUEST_NOT_FOUND',
|
|
134
247
|
detail: 'PULL_REQUEST_NOT_FOUND',
|
|
135
248
|
});
|
|
136
|
-
} else if (
|
|
249
|
+
} else if (prsToCheck.length > 1) {
|
|
137
250
|
rejections.push({
|
|
138
251
|
type: 'MULTIPLE_PULL_REQUESTS_FOUND',
|
|
139
|
-
detail: `MULTIPLE_PULL_REQUESTS_FOUND: ${
|
|
252
|
+
detail: `MULTIPLE_PULL_REQUESTS_FOUND: ${prsToCheck.map((pr) => pr.url).join(', ')}`,
|
|
140
253
|
});
|
|
141
254
|
} else {
|
|
142
|
-
const pr =
|
|
255
|
+
const pr = prsToCheck[0];
|
|
143
256
|
if (pr.isConflicted) {
|
|
144
257
|
rejections.push({
|
|
145
258
|
type: 'PULL_REQUEST_CONFLICTED',
|
|
@@ -170,26 +283,64 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
170
283
|
detail: `ANY_REVIEW_COMMENT_NOT_RESOLVED: ${pr.url}`,
|
|
171
284
|
});
|
|
172
285
|
}
|
|
286
|
+
if (
|
|
287
|
+
!pr.isConflicted &&
|
|
288
|
+
pr.isPassedAllCiJob &&
|
|
289
|
+
pr.isResolvedAllReviewComments
|
|
290
|
+
) {
|
|
291
|
+
approvedPrUrl = pr.url;
|
|
292
|
+
}
|
|
173
293
|
}
|
|
174
294
|
}
|
|
175
295
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return;
|
|
296
|
+
return { rejections, approvedPrUrl };
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
private resolveOpenPrsForPrItem = async (
|
|
300
|
+
prUrl: string,
|
|
301
|
+
): Promise<RelatedPullRequest[]> => {
|
|
302
|
+
const pr = await this.issueRepository.getOpenPullRequest(prUrl);
|
|
303
|
+
if (pr === null) {
|
|
304
|
+
return [];
|
|
185
305
|
}
|
|
306
|
+
return [pr];
|
|
307
|
+
};
|
|
186
308
|
|
|
187
|
-
|
|
188
|
-
|
|
309
|
+
private reportBodyHasNextStep = (body: string): boolean => {
|
|
310
|
+
const reportMatch = body.match(/```json\n([\s\S]*?)\n```/);
|
|
311
|
+
if (!reportMatch || reportMatch.length < 2) {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
let reportJson: unknown;
|
|
315
|
+
try {
|
|
316
|
+
reportJson = JSON.parse(reportMatch[1]);
|
|
317
|
+
} catch (error) {
|
|
318
|
+
console.warn(
|
|
319
|
+
'Invalid JSON in report body while checking nextStep:',
|
|
320
|
+
error,
|
|
321
|
+
);
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
if (typeof reportJson !== 'object' || reportJson === null) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
if (!('nextStep' in reportJson)) {
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
const nextStepValue = Reflect.get(reportJson, 'nextStep');
|
|
331
|
+
return nextStepValue !== null && nextStepValue !== undefined;
|
|
332
|
+
};
|
|
189
333
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
334
|
+
private setPrNextActionDate = async (
|
|
335
|
+
prUrl: string,
|
|
336
|
+
project: Parameters<IssueRepository['get']>[1],
|
|
337
|
+
): Promise<void> => {
|
|
338
|
+
const nextActionDate = new Date();
|
|
339
|
+
nextActionDate.setMonth(nextActionDate.getMonth() + 1);
|
|
340
|
+
await this.issueRepository.updateNextActionDate(
|
|
341
|
+
prUrl,
|
|
342
|
+
project,
|
|
343
|
+
nextActionDate,
|
|
193
344
|
);
|
|
194
345
|
};
|
|
195
346
|
|
|
@@ -29,12 +29,11 @@ export interface IssueRepository {
|
|
|
29
29
|
) => Promise<number>;
|
|
30
30
|
updateIssue: (issue: Issue) => Promise<void>;
|
|
31
31
|
updateNextActionDate: (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
},
|
|
35
|
-
issue: Issue,
|
|
32
|
+
issueUrl: string,
|
|
33
|
+
project: Project,
|
|
36
34
|
date: Date,
|
|
37
35
|
) => Promise<void>;
|
|
36
|
+
getOpenPullRequest: (prUrl: string) => Promise<RelatedPullRequest | null>;
|
|
38
37
|
updateNextActionHour: (
|
|
39
38
|
project: Project & {
|
|
40
39
|
nextActionHour: NonNullable<Project['nextActionHour']>;
|
|
@@ -32,9 +32,8 @@ export declare class ApiV3CheerioRestIssueRepository extends BaseGitHubRepositor
|
|
|
32
32
|
createNewIssue: (org: string, repo: string, title: string, body: string, assignees: string[], labels: string[]) => Promise<number>;
|
|
33
33
|
updateIssue: (issue: Issue) => Promise<void>;
|
|
34
34
|
getIssueByUrl: (url: string) => Promise<Issue | null>;
|
|
35
|
-
updateNextActionDate: (project: Project
|
|
36
|
-
|
|
37
|
-
}, issue: Issue, date: Date) => Promise<void>;
|
|
35
|
+
updateNextActionDate: (issueUrl: string, project: Project, date: Date) => Promise<void>;
|
|
36
|
+
getOpenPullRequest: (prUrl: string) => Promise<RelatedPullRequest | null>;
|
|
38
37
|
updateNextActionHour: (project: Project & {
|
|
39
38
|
nextActionHour: NonNullable<Project["nextActionHour"]>;
|
|
40
39
|
}, issue: Issue, hour: number) => Promise<void>;
|
|
@@ -49,7 +48,7 @@ export declare class ApiV3CheerioRestIssueRepository extends BaseGitHubRepositor
|
|
|
49
48
|
updateAssigneeList: (issue: Issue, assigneeList: Member["name"][]) => Promise<void>;
|
|
50
49
|
get: (_issueUrl: string, _project: Project) => Promise<Issue | null>;
|
|
51
50
|
update: (issue: Issue, _project: Project) => Promise<void>;
|
|
52
|
-
findRelatedOpenPRs: (
|
|
51
|
+
findRelatedOpenPRs: (issueUrl: string) => Promise<RelatedPullRequest[]>;
|
|
53
52
|
getAllOpened: (_project: Project) => Promise<Issue[]>;
|
|
54
53
|
getStoryObjectMap: (_project: Project) => Promise<StoryObjectMap>;
|
|
55
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiV3CheerioRestIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EACnB,MAAM,6DAA6D,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,4BAA4B,EAC5B,WAAW,EACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiV3CheerioRestIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export declare class NotifyFinishedIssuePreparationUseCase {
|
|
|
13
13
|
private readonly issueRepository;
|
|
14
14
|
private readonly issueCommentRepository;
|
|
15
15
|
private readonly webhookRepository;
|
|
16
|
-
constructor(projectRepository: Pick<ProjectRepository, 'getByUrl' | 'prepareStatus'>, issueRepository: Pick<IssueRepository, 'get' | 'update' | 'findRelatedOpenPRs' | 'getStoryObjectMap'>, issueCommentRepository: Pick<IssueCommentRepository, 'getCommentsFromIssue' | 'createComment'>, webhookRepository: Pick<WebhookRepository, 'sendGetRequest'>);
|
|
16
|
+
constructor(projectRepository: Pick<ProjectRepository, 'getByUrl' | 'prepareStatus'>, issueRepository: Pick<IssueRepository, 'get' | 'update' | 'updateNextActionDate' | 'findRelatedOpenPRs' | 'getStoryObjectMap' | 'getOpenPullRequest'>, issueCommentRepository: Pick<IssueCommentRepository, 'getCommentsFromIssue' | 'createComment'>, webhookRepository: Pick<WebhookRepository, 'sendGetRequest'>);
|
|
17
17
|
run: (params: {
|
|
18
18
|
projectUrl: string;
|
|
19
19
|
issueUrl: string;
|
|
@@ -23,6 +23,10 @@ export declare class NotifyFinishedIssuePreparationUseCase {
|
|
|
23
23
|
thresholdForAutoReject: number;
|
|
24
24
|
workflowBlockerResolvedWebhookUrl: string | null;
|
|
25
25
|
}) => Promise<void>;
|
|
26
|
+
private collectRejections;
|
|
27
|
+
private resolveOpenPrsForPrItem;
|
|
28
|
+
private reportBodyHasNextStep;
|
|
29
|
+
private setPrNextActionDate;
|
|
26
30
|
private sendWorkflowBlockerNotification;
|
|
27
31
|
}
|
|
28
32
|
//# sourceMappingURL=NotifyFinishedIssuePreparationUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,QAAQ,EAAE,MAAM;CAI7B;AACD,qBAAa,uBAAwB,SAAQ,KAAK;gBAE9C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,cAAc,EAAE,MAAM,GAAG,IAAI;CAOhC;AAWD,qBAAa,qCAAqC;IAE9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAShC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAIvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAjBjB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,UAAU,GAAG,eAAe,CAC7B,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,KAAK,GACL,QAAQ,GACR,sBAAsB,GACtB,oBAAoB,GACpB,mBAAmB,GACnB,oBAAoB,CACvB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,sBAAsB,GAAG,eAAe,CACzC,EACgB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,gBAAgB,CACjB;IAGH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,uBAAuB,EAAE,MAAM,CAAC;QAChC,0BAA0B,EAAE,MAAM,CAAC;QACnC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,iCAAiC,EAAE,MAAM,GAAG,IAAI,CAAC;KAClD,KAAG,OAAO,CAAC,IAAI,CAAC,CAwIf;IAEF,OAAO,CAAC,iBAAiB,CAyFvB;IAEF,OAAO,CAAC,uBAAuB,CAQ7B;IAEF,OAAO,CAAC,qBAAqB,CAuB3B;IAEF,OAAO,CAAC,mBAAmB,CAWzB;IAEF,OAAO,CAAC,+BAA+B,CAgCrC;CACH"}
|
|
@@ -19,9 +19,8 @@ export interface IssueRepository {
|
|
|
19
19
|
getIssueByUrl: (url: string) => Promise<Issue | null>;
|
|
20
20
|
createNewIssue: (org: string, repo: string, title: string, body: string, assignees: Member['name'][], labels: Label[]) => Promise<number>;
|
|
21
21
|
updateIssue: (issue: Issue) => Promise<void>;
|
|
22
|
-
updateNextActionDate: (project: Project
|
|
23
|
-
|
|
24
|
-
}, issue: Issue, date: Date) => Promise<void>;
|
|
22
|
+
updateNextActionDate: (issueUrl: string, project: Project, date: Date) => Promise<void>;
|
|
23
|
+
getOpenPullRequest: (prUrl: string) => Promise<RelatedPullRequest | null>;
|
|
25
24
|
updateNextActionHour: (project: Project & {
|
|
26
25
|
nextActionHour: NonNullable<Project['nextActionHour']>;
|
|
27
26
|
}, issue: Issue, hour: number) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/IssueRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2BAA2B,EAAE,OAAO,CAAC;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,yBAAyB,EAAE,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,CACZ,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,EACxB,iBAAiB,EAAE,MAAM,KACtB,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACtD,cAAc,EAAE,CACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAC3B,MAAM,EAAE,KAAK,EAAE,KACZ,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,oBAAoB,EAAE,CACpB,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"IssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/IssueRepository.ts"],"names":[],"mappings":"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"}
|