github-issue-tower-defence-management 1.122.2 → 1.122.3
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/CHANGELOG.md +7 -0
- package/bin/adapter/entry-points/cli/index.js +9 -0
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/adapter/entry-points/console/consoleOperationApi.js +78 -39
- package/bin/adapter/entry-points/console/consoleOperationApi.js.map +1 -1
- package/bin/adapter/entry-points/console/consoleProjectResolver.js +8 -1
- package/bin/adapter/entry-points/console/consoleProjectResolver.js.map +1 -1
- package/bin/adapter/entry-points/console/webServer.js +5 -1
- package/bin/adapter/entry-points/console/webServer.js.map +1 -1
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +23 -4
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/index.test.ts +3 -1
- package/src/adapter/entry-points/cli/index.ts +11 -0
- package/src/adapter/entry-points/console/consoleOperationApi.test.ts +190 -11
- package/src/adapter/entry-points/console/consoleOperationApi.ts +97 -56
- package/src/adapter/entry-points/console/consoleProjectResolver.test.ts +13 -0
- package/src/adapter/entry-points/console/consoleProjectResolver.ts +11 -0
- package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +3 -0
- package/src/adapter/entry-points/console/webServer.test.ts +4 -0
- package/src/adapter/entry-points/console/webServer.ts +9 -1
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +86 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +34 -7
- package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +1 -0
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
- package/types/adapter/entry-points/console/consoleOperationApi.d.ts +2 -0
- package/types/adapter/entry-points/console/consoleOperationApi.d.ts.map +1 -1
- package/types/adapter/entry-points/console/consoleProjectResolver.d.ts +2 -1
- package/types/adapter/entry-points/console/consoleProjectResolver.d.ts.map +1 -1
- package/types/adapter/entry-points/console/webServer.d.ts +2 -1
- package/types/adapter/entry-points/console/webServer.d.ts.map +1 -1
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +2 -1
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +1 -1
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
|
@@ -18,9 +18,12 @@ export type ConsoleProjectResolver = (
|
|
|
18
18
|
pjcode: string,
|
|
19
19
|
) => Promise<ConsoleProjectBinding | null>;
|
|
20
20
|
|
|
21
|
+
export type ConsolePjcodeValidator = (pjcode: string) => boolean;
|
|
22
|
+
|
|
21
23
|
export type ConsoleOperationContext = {
|
|
22
24
|
issueRepository: IssueRepository;
|
|
23
25
|
resolveProject: ConsoleProjectResolver;
|
|
26
|
+
isPjcodeConfigured: ConsolePjcodeValidator;
|
|
24
27
|
consoleDataOutputDir: string | null;
|
|
25
28
|
};
|
|
26
29
|
|
|
@@ -69,18 +72,40 @@ const resolveStatusId = (
|
|
|
69
72
|
return match ? match.id : null;
|
|
70
73
|
};
|
|
71
74
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
+
// Builds the minimal Issue reference the ProjectV2 mutations need. The dashboard
|
|
76
|
+
// already supplies the project item id in the request body, and updateStatus,
|
|
77
|
+
// updateStory and updateNextActionHour read only `issue.itemId` (plus `url` for
|
|
78
|
+
// context). Constructing the reference locally avoids the GraphQL
|
|
79
|
+
// fetchProjectItemByUrl call that issueRepository.get would otherwise perform.
|
|
80
|
+
const projectItemReference = (
|
|
75
81
|
issueUrl: string,
|
|
76
82
|
projectItemId: string,
|
|
77
|
-
):
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
): Issue => ({
|
|
84
|
+
nameWithOwner: '',
|
|
85
|
+
number: 0,
|
|
86
|
+
title: '',
|
|
87
|
+
state: 'OPEN',
|
|
88
|
+
status: null,
|
|
89
|
+
story: null,
|
|
90
|
+
nextActionDate: null,
|
|
91
|
+
nextActionHour: null,
|
|
92
|
+
estimationMinutes: null,
|
|
93
|
+
dependedIssueUrls: [],
|
|
94
|
+
completionDate50PercentConfidence: null,
|
|
95
|
+
url: issueUrl,
|
|
96
|
+
assignees: [],
|
|
97
|
+
labels: [],
|
|
98
|
+
org: '',
|
|
99
|
+
repo: '',
|
|
100
|
+
body: '',
|
|
101
|
+
itemId: projectItemId,
|
|
102
|
+
isPr: isPullRequestUrl(issueUrl),
|
|
103
|
+
isInProgress: false,
|
|
104
|
+
isClosed: false,
|
|
105
|
+
createdAt: new Date(0),
|
|
106
|
+
author: '',
|
|
107
|
+
closingIssueReferenceUrls: [],
|
|
108
|
+
});
|
|
84
109
|
|
|
85
110
|
const recordDone = (
|
|
86
111
|
context: ConsoleOperationContext,
|
|
@@ -117,6 +142,25 @@ const isOperationResponse = (
|
|
|
117
142
|
): value is ConsoleOperationResponse =>
|
|
118
143
|
Object.prototype.hasOwnProperty.call(value, 'statusCode');
|
|
119
144
|
|
|
145
|
+
// Validates that a pjcode is configured WITHOUT loading the ProjectV2 via
|
|
146
|
+
// GraphQL. Close operations only need the pjcode (for recordDone namespacing)
|
|
147
|
+
// and the issue/PR URL, both of which are handled through REST. Loading the
|
|
148
|
+
// full project here would make close fail whenever the GraphQL quota is
|
|
149
|
+
// exhausted, even though closing a GitHub issue or PR needs only REST.
|
|
150
|
+
const resolveConfiguredPjcode = (
|
|
151
|
+
context: ConsoleOperationContext,
|
|
152
|
+
body: Record<string, unknown>,
|
|
153
|
+
): string | ConsoleOperationResponse => {
|
|
154
|
+
const pjcode = body.pjcode;
|
|
155
|
+
if (!isNonEmptyString(pjcode)) {
|
|
156
|
+
return badRequest('pjcode is required');
|
|
157
|
+
}
|
|
158
|
+
if (!context.isPjcodeConfigured(pjcode)) {
|
|
159
|
+
return badRequest(`no project configured for pjcode "${pjcode}"`);
|
|
160
|
+
}
|
|
161
|
+
return pjcode;
|
|
162
|
+
};
|
|
163
|
+
|
|
120
164
|
const updateStatusByName = async (
|
|
121
165
|
issueRepository: IssueRepository,
|
|
122
166
|
project: Project,
|
|
@@ -128,16 +172,11 @@ const updateStatusByName = async (
|
|
|
128
172
|
if (statusId === null) {
|
|
129
173
|
return badRequest(`status option "${statusName}" not found in project`);
|
|
130
174
|
}
|
|
131
|
-
|
|
132
|
-
issueRepository,
|
|
175
|
+
await issueRepository.updateStatus(
|
|
133
176
|
project,
|
|
134
|
-
issueUrl,
|
|
135
|
-
|
|
177
|
+
projectItemReference(issueUrl, projectItemId),
|
|
178
|
+
statusId,
|
|
136
179
|
);
|
|
137
|
-
if (issue === null) {
|
|
138
|
-
return badRequest('issue not found');
|
|
139
|
-
}
|
|
140
|
-
await issueRepository.updateStatus(project, issue, statusId);
|
|
141
180
|
return null;
|
|
142
181
|
};
|
|
143
182
|
|
|
@@ -157,6 +196,20 @@ export const handleReview = async (
|
|
|
157
196
|
if (!isNonEmptyString(projectItemId)) {
|
|
158
197
|
return badRequest('projectItemId is required');
|
|
159
198
|
}
|
|
199
|
+
|
|
200
|
+
if (action === 'close') {
|
|
201
|
+
const pjcodeResult = resolveConfiguredPjcode(context, body);
|
|
202
|
+
if (typeof pjcodeResult !== 'string') {
|
|
203
|
+
return pjcodeResult;
|
|
204
|
+
}
|
|
205
|
+
await context.issueRepository.closePullRequest(prUrl);
|
|
206
|
+
if (isNonEmptyString(body.commentBody)) {
|
|
207
|
+
await context.issueRepository.createCommentByUrl(prUrl, body.commentBody);
|
|
208
|
+
}
|
|
209
|
+
recordDone(context, pjcodeResult, projectItemId);
|
|
210
|
+
return ok();
|
|
211
|
+
}
|
|
212
|
+
|
|
160
213
|
const binding = await resolveBinding(context, body);
|
|
161
214
|
if (isOperationResponse(binding)) {
|
|
162
215
|
return binding;
|
|
@@ -213,15 +266,6 @@ export const handleReview = async (
|
|
|
213
266
|
return ok();
|
|
214
267
|
}
|
|
215
268
|
|
|
216
|
-
if (action === 'close') {
|
|
217
|
-
await context.issueRepository.closePullRequest(prUrl);
|
|
218
|
-
if (isNonEmptyString(body.commentBody)) {
|
|
219
|
-
await context.issueRepository.createCommentByUrl(prUrl, body.commentBody);
|
|
220
|
-
}
|
|
221
|
-
recordDone(context, pjcode, projectItemId);
|
|
222
|
-
return ok();
|
|
223
|
-
}
|
|
224
|
-
|
|
225
269
|
return badRequest(`unknown review action "${action}"`);
|
|
226
270
|
};
|
|
227
271
|
|
|
@@ -241,6 +285,30 @@ export const handleTriage = async (
|
|
|
241
285
|
if (!isNonEmptyString(projectItemId)) {
|
|
242
286
|
return badRequest('projectItemId is required');
|
|
243
287
|
}
|
|
288
|
+
|
|
289
|
+
if (action === 'close' || action === 'close_not_planned') {
|
|
290
|
+
const pjcodeResult = resolveConfiguredPjcode(context, body);
|
|
291
|
+
if (typeof pjcodeResult !== 'string') {
|
|
292
|
+
return pjcodeResult;
|
|
293
|
+
}
|
|
294
|
+
if (isNonEmptyString(body.commentBody)) {
|
|
295
|
+
await context.issueRepository.createCommentByUrl(
|
|
296
|
+
issueUrl,
|
|
297
|
+
body.commentBody,
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
if (isPullRequestUrl(issueUrl)) {
|
|
301
|
+
await context.issueRepository.closePullRequest(issueUrl);
|
|
302
|
+
} else {
|
|
303
|
+
await context.issueRepository.closeIssueByUrl(
|
|
304
|
+
issueUrl,
|
|
305
|
+
action === 'close_not_planned' ? 'not_planned' : 'completed',
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
recordDone(context, pjcodeResult, projectItemId);
|
|
309
|
+
return ok();
|
|
310
|
+
}
|
|
311
|
+
|
|
244
312
|
const binding = await resolveBinding(context, body);
|
|
245
313
|
if (isOperationResponse(binding)) {
|
|
246
314
|
return binding;
|
|
@@ -274,43 +342,15 @@ export const handleTriage = async (
|
|
|
274
342
|
if (project.story === null) {
|
|
275
343
|
return badRequest('project does not have a story field');
|
|
276
344
|
}
|
|
277
|
-
const issue = await loadIssueWithProjectItemId(
|
|
278
|
-
context.issueRepository,
|
|
279
|
-
project,
|
|
280
|
-
issueUrl,
|
|
281
|
-
projectItemId,
|
|
282
|
-
);
|
|
283
|
-
if (issue === null) {
|
|
284
|
-
return badRequest('issue not found');
|
|
285
|
-
}
|
|
286
345
|
await context.issueRepository.updateStory(
|
|
287
346
|
{ ...project, story: project.story },
|
|
288
|
-
|
|
347
|
+
projectItemReference(issueUrl, projectItemId),
|
|
289
348
|
storyOptionId,
|
|
290
349
|
);
|
|
291
350
|
recordDone(context, pjcode, projectItemId);
|
|
292
351
|
return ok();
|
|
293
352
|
}
|
|
294
353
|
|
|
295
|
-
if (action === 'close' || action === 'close_not_planned') {
|
|
296
|
-
if (isNonEmptyString(body.commentBody)) {
|
|
297
|
-
await context.issueRepository.createCommentByUrl(
|
|
298
|
-
issueUrl,
|
|
299
|
-
body.commentBody,
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
if (isPullRequestUrl(issueUrl)) {
|
|
303
|
-
await context.issueRepository.closePullRequest(issueUrl);
|
|
304
|
-
} else {
|
|
305
|
-
await context.issueRepository.closeIssueByUrl(
|
|
306
|
-
issueUrl,
|
|
307
|
-
action === 'close_not_planned' ? 'not_planned' : 'completed',
|
|
308
|
-
);
|
|
309
|
-
}
|
|
310
|
-
recordDone(context, pjcode, projectItemId);
|
|
311
|
-
return ok();
|
|
312
|
-
}
|
|
313
|
-
|
|
314
354
|
if (action === 'snooze_1day' || action === 'snooze_1week') {
|
|
315
355
|
const days = action === 'snooze_1day' ? 1 : 7;
|
|
316
356
|
const target = new Date(Date.now() + days * 24 * 60 * 60 * 1000);
|
|
@@ -318,6 +358,7 @@ export const handleTriage = async (
|
|
|
318
358
|
issueUrl,
|
|
319
359
|
project,
|
|
320
360
|
target,
|
|
361
|
+
projectItemId,
|
|
321
362
|
);
|
|
322
363
|
recordDone(context, pjcode, projectItemId);
|
|
323
364
|
return ok();
|
|
@@ -3,6 +3,7 @@ import { Project } from '../../../domain/entities/Project';
|
|
|
3
3
|
import {
|
|
4
4
|
buildPjcodeToProjectUrl,
|
|
5
5
|
createConsoleProjectResolver,
|
|
6
|
+
createPjcodeConfigChecker,
|
|
6
7
|
} from './consoleProjectResolver';
|
|
7
8
|
|
|
8
9
|
describe('buildPjcodeToProjectUrl', () => {
|
|
@@ -39,6 +40,18 @@ describe('buildPjcodeToProjectUrl', () => {
|
|
|
39
40
|
});
|
|
40
41
|
});
|
|
41
42
|
|
|
43
|
+
describe('createPjcodeConfigChecker', () => {
|
|
44
|
+
it('reports true only for a configured pjcode without loading any project', () => {
|
|
45
|
+
const isConfigured = createPjcodeConfigChecker({
|
|
46
|
+
umino: 'https://github.com/orgs/umino/projects/1',
|
|
47
|
+
xmile: 'https://github.com/orgs/xmile/projects/2',
|
|
48
|
+
});
|
|
49
|
+
expect(isConfigured('umino')).toBe(true);
|
|
50
|
+
expect(isConfigured('xmile')).toBe(true);
|
|
51
|
+
expect(isConfigured('unknown')).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
42
55
|
describe('createConsoleProjectResolver', () => {
|
|
43
56
|
const uminoProject: Project = { ...mock<Project>(), id: 'PVT_umino' };
|
|
44
57
|
const xmileProject: Project = { ...mock<Project>(), id: 'PVT_xmile' };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Project } from '../../../domain/entities/Project';
|
|
2
2
|
import {
|
|
3
|
+
ConsolePjcodeValidator,
|
|
3
4
|
ConsoleProjectBinding,
|
|
4
5
|
ConsoleProjectResolver,
|
|
5
6
|
} from './consoleOperationApi';
|
|
@@ -25,6 +26,16 @@ export const buildPjcodeToProjectUrl = (
|
|
|
25
26
|
return mapping;
|
|
26
27
|
};
|
|
27
28
|
|
|
29
|
+
// Builds a synchronous predicate that reports whether a pjcode is configured,
|
|
30
|
+
// using only the local pjcode-to-project-url mapping. This lets close
|
|
31
|
+
// operations validate the pjcode without loading the ProjectV2 via GraphQL.
|
|
32
|
+
export const createPjcodeConfigChecker = (
|
|
33
|
+
pjcodeToProjectUrl: Record<string, string>,
|
|
34
|
+
): ConsolePjcodeValidator => {
|
|
35
|
+
return (pjcode: string): boolean =>
|
|
36
|
+
Object.prototype.hasOwnProperty.call(pjcodeToProjectUrl, pjcode);
|
|
37
|
+
};
|
|
38
|
+
|
|
28
39
|
export const createConsoleProjectResolver = (
|
|
29
40
|
pjcodeToProjectUrl: Record<string, string>,
|
|
30
41
|
loadProject: ConsoleProjectLoader,
|
|
@@ -505,6 +505,8 @@ export const startConsoleE2eHarness = async (): Promise<ConsoleE2eHarness> => {
|
|
|
505
505
|
pjcode: string,
|
|
506
506
|
): Promise<ConsoleProjectBinding | null> =>
|
|
507
507
|
pjcode === CONSOLE_E2E_PJCODE ? { pjcode, project } : null;
|
|
508
|
+
const isPjcodeConfigured = (pjcode: string): boolean =>
|
|
509
|
+
pjcode === CONSOLE_E2E_PJCODE;
|
|
508
510
|
|
|
509
511
|
const reviewCommentCalls: ConsoleE2eReviewCommentCall[] = [];
|
|
510
512
|
const requestChangesCalls: ConsoleE2eRequestChangesCall[] = [];
|
|
@@ -518,6 +520,7 @@ export const startConsoleE2eHarness = async (): Promise<ConsoleE2eHarness> => {
|
|
|
518
520
|
requestChangesCalls,
|
|
519
521
|
),
|
|
520
522
|
resolveProject,
|
|
523
|
+
isPjcodeConfigured,
|
|
521
524
|
issueTitleStateCache: new IssueTitleStateCache(),
|
|
522
525
|
pullRequestStatusCache: new PullRequestStatusCache(),
|
|
523
526
|
inTmuxDataDir: null,
|
|
@@ -651,6 +651,7 @@ describe('webServer new routes integration', () => {
|
|
|
651
651
|
issueRepository,
|
|
652
652
|
resolveProject: async (pjcode) =>
|
|
653
653
|
pjcode === 'umino' ? { pjcode, project: buildProject() } : null,
|
|
654
|
+
isPjcodeConfigured: (pjcode) => pjcode === 'umino',
|
|
654
655
|
port: 0,
|
|
655
656
|
});
|
|
656
657
|
try {
|
|
@@ -702,6 +703,7 @@ describe('webServer new routes integration', () => {
|
|
|
702
703
|
issueRepository,
|
|
703
704
|
resolveProject: async (pjcode) =>
|
|
704
705
|
pjcode === 'umino' ? { pjcode, project: buildProject() } : null,
|
|
706
|
+
isPjcodeConfigured: (pjcode) => pjcode === 'umino',
|
|
705
707
|
port: 0,
|
|
706
708
|
});
|
|
707
709
|
try {
|
|
@@ -750,6 +752,7 @@ describe('webServer new routes integration', () => {
|
|
|
750
752
|
issueRepository,
|
|
751
753
|
resolveProject: async (pjcode) =>
|
|
752
754
|
pjcode === 'umino' ? { pjcode, project: buildProject() } : null,
|
|
755
|
+
isPjcodeConfigured: (pjcode) => pjcode === 'umino',
|
|
753
756
|
port: 0,
|
|
754
757
|
});
|
|
755
758
|
try {
|
|
@@ -788,6 +791,7 @@ describe('webServer new routes integration', () => {
|
|
|
788
791
|
issueRepository,
|
|
789
792
|
resolveProject: async (pjcode) =>
|
|
790
793
|
pjcode === 'umino' ? { pjcode, project: buildProject() } : null,
|
|
794
|
+
isPjcodeConfigured: (pjcode) => pjcode === 'umino',
|
|
791
795
|
port: 0,
|
|
792
796
|
});
|
|
793
797
|
try {
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
} from './consoleReadApi';
|
|
21
21
|
import {
|
|
22
22
|
ConsoleOperationContext,
|
|
23
|
+
ConsolePjcodeValidator,
|
|
23
24
|
ConsoleProjectResolver,
|
|
24
25
|
handleComment,
|
|
25
26
|
handleIntmux,
|
|
@@ -173,6 +174,7 @@ export type WebServerOptions = {
|
|
|
173
174
|
imageFetcher?: ImageFetcher | null;
|
|
174
175
|
issueRepository?: IssueRepository | null;
|
|
175
176
|
resolveProject?: ConsoleProjectResolver | null;
|
|
177
|
+
isPjcodeConfigured?: ConsolePjcodeValidator | null;
|
|
176
178
|
issueTitleStateCache?: IssueTitleStateCache | null;
|
|
177
179
|
pullRequestStatusCache?: PullRequestStatusCache | null;
|
|
178
180
|
};
|
|
@@ -430,12 +432,18 @@ const handleOperationApi = async (
|
|
|
430
432
|
): Promise<{ statusCode: number; body: unknown } | null> => {
|
|
431
433
|
const issueRepository = options.issueRepository ?? null;
|
|
432
434
|
const resolveProject = options.resolveProject ?? null;
|
|
433
|
-
|
|
435
|
+
const isPjcodeConfigured = options.isPjcodeConfigured ?? null;
|
|
436
|
+
if (
|
|
437
|
+
issueRepository === null ||
|
|
438
|
+
resolveProject === null ||
|
|
439
|
+
isPjcodeConfigured === null
|
|
440
|
+
) {
|
|
434
441
|
return null;
|
|
435
442
|
}
|
|
436
443
|
const context: ConsoleOperationContext = {
|
|
437
444
|
issueRepository,
|
|
438
445
|
resolveProject,
|
|
446
|
+
isPjcodeConfigured,
|
|
439
447
|
consoleDataOutputDir: options.consoleDataOutputDir,
|
|
440
448
|
};
|
|
441
449
|
const dispatched = dispatchOperation(context, requestPath, body);
|
|
@@ -593,6 +593,92 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
593
593
|
});
|
|
594
594
|
});
|
|
595
595
|
|
|
596
|
+
describe('getCachedProject', () => {
|
|
597
|
+
it('returns the daemon-cached project without any GraphQL project load', async () => {
|
|
598
|
+
const { repository, localStorageCacheRepository, projectRepository } =
|
|
599
|
+
createApiV3CheerioRestIssueRepository();
|
|
600
|
+
const cachedProject = buildTestProject('cached-project');
|
|
601
|
+
localStorageCacheRepository.getSingle.mockResolvedValue({
|
|
602
|
+
lastFetchedAt: '2026-07-07T00:30:00.000Z',
|
|
603
|
+
lastFullFetchAt: '2026-07-07T00:00:00.000Z',
|
|
604
|
+
project: cachedProject,
|
|
605
|
+
issues: [],
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
const result = await repository.getCachedProject('cached-project');
|
|
609
|
+
|
|
610
|
+
expect(result).toEqual(cachedProject);
|
|
611
|
+
expect(localStorageCacheRepository.getSingle).toHaveBeenCalledWith(
|
|
612
|
+
'allIssues-cached-project',
|
|
613
|
+
);
|
|
614
|
+
expect(projectRepository.getProject).not.toHaveBeenCalled();
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
it('returns null on a cache miss so the caller can fall back to GraphQL', async () => {
|
|
618
|
+
const { repository, localStorageCacheRepository, projectRepository } =
|
|
619
|
+
createApiV3CheerioRestIssueRepository();
|
|
620
|
+
localStorageCacheRepository.getSingle.mockResolvedValue(null);
|
|
621
|
+
|
|
622
|
+
const result = await repository.getCachedProject('missing-project');
|
|
623
|
+
|
|
624
|
+
expect(result).toBeNull();
|
|
625
|
+
expect(projectRepository.getProject).not.toHaveBeenCalled();
|
|
626
|
+
});
|
|
627
|
+
});
|
|
628
|
+
|
|
629
|
+
describe('updateNextActionDate', () => {
|
|
630
|
+
const projectWithNextActionDate = (): Project => ({
|
|
631
|
+
...buildTestProject('nad-project'),
|
|
632
|
+
nextActionDate: { name: 'Next Action Date', fieldId: 'nad-field' },
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
it('uses the provided project item id and skips the GraphQL item fetch', async () => {
|
|
636
|
+
const { repository, graphqlProjectItemRepository } =
|
|
637
|
+
createApiV3CheerioRestIssueRepository();
|
|
638
|
+
graphqlProjectItemRepository.updateProjectField.mockResolvedValue();
|
|
639
|
+
|
|
640
|
+
await repository.updateNextActionDate(
|
|
641
|
+
'https://github.com/o/r/issues/1',
|
|
642
|
+
projectWithNextActionDate(),
|
|
643
|
+
new Date('2026-07-20T00:00:00.000Z'),
|
|
644
|
+
'given-item-id',
|
|
645
|
+
);
|
|
646
|
+
|
|
647
|
+
expect(
|
|
648
|
+
graphqlProjectItemRepository.fetchProjectItemByUrl,
|
|
649
|
+
).not.toHaveBeenCalled();
|
|
650
|
+
expect(
|
|
651
|
+
graphqlProjectItemRepository.updateProjectField,
|
|
652
|
+
).toHaveBeenCalledWith('nad-project', 'nad-field', 'given-item-id', {
|
|
653
|
+
date: '2026-07-20',
|
|
654
|
+
});
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
it('falls back to fetchProjectItemByUrl when no project item id is provided', async () => {
|
|
658
|
+
const { repository, graphqlProjectItemRepository } =
|
|
659
|
+
createApiV3CheerioRestIssueRepository();
|
|
660
|
+
graphqlProjectItemRepository.updateProjectField.mockResolvedValue();
|
|
661
|
+
graphqlProjectItemRepository.fetchProjectItemByUrl.mockResolvedValue(
|
|
662
|
+
buildProjectItem('https://github.com/o/r/issues/1', 'fallback'),
|
|
663
|
+
);
|
|
664
|
+
|
|
665
|
+
await repository.updateNextActionDate(
|
|
666
|
+
'https://github.com/o/r/issues/1',
|
|
667
|
+
projectWithNextActionDate(),
|
|
668
|
+
new Date('2026-07-20T00:00:00.000Z'),
|
|
669
|
+
);
|
|
670
|
+
|
|
671
|
+
expect(
|
|
672
|
+
graphqlProjectItemRepository.fetchProjectItemByUrl,
|
|
673
|
+
).toHaveBeenCalledWith('https://github.com/o/r/issues/1', 'nad-project');
|
|
674
|
+
expect(
|
|
675
|
+
graphqlProjectItemRepository.updateProjectField,
|
|
676
|
+
).toHaveBeenCalledWith('nad-project', 'nad-field', 'item-fallback', {
|
|
677
|
+
date: '2026-07-20',
|
|
678
|
+
});
|
|
679
|
+
});
|
|
680
|
+
});
|
|
681
|
+
|
|
596
682
|
describe('setDependedIssueUrl', () => {
|
|
597
683
|
const projectWithDependedIssueUrlField = {
|
|
598
684
|
...mock<Project>(),
|
|
@@ -680,6 +680,25 @@ export class ApiV3CheerioRestIssueRepository
|
|
|
680
680
|
};
|
|
681
681
|
};
|
|
682
682
|
|
|
683
|
+
// Reads the Project (status/story option ids and field ids) that the TDPM
|
|
684
|
+
// daemon persisted into the `allIssues-${projectId}` cache, without any
|
|
685
|
+
// GraphQL call. Returns null on cache miss so callers can fall back to a
|
|
686
|
+
// GraphQL project load only when the daemon has not populated the cache yet.
|
|
687
|
+
getCachedProject = async (
|
|
688
|
+
projectId: Project['id'],
|
|
689
|
+
): Promise<Project | null> => {
|
|
690
|
+
const raw = await this.localStorageCacheRepository.getSingle(
|
|
691
|
+
`allIssues-${projectId}`,
|
|
692
|
+
);
|
|
693
|
+
if (typeof raw !== 'object' || raw === null || !('project' in raw)) {
|
|
694
|
+
return null;
|
|
695
|
+
}
|
|
696
|
+
if (!typia.is<Project>(raw.project)) {
|
|
697
|
+
return null;
|
|
698
|
+
}
|
|
699
|
+
return raw.project;
|
|
700
|
+
};
|
|
701
|
+
|
|
683
702
|
private toDateString = (date: Date): string =>
|
|
684
703
|
`${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}`;
|
|
685
704
|
|
|
@@ -855,22 +874,30 @@ export class ApiV3CheerioRestIssueRepository
|
|
|
855
874
|
issueUrl: string,
|
|
856
875
|
project: Project,
|
|
857
876
|
date: Date,
|
|
877
|
+
projectItemId?: string,
|
|
858
878
|
): Promise<void> => {
|
|
859
879
|
if (!project.nextActionDate) {
|
|
860
880
|
return;
|
|
861
881
|
}
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
882
|
+
// When the caller already knows the project item id (e.g. the console,
|
|
883
|
+
// which receives it in the request body), use it directly and skip the
|
|
884
|
+
// GraphQL fetchProjectItemByUrl lookup. Fall back to the lookup only when
|
|
885
|
+
// no id was supplied, preserving the original behavior for other callers.
|
|
886
|
+
const itemId =
|
|
887
|
+
projectItemId ??
|
|
888
|
+
(
|
|
889
|
+
await this.graphqlProjectItemRepository.fetchProjectItemByUrl(
|
|
890
|
+
issueUrl,
|
|
891
|
+
project.id,
|
|
892
|
+
)
|
|
893
|
+
)?.id;
|
|
894
|
+
if (!itemId) {
|
|
868
895
|
return;
|
|
869
896
|
}
|
|
870
897
|
return this.graphqlProjectItemRepository.updateProjectField(
|
|
871
898
|
project.id,
|
|
872
899
|
project.nextActionDate.fieldId,
|
|
873
|
-
|
|
900
|
+
itemId,
|
|
874
901
|
{ date: date.toISOString().split('T')[0] },
|
|
875
902
|
);
|
|
876
903
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAmIzB,eAAO,MAAM,OAAO,SAAgB,CAAC"}
|
|
@@ -7,9 +7,11 @@ export type ConsoleProjectBinding = {
|
|
|
7
7
|
project: Project;
|
|
8
8
|
};
|
|
9
9
|
export type ConsoleProjectResolver = (pjcode: string) => Promise<ConsoleProjectBinding | null>;
|
|
10
|
+
export type ConsolePjcodeValidator = (pjcode: string) => boolean;
|
|
10
11
|
export type ConsoleOperationContext = {
|
|
11
12
|
issueRepository: IssueRepository;
|
|
12
13
|
resolveProject: ConsoleProjectResolver;
|
|
14
|
+
isPjcodeConfigured: ConsolePjcodeValidator;
|
|
13
15
|
consoleDataOutputDir: string | null;
|
|
14
16
|
};
|
|
15
17
|
export type ConsoleOperationResponse = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleOperationApi.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleOperationApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,6DAA6D,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAI3D,eAAO,MAAM,8BAA8B,uBAAuB,CAAC;AACnE,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAE/D,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CACnC,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;AAE3C,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,sBAAsB,CAAC;IACvC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;
|
|
1
|
+
{"version":3,"file":"consoleOperationApi.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleOperationApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,6DAA6D,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAI3D,eAAO,MAAM,8BAA8B,uBAAuB,CAAC;AACnE,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAE/D,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CACnC,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;AAE3C,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;AAEjE,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,sBAAsB,CAAC;IACvC,kBAAkB,EAAE,sBAAsB,CAAC;IAC3C,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAsJF,eAAO,MAAM,YAAY,GACvB,SAAS,uBAAuB,EAChC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,wBAAwB,CAoFlC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,SAAS,uBAAuB,EAChC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,wBAAwB,CA6FlC,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,SAAS,uBAAuB,EAChC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,wBAAwB,CA2BlC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,uBAAuB,EAChC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,wBAAwB,CAiClC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,SAAS,uBAAuB,EAChC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,wBAAwB,CAiClC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Project } from '../../../domain/entities/Project';
|
|
2
|
-
import { ConsoleProjectResolver } from './consoleOperationApi';
|
|
2
|
+
import { ConsolePjcodeValidator, ConsoleProjectResolver } from './consoleOperationApi';
|
|
3
3
|
export type ConsoleProjectLoader = (projectUrl: string) => Promise<Project | null>;
|
|
4
4
|
export declare const buildPjcodeToProjectUrl: (defaultPjcode: string, defaultProjectUrl: string, consoleProjects: Record<string, string> | null) => Record<string, string>;
|
|
5
|
+
export declare const createPjcodeConfigChecker: (pjcodeToProjectUrl: Record<string, string>) => ConsolePjcodeValidator;
|
|
5
6
|
export declare const createConsoleProjectResolver: (pjcodeToProjectUrl: Record<string, string>, loadProject: ConsoleProjectLoader) => ConsoleProjectResolver;
|
|
6
7
|
//# sourceMappingURL=consoleProjectResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleProjectResolver.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleProjectResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"consoleProjectResolver.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleProjectResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EACL,sBAAsB,EAEtB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,oBAAoB,GAAG,CACjC,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAE7B,eAAO,MAAM,uBAAuB,GAClC,eAAe,MAAM,EACrB,mBAAmB,MAAM,EACzB,iBAAiB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,KAC7C,MAAM,CAAC,MAAM,EAAE,MAAM,CAWvB,CAAC;AAKF,eAAO,MAAM,yBAAyB,GACpC,oBAAoB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KACzC,sBAGF,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,oBAAoB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,aAAa,oBAAoB,KAChC,sBAmBF,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as http from 'http';
|
|
2
2
|
import { IssueRepository } from '../../../domain/usecases/adapter-interfaces/IssueRepository';
|
|
3
3
|
import { IssueTitleStateCache, PullRequestStatusCache } from './consoleReadApi';
|
|
4
|
-
import { ConsoleProjectResolver } from './consoleOperationApi';
|
|
4
|
+
import { ConsolePjcodeValidator, ConsoleProjectResolver } from './consoleOperationApi';
|
|
5
5
|
import { ImageFetcher } from './consoleImageProxy';
|
|
6
6
|
export declare const DEFAULT_WEB_PORT = 9981;
|
|
7
7
|
export declare const DEFAULT_DASHBOARD_PROJECT_NAMES: string[];
|
|
@@ -23,6 +23,7 @@ export type WebServerOptions = {
|
|
|
23
23
|
imageFetcher?: ImageFetcher | null;
|
|
24
24
|
issueRepository?: IssueRepository | null;
|
|
25
25
|
resolveProject?: ConsoleProjectResolver | null;
|
|
26
|
+
isPjcodeConfigured?: ConsolePjcodeValidator | null;
|
|
26
27
|
issueTitleStateCache?: IssueTitleStateCache | null;
|
|
27
28
|
pullRequestStatusCache?: PullRequestStatusCache | null;
|
|
28
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webServer.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/webServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AAM9F,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EAQvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,sBAAsB,EAMvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAqB,MAAM,qBAAqB,CAAC;AAOtE,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,eAAO,MAAM,+BAA+B,UAA0B,CAAC;AAEvE,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAmCjD,eAAO,MAAM,aAAa,GAAI,aAAa,MAAM,KAAG,OAGiB,CAAC;AAEtE,eAAO,MAAM,aAAa,GAAI,aAAa,MAAM,KAAG,OAGrB,CAAC;AAIhC,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,OAmBvD,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,eAAe,MAAM,EACrB,eAAe,MAAM,GAAG,IAAI,KAC3B,OAAoE,CAAC;AAExE,eAAO,MAAM,oBAAoB,GAC/B,YAAY,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EACpC,aAAa,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KACzC,MAAM,GAAG,IAQX,CAAC;AAuCF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC/C,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnD,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACxD,CAAC;AAMF,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAInD,eAAO,MAAM,wBAAwB,GACnC,cAAc,MAAM,EACpB,aAAa,MAAM,KAClB,MAAM,GAAG,IAWX,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,eAAe,MAAM,EACrB,aAAa,MAAM,KAClB,MAAM,GAAG,IAeX,CAAC;
|
|
1
|
+
{"version":3,"file":"webServer.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/webServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AAM9F,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EAQvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,sBAAsB,EACtB,sBAAsB,EAMvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAqB,MAAM,qBAAqB,CAAC;AAOtE,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,eAAO,MAAM,+BAA+B,UAA0B,CAAC;AAEvE,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAmCjD,eAAO,MAAM,aAAa,GAAI,aAAa,MAAM,KAAG,OAGiB,CAAC;AAEtE,eAAO,MAAM,aAAa,GAAI,aAAa,MAAM,KAAG,OAGrB,CAAC;AAIhC,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,OAmBvD,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,eAAe,MAAM,EACrB,eAAe,MAAM,GAAG,IAAI,KAC3B,OAAoE,CAAC;AAExE,eAAO,MAAM,oBAAoB,GAC/B,YAAY,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EACpC,aAAa,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KACzC,MAAM,GAAG,IAQX,CAAC;AAuCF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACnD,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnD,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACxD,CAAC;AAMF,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAInD,eAAO,MAAM,wBAAwB,GACnC,cAAc,MAAM,EACpB,aAAa,MAAM,KAClB,MAAM,GAAG,IAWX,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,eAAe,MAAM,EACrB,aAAa,MAAM,KAClB,MAAM,GAAG,IAeX,CAAC;AA0VF,eAAO,MAAM,uBAAuB,GAClC,SAAS,gBAAgB,EACzB,aAAa,MAAM,KAClB,MAAM,GAAG,IAeX,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,SAAS,gBAAgB,EACzB,SAAS,IAAI,CAAC,eAAe,EAC7B,UAAU,IAAI,CAAC,cAAc,KAC5B,OAAO,CAAC,IAAI,CAwEd,CAAC;AAcF,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,IAAI,CAAC,MAM7D,CAAC;AAEL,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG;IACrD,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,SAAS,qBAAqB,KAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAQlB,CAAC"}
|
|
@@ -37,6 +37,7 @@ export declare class ApiV3CheerioRestIssueRepository extends BaseGitHubRepositor
|
|
|
37
37
|
convertProjectItemToIssue: (item: ProjectItem) => Issue;
|
|
38
38
|
private restoreIssuesFromCache;
|
|
39
39
|
private readCachedProjectIssues;
|
|
40
|
+
getCachedProject: (projectId: Project["id"]) => Promise<Project | null>;
|
|
40
41
|
private toDateString;
|
|
41
42
|
getAllIssues: (projectId: Project["id"]) => Promise<{
|
|
42
43
|
issues: Issue[];
|
|
@@ -62,7 +63,7 @@ export declare class ApiV3CheerioRestIssueRepository extends BaseGitHubRepositor
|
|
|
62
63
|
getIssueByUrl: (url: string) => Promise<Issue | null>;
|
|
63
64
|
addIssueToProject: (project: Project, issueUrl: string) => Promise<void>;
|
|
64
65
|
setDependedIssueUrl: (prUrl: string, project: Project, issueUrl: string) => Promise<void>;
|
|
65
|
-
updateNextActionDate: (issueUrl: string, project: Project, date: Date) => Promise<void>;
|
|
66
|
+
updateNextActionDate: (issueUrl: string, project: Project, date: Date, projectItemId?: string) => Promise<void>;
|
|
66
67
|
updateNextActionHour: (project: Project & {
|
|
67
68
|
nextActionHour: NonNullable<Project["nextActionHour"]>;
|
|
68
69
|
}, issue: Issue, hour: number) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiV3CheerioRestIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ApiV3CheerioRestIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts"],"names":[],"mappings":"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"}
|