github-issue-tower-defence-management 1.1.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.
Files changed (221) hide show
  1. package/.env.example +6 -0
  2. package/.eslintrc.cjs +55 -0
  3. package/.github/CODEOWNERS +2 -0
  4. package/.github/workflows/assign-all-cards-to-owner.yml +14 -0
  5. package/.github/workflows/commit-lint.yml +54 -0
  6. package/.github/workflows/configs/commitlint.config.js +27 -0
  7. package/.github/workflows/create-pr.yml +64 -0
  8. package/.github/workflows/format.yml +25 -0
  9. package/.github/workflows/publish.yml +47 -0
  10. package/.github/workflows/test.yml +45 -0
  11. package/.github/workflows/umino-project.yml +181 -0
  12. package/.prettierignore +22 -0
  13. package/.prettierrc +5 -0
  14. package/CHANGELOG.md +49 -0
  15. package/CONTRIBUTING.md +107 -0
  16. package/README.md +108 -0
  17. package/bin/adapter/entry-points/cli/index.js +26 -0
  18. package/bin/adapter/entry-points/cli/index.js.map +1 -0
  19. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +142 -0
  20. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -0
  21. package/bin/adapter/repositories/AxiosSlackRepository.js +124 -0
  22. package/bin/adapter/repositories/AxiosSlackRepository.js.map +1 -0
  23. package/bin/adapter/repositories/BaseGitHubRepository.js +136 -0
  24. package/bin/adapter/repositories/BaseGitHubRepository.js.map +1 -0
  25. package/bin/adapter/repositories/GoogleSpreadsheetRepository.js +123 -0
  26. package/bin/adapter/repositories/GoogleSpreadsheetRepository.js.map +1 -0
  27. package/bin/adapter/repositories/GraphqlProjectRepository.js +167 -0
  28. package/bin/adapter/repositories/GraphqlProjectRepository.js.map +1 -0
  29. package/bin/adapter/repositories/LocalStorageCacheRepository.js +46 -0
  30. package/bin/adapter/repositories/LocalStorageCacheRepository.js.map +1 -0
  31. package/bin/adapter/repositories/LocalStorageRepository.js +30 -0
  32. package/bin/adapter/repositories/LocalStorageRepository.js.map +1 -0
  33. package/bin/adapter/repositories/SystemDateRepository.js +23 -0
  34. package/bin/adapter/repositories/SystemDateRepository.js.map +1 -0
  35. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +148 -0
  36. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -0
  37. package/bin/adapter/repositories/issue/ApiV3IssueRepository.js +48 -0
  38. package/bin/adapter/repositories/issue/ApiV3IssueRepository.js.map +1 -0
  39. package/bin/adapter/repositories/issue/CheerioIssueRepository.js +120 -0
  40. package/bin/adapter/repositories/issue/CheerioIssueRepository.js.map +1 -0
  41. package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js +485 -0
  42. package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js.map +1 -0
  43. package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js +114 -0
  44. package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js.map +1 -0
  45. package/bin/adapter/repositories/issue/RestIssueRepository.js +79 -0
  46. package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -0
  47. package/bin/adapter/repositories/issue/issueTimelineUtils.js +38 -0
  48. package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +1 -0
  49. package/bin/adapter/repositories/utils.js +45 -0
  50. package/bin/adapter/repositories/utils.js.map +1 -0
  51. package/bin/domain/entities/Issue.js +3 -0
  52. package/bin/domain/entities/Issue.js.map +1 -0
  53. package/bin/domain/entities/Member.js +3 -0
  54. package/bin/domain/entities/Member.js.map +1 -0
  55. package/bin/domain/entities/Project.js +3 -0
  56. package/bin/domain/entities/Project.js.map +1 -0
  57. package/bin/domain/entities/ProjectField.js +3 -0
  58. package/bin/domain/entities/ProjectField.js.map +1 -0
  59. package/bin/domain/entities/ProjectFieldSingleSelect.js +3 -0
  60. package/bin/domain/entities/ProjectFieldSingleSelect.js.map +1 -0
  61. package/bin/domain/entities/ProjectFieldSingleSelectOption.js +3 -0
  62. package/bin/domain/entities/ProjectFieldSingleSelectOption.js.map +1 -0
  63. package/bin/domain/entities/WorkingTime.js +3 -0
  64. package/bin/domain/entities/WorkingTime.js.map +1 -0
  65. package/bin/domain/usecases/ActionAnnouncementUseCase.js +46 -0
  66. package/bin/domain/usecases/ActionAnnouncementUseCase.js.map +1 -0
  67. package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js +116 -0
  68. package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js.map +1 -0
  69. package/bin/domain/usecases/ClearNextActionHourUseCase.js +38 -0
  70. package/bin/domain/usecases/ClearNextActionHourUseCase.js.map +1 -0
  71. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +180 -0
  72. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +1 -0
  73. package/bin/domain/usecases/HandleScheduledEventUseCase.js +122 -0
  74. package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -0
  75. package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js +35 -0
  76. package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js.map +1 -0
  77. package/bin/domain/usecases/adapter-interfaces/DateRepository.js +3 -0
  78. package/bin/domain/usecases/adapter-interfaces/DateRepository.js.map +1 -0
  79. package/bin/domain/usecases/adapter-interfaces/IssueRepository.js +3 -0
  80. package/bin/domain/usecases/adapter-interfaces/IssueRepository.js.map +1 -0
  81. package/bin/domain/usecases/adapter-interfaces/ProjectRepository.js +3 -0
  82. package/bin/domain/usecases/adapter-interfaces/ProjectRepository.js.map +1 -0
  83. package/bin/domain/usecases/adapter-interfaces/SlackRepository.js +3 -0
  84. package/bin/domain/usecases/adapter-interfaces/SlackRepository.js.map +1 -0
  85. package/bin/domain/usecases/adapter-interfaces/SpreadsheetRepository.js +3 -0
  86. package/bin/domain/usecases/adapter-interfaces/SpreadsheetRepository.js.map +1 -0
  87. package/bin/index.js +13 -0
  88. package/bin/index.js.map +1 -0
  89. package/commitlint.config.js +6 -0
  90. package/jest.config.js +19 -0
  91. package/package.json +80 -0
  92. package/renovate.json +37 -0
  93. package/src/adapter/entry-points/cli/index.test.ts +20 -0
  94. package/src/adapter/entry-points/cli/index.ts +36 -0
  95. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +95 -0
  96. package/src/adapter/repositories/AxiosSlackRepository.test.ts +119 -0
  97. package/src/adapter/repositories/AxiosSlackRepository.ts +184 -0
  98. package/src/adapter/repositories/BaseGitHubRepository.test.ts +95 -0
  99. package/src/adapter/repositories/BaseGitHubRepository.ts +172 -0
  100. package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +124 -0
  101. package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +151 -0
  102. package/src/adapter/repositories/GraphqlProjectRepository.test.ts +46 -0
  103. package/src/adapter/repositories/GraphqlProjectRepository.ts +236 -0
  104. package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +146 -0
  105. package/src/adapter/repositories/LocalStorageCacheRepository.ts +53 -0
  106. package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +142 -0
  107. package/src/adapter/repositories/LocalStorageRepository.test.ts +161 -0
  108. package/src/adapter/repositories/LocalStorageRepository.ts +21 -0
  109. package/src/adapter/repositories/SystemDateRepository.ts +20 -0
  110. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +158 -0
  111. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +274 -0
  112. package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +26 -0
  113. package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +59 -0
  114. package/src/adapter/repositories/issue/CheerioIssueRepository.test.ts +6610 -0
  115. package/src/adapter/repositories/issue/CheerioIssueRepository.ts +127 -0
  116. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +49 -0
  117. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +745 -0
  118. package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.test.ts +71 -0
  119. package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts +263 -0
  120. package/src/adapter/repositories/issue/RestIssueRepository.test.ts +29 -0
  121. package/src/adapter/repositories/issue/RestIssueRepository.ts +105 -0
  122. package/src/adapter/repositories/issue/issueTimelineUtils.test.ts +79 -0
  123. package/src/adapter/repositories/issue/issueTimelineUtils.ts +52 -0
  124. package/src/adapter/repositories/utils.test.ts +40 -0
  125. package/src/adapter/repositories/utils.ts +50 -0
  126. package/src/domain/entities/Issue.ts +23 -0
  127. package/src/domain/entities/Member.ts +3 -0
  128. package/src/domain/entities/Project.ts +29 -0
  129. package/src/domain/entities/ProjectField.ts +3 -0
  130. package/src/domain/entities/ProjectFieldSingleSelect.ts +8 -0
  131. package/src/domain/entities/ProjectFieldSingleSelectOption.ts +8 -0
  132. package/src/domain/entities/WorkingTime.ts +8 -0
  133. package/src/domain/usecases/ActionAnnouncementUseCase.ts +76 -0
  134. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +209 -0
  135. package/src/domain/usecases/ClearNextActionHourUseCase.ts +51 -0
  136. package/src/domain/usecases/GenerateWorkingTimeReportUseCase.test.ts +382 -0
  137. package/src/domain/usecases/GenerateWorkingTimeReportUseCase.ts +284 -0
  138. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +58 -0
  139. package/src/domain/usecases/HandleScheduledEventUseCase.ts +209 -0
  140. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +46 -0
  141. package/src/domain/usecases/adapter-interfaces/DateRepository.ts +5 -0
  142. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +44 -0
  143. package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +6 -0
  144. package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +20 -0
  145. package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +18 -0
  146. package/src/index.test.ts +8 -0
  147. package/src/index.ts +7 -0
  148. package/tsconfig.build.json +11 -0
  149. package/tsconfig.json +22 -0
  150. package/types/adapter/entry-points/cli/index.d.ts +3 -0
  151. package/types/adapter/entry-points/cli/index.d.ts.map +1 -0
  152. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts +11 -0
  153. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -0
  154. package/types/adapter/repositories/AxiosSlackRepository.d.ts +13 -0
  155. package/types/adapter/repositories/AxiosSlackRepository.d.ts.map +1 -0
  156. package/types/adapter/repositories/BaseGitHubRepository.d.ts +32 -0
  157. package/types/adapter/repositories/BaseGitHubRepository.d.ts.map +1 -0
  158. package/types/adapter/repositories/GoogleSpreadsheetRepository.d.ts +13 -0
  159. package/types/adapter/repositories/GoogleSpreadsheetRepository.d.ts.map +1 -0
  160. package/types/adapter/repositories/GraphqlProjectRepository.d.ts +13 -0
  161. package/types/adapter/repositories/GraphqlProjectRepository.d.ts.map +1 -0
  162. package/types/adapter/repositories/LocalStorageCacheRepository.d.ts +12 -0
  163. package/types/adapter/repositories/LocalStorageCacheRepository.d.ts.map +1 -0
  164. package/types/adapter/repositories/LocalStorageRepository.d.ts +7 -0
  165. package/types/adapter/repositories/LocalStorageRepository.d.ts.map +1 -0
  166. package/types/adapter/repositories/SystemDateRepository.d.ts +7 -0
  167. package/types/adapter/repositories/SystemDateRepository.d.ts.map +1 -0
  168. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +38 -0
  169. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -0
  170. package/types/adapter/repositories/issue/ApiV3IssueRepository.d.ts +17 -0
  171. package/types/adapter/repositories/issue/ApiV3IssueRepository.d.ts.map +1 -0
  172. package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts +31 -0
  173. package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts.map +1 -0
  174. package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts +39 -0
  175. package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts.map +1 -0
  176. package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts +83 -0
  177. package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts.map +1 -0
  178. package/types/adapter/repositories/issue/RestIssueRepository.d.ts +16 -0
  179. package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -0
  180. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +12 -0
  181. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +1 -0
  182. package/types/adapter/repositories/utils.d.ts +4 -0
  183. package/types/adapter/repositories/utils.d.ts.map +1 -0
  184. package/types/domain/entities/Issue.d.ts +24 -0
  185. package/types/domain/entities/Issue.d.ts.map +1 -0
  186. package/types/domain/entities/Member.d.ts +4 -0
  187. package/types/domain/entities/Member.d.ts.map +1 -0
  188. package/types/domain/entities/Project.d.ts +29 -0
  189. package/types/domain/entities/Project.d.ts.map +1 -0
  190. package/types/domain/entities/ProjectField.d.ts +3 -0
  191. package/types/domain/entities/ProjectField.d.ts.map +1 -0
  192. package/types/domain/entities/ProjectFieldSingleSelect.d.ts +8 -0
  193. package/types/domain/entities/ProjectFieldSingleSelect.d.ts.map +1 -0
  194. package/types/domain/entities/ProjectFieldSingleSelectOption.d.ts +8 -0
  195. package/types/domain/entities/ProjectFieldSingleSelectOption.d.ts.map +1 -0
  196. package/types/domain/entities/WorkingTime.d.ts +8 -0
  197. package/types/domain/entities/WorkingTime.d.ts.map +1 -0
  198. package/types/domain/usecases/ActionAnnouncementUseCase.d.ts +17 -0
  199. package/types/domain/usecases/ActionAnnouncementUseCase.d.ts.map +1 -0
  200. package/types/domain/usecases/AnalyzeProblemByIssueUseCase.d.ts +26 -0
  201. package/types/domain/usecases/AnalyzeProblemByIssueUseCase.d.ts.map +1 -0
  202. package/types/domain/usecases/ClearNextActionHourUseCase.d.ts +14 -0
  203. package/types/domain/usecases/ClearNextActionHourUseCase.d.ts.map +1 -0
  204. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +50 -0
  205. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +1 -0
  206. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +63 -0
  207. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -0
  208. package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts +14 -0
  209. package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts.map +1 -0
  210. package/types/domain/usecases/adapter-interfaces/DateRepository.d.ts +6 -0
  211. package/types/domain/usecases/adapter-interfaces/DateRepository.d.ts.map +1 -0
  212. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +23 -0
  213. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -0
  214. package/types/domain/usecases/adapter-interfaces/ProjectRepository.d.ts +6 -0
  215. package/types/domain/usecases/adapter-interfaces/ProjectRepository.d.ts.map +1 -0
  216. package/types/domain/usecases/adapter-interfaces/SlackRepository.d.ts +9 -0
  217. package/types/domain/usecases/adapter-interfaces/SlackRepository.d.ts.map +1 -0
  218. package/types/domain/usecases/adapter-interfaces/SpreadsheetRepository.d.ts +6 -0
  219. package/types/domain/usecases/adapter-interfaces/SpreadsheetRepository.d.ts.map +1 -0
  220. package/types/index.d.ts +10 -0
  221. package/types/index.d.ts.map +1 -0
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RestIssueRepository = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const BaseGitHubRepository_1 = require("../BaseGitHubRepository");
9
+ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.createComment = async (issueUrl, comment) => {
13
+ const { owner, repo, issueNumber } = this.extractIssueFromUrl(issueUrl);
14
+ const response = await axios_1.default.post(`https://api.github.com/repos/${owner}/${repo}/issues/${issueNumber}/comments`, {
15
+ body: comment,
16
+ }, {
17
+ headers: {
18
+ Authorization: `token ${this.ghToken}`,
19
+ 'Content-Type': 'application/json',
20
+ },
21
+ });
22
+ if (response.status !== 201) {
23
+ throw new Error(`Failed to create comment: ${response.status}`);
24
+ }
25
+ };
26
+ this.createNewIssue = async (owner, repo, title, body, assignees, labels) => {
27
+ const response = await axios_1.default.post(`https://api.github.com/repos/${owner}/${repo}/issues`, {
28
+ title,
29
+ body,
30
+ assignees,
31
+ labels,
32
+ }, {
33
+ headers: {
34
+ Authorization: `token ${this.ghToken}`,
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ });
38
+ if (response.status !== 201) {
39
+ throw new Error(`Failed to create issue: ${response.status}`);
40
+ }
41
+ };
42
+ this.getIssue = async (issueUrl) => {
43
+ const { owner, repo, issueNumber } = this.extractIssueFromUrl(issueUrl);
44
+ const response = await axios_1.default.get(`https://api.github.com/repos/${owner}/${repo}/issues/${issueNumber}`, {
45
+ headers: {
46
+ Authorization: `token ${this.ghToken}`,
47
+ Accept: 'application/vnd.github.v3+json',
48
+ },
49
+ });
50
+ return {
51
+ labels: response.data.labels.map((label) => label.name),
52
+ assignees: response.data.assignees.map((assignee) => assignee.login),
53
+ title: response.data.title,
54
+ body: response.data.body,
55
+ number: response.data.number,
56
+ state: response.data.state,
57
+ };
58
+ };
59
+ this.updateIssue = async (issue) => {
60
+ const response = await axios_1.default.patch(`https://api.github.com/repos/${issue.org}/${issue.repo}/issues/${issue.number}`, {
61
+ title: issue.title,
62
+ body: issue.body,
63
+ assignees: issue.assignees,
64
+ labels: issue.labels,
65
+ state: issue.state,
66
+ }, {
67
+ headers: {
68
+ Authorization: `token ${this.ghToken}`,
69
+ 'Content-Type': 'application/json',
70
+ },
71
+ });
72
+ if (response.status !== 200) {
73
+ throw new Error(`Failed to update issue: ${response.status}`);
74
+ }
75
+ };
76
+ }
77
+ }
78
+ exports.RestIssueRepository = RestIssueRepository;
79
+ //# sourceMappingURL=RestIssueRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RestIssueRepository.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/RestIssueRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getInProgressTimeline = void 0;
4
+ const getInProgressTimeline = async (timelines, issueUrl) => {
5
+ const report = [];
6
+ let currentInProgress = undefined;
7
+ for (const timeline of timelines) {
8
+ const time = new Date(timeline.time);
9
+ if (timeline.to.toLocaleLowerCase().includes('in progress')) {
10
+ if (currentInProgress !== undefined) {
11
+ report.push({
12
+ ...currentInProgress,
13
+ endedAt: time,
14
+ durationMinutes: Math.floor(time.getTime() / 1000 / 60) -
15
+ Math.floor(currentInProgress.startedAt.getTime() / 1000 / 60),
16
+ });
17
+ currentInProgress = undefined;
18
+ }
19
+ currentInProgress = {
20
+ issueUrl: issueUrl,
21
+ author: timeline.author,
22
+ startedAt: time,
23
+ };
24
+ continue;
25
+ }
26
+ if (currentInProgress != undefined) {
27
+ report.push({
28
+ ...currentInProgress,
29
+ endedAt: time,
30
+ durationMinutes: (time.getTime() - currentInProgress.startedAt.getTime()) / 1000 / 60,
31
+ });
32
+ currentInProgress = undefined;
33
+ }
34
+ }
35
+ return report;
36
+ };
37
+ exports.getInProgressTimeline = getInProgressTimeline;
38
+ //# sourceMappingURL=issueTimelineUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issueTimelineUtils.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/issueTimelineUtils.ts"],"names":[],"mappings":";;;AAYO,MAAM,qBAAqB,GAAG,KAAK,EACxC,SAAgC,EAChC,QAAgB,EACQ,EAAE;IAC1B,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,IAAI,iBAAiB,GAEL,SAAS,CAAC;IAC1B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC5D,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,iBAAiB;oBACpB,OAAO,EAAE,IAAI;oBACb,eAAe,EACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;wBACtC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;iBAChE,CAAC,CAAC;gBACH,iBAAiB,GAAG,SAAS,CAAC;YAChC,CAAC;YACD,iBAAiB,GAAG;gBAClB,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,SAAS,EAAE,IAAI;aAChB,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,iBAAiB,IAAI,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,iBAAiB;gBACpB,OAAO,EAAE,IAAI;gBACb,eAAe,EACb,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE;aACvE,CAAC,CAAC;YACH,iBAAiB,GAAG,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAvCW,QAAA,qBAAqB,yBAuChC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeFieldName = exports.totalDuration = exports.calcrateDuration = void 0;
4
+ // 0:50 , 1:10 = 0:20
5
+ // 23:50 , 0:00 = 0:10
6
+ // 0:20, 0:10 = 23:50
7
+ const calcrateDuration = (start, // HH:mm
8
+ end) => {
9
+ const [startHour, startMinute] = start.split(':').map((s) => parseInt(s, 10));
10
+ const [endHour, endMinute] = end.split(':').map((s) => parseInt(s, 10));
11
+ let durationHour = endHour - startHour;
12
+ let durationMinute = endMinute - startMinute;
13
+ if (durationMinute < 0) {
14
+ durationHour -= 1;
15
+ durationMinute += 60;
16
+ }
17
+ if (durationHour < 0) {
18
+ durationHour += 24;
19
+ }
20
+ return `${String(durationHour).padStart(2, '0')}:${String(durationMinute).padStart(2, '0')}`;
21
+ };
22
+ exports.calcrateDuration = calcrateDuration;
23
+ const totalDuration = (durations) => {
24
+ const total = durations.reduce((acc, cur) => {
25
+ const [hour, minute] = cur.split(':').map((s) => parseInt(s, 10));
26
+ return {
27
+ hour: acc.hour + hour,
28
+ minute: acc.minute + minute,
29
+ };
30
+ }, { hour: 0, minute: 0 });
31
+ const totalHour = total.hour + Math.floor(total.minute / 60);
32
+ const totalMinute = total.minute % 60;
33
+ return `${String(totalHour).padStart(2, '0')}:${String(totalMinute).padStart(2, '0')}`;
34
+ };
35
+ exports.totalDuration = totalDuration;
36
+ const normalizeFieldName = (fieldName) => {
37
+ return fieldName
38
+ .toLowerCase()
39
+ .replace(' ', '')
40
+ .replace('-', '')
41
+ .replace(' ', '')
42
+ .replace(' ', '');
43
+ };
44
+ exports.normalizeFieldName = normalizeFieldName;
45
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/adapter/repositories/utils.ts"],"names":[],"mappings":";;;AAAA,qBAAqB;AACrB,sBAAsB;AACtB,qBAAqB;AACd,MAAM,gBAAgB,GAAG,CAC9B,KAAa,EAAE,QAAQ;AACvB,GAAW,EACH,EAAE;IACV,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAExE,IAAI,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;IACvC,IAAI,cAAc,GAAG,SAAS,GAAG,WAAW,CAAC;IAE7C,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,YAAY,IAAI,CAAC,CAAC;QAClB,cAAc,IAAI,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,YAAY,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC/F,CAAC,CAAC;AAlBW,QAAA,gBAAgB,oBAkB3B;AACK,MAAM,aAAa,GAAG,CAC3B,SAAmB,EACX,EAAE;IACV,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAClE,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI;YACrB,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM;SAC5B,CAAC;IACJ,CAAC,EACD,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CACvB,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;IAEtC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACzF,CAAC,CAAC;AAlBW,QAAA,aAAa,iBAkBxB;AAEK,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE;IACtD,OAAO,SAAS;SACb,WAAW,EAAE;SACb,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;SAChB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;SAChB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;SAChB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC,CAAC;AAPW,QAAA,kBAAkB,sBAO7B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Issue.js","sourceRoot":"","sources":["../../../src/domain/entities/Issue.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Member.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Member.js","sourceRoot":"","sources":["../../../src/domain/entities/Member.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Project.js","sourceRoot":"","sources":["../../../src/domain/entities/Project.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ProjectField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectField.js","sourceRoot":"","sources":["../../../src/domain/entities/ProjectField.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ProjectFieldSingleSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectFieldSingleSelect.js","sourceRoot":"","sources":["../../../src/domain/entities/ProjectFieldSingleSelect.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ProjectFieldSingleSelectOption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectFieldSingleSelectOption.js","sourceRoot":"","sources":["../../../src/domain/entities/ProjectFieldSingleSelectOption.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=WorkingTime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkingTime.js","sourceRoot":"","sources":["../../../src/domain/entities/WorkingTime.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ActionAnnouncementUseCase = void 0;
4
+ class ActionAnnouncementUseCase {
5
+ constructor(issueRepository) {
6
+ this.issueRepository = issueRepository;
7
+ this.run = async (input) => {
8
+ if (input.cacheUsed || input.targetDates.length === 0) {
9
+ return;
10
+ }
11
+ const now = input.targetDates[input.targetDates.length - 1];
12
+ const isTargetIssue = (issue) => {
13
+ return (issue.labels.includes('action:announcement') &&
14
+ (issue.nextActionDate === null ||
15
+ issue.nextActionDate.getTime() <= now.getTime()) &&
16
+ issue.state === 'OPEN');
17
+ };
18
+ const actionAnnouncementIssues = input.issues.filter((issue) => isTargetIssue(issue));
19
+ for (const issue of actionAnnouncementIssues) {
20
+ for (const member of input.members) {
21
+ try {
22
+ await this.issueRepository.createNewIssue(issue.org, issue.repo, `Announcement #${issue.number}: ${issue.title} / ${member}`, `Hi @${member},
23
+
24
+ Please take a look at the announcement in the issue ${issue.url} and take necessary actions :pray:
25
+ `, [member], [
26
+ ...issue.labels.filter((label) => label !== 'action:announcement'),
27
+ 'story:workflow-management',
28
+ ]);
29
+ }
30
+ catch (e) {
31
+ await this.issueRepository.createNewIssue(issue.org, issue.repo, `Error occured while creating working report for ${member}`, `${JSON.stringify(e)}`, [input.manager], ['bug']);
32
+ }
33
+ await new Promise((resolve) => setTimeout(resolve, 5000));
34
+ }
35
+ await this.issueRepository.updateIssue({
36
+ ...issue,
37
+ labels: issue.labels
38
+ .filter((label) => label !== 'action:announcement')
39
+ .concat('announcement'),
40
+ });
41
+ }
42
+ };
43
+ }
44
+ }
45
+ exports.ActionAnnouncementUseCase = ActionAnnouncementUseCase;
46
+ //# sourceMappingURL=ActionAnnouncementUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionAnnouncementUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ActionAnnouncementUseCase.ts"],"names":[],"mappings":";;;AAKA,MAAa,yBAAyB;IACpC,YACW,eAGR;QAHQ,oBAAe,GAAf,eAAe,CAGvB;QAGH,QAAG,GAAG,KAAK,EAAE,KAOZ,EAAiB,EAAE;YAClB,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5D,MAAM,aAAa,GAAG,CAAC,KAAY,EAAW,EAAE;gBAC9C,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC;oBAC5C,CAAC,KAAK,CAAC,cAAc,KAAK,IAAI;wBAC5B,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAClD,KAAK,CAAC,KAAK,KAAK,MAAM,CACvB,CAAC;YACJ,CAAC,CAAC;YACF,MAAM,wBAAwB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7D,aAAa,CAAC,KAAK,CAAC,CACrB,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,wBAAwB,EAAE,CAAC;gBAC7C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnC,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CACvC,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,IAAI,EACV,iBAAiB,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,MAAM,MAAM,EAAE,EAC3D,OAAO,MAAM;;sDAE6B,KAAK,CAAC,GAAG;CAC9D,EACW,CAAC,MAAM,CAAC,EACR;4BACE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CACpB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,qBAAqB,CAC3C;4BACD,2BAA2B;yBAC5B,CACF,CAAC;oBACJ,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CACvC,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,IAAI,EACV,mDAAmD,MAAM,EAAE,EAC3D,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EACtB,CAAC,KAAK,CAAC,OAAO,CAAC,EACf,CAAC,KAAK,CAAC,CACR,CAAC;oBACJ,CAAC;oBACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;oBACrC,GAAG,KAAK;oBACR,MAAM,EAAE,KAAK,CAAC,MAAM;yBACjB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,qBAAqB,CAAC;yBAClD,MAAM,CAAC,cAAc,CAAC;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;IA/DC,CAAC;CAgEL;AAtED,8DAsEC"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnalyzeProblemByIssueUseCase = void 0;
4
+ class AnalyzeProblemByIssueUseCase {
5
+ constructor(issueRepository, dateRepository) {
6
+ this.issueRepository = issueRepository;
7
+ this.dateRepository = dateRepository;
8
+ this.run = async (input) => {
9
+ const story = input.project.story;
10
+ if (!story ||
11
+ !input.targetDates.find((targetDate) => targetDate.getHours() === 7 && targetDate.getMinutes() === 0)) {
12
+ return;
13
+ }
14
+ const isTargetIssue = (issue) => {
15
+ return (!issue.isPr &&
16
+ (issue.nextActionDate === null ||
17
+ issue.nextActionDate.getTime() <= input.targetDates[0].getTime()) &&
18
+ issue.nextActionHour === null);
19
+ };
20
+ const summaryStoryIssue = new Map();
21
+ const targetStory = input.project.story?.stories.slice(0, 12) || [];
22
+ for (const story of targetStory) {
23
+ summaryStoryIssue.set(story.name, new Map());
24
+ for (const issue of input.issues) {
25
+ if (issue.story !== story.name || !isTargetIssue(issue)) {
26
+ continue;
27
+ }
28
+ const totalWorkingTimeByAssignee = this.calculateTotalWorkingMinutesByAssignee(issue);
29
+ const totalWorkingTime = Math.round(Array.from(totalWorkingTimeByAssignee.values()).reduce((a, b) => a + b, 0));
30
+ const issueSummary = {
31
+ totalWorkingTime,
32
+ totalWorkingTimeByAssignee,
33
+ };
34
+ summaryStoryIssue.get(story.name)?.set(issue, issueSummary);
35
+ // if (totalWorkingTime < 240 || totalWorkingTime > 1440) {
36
+ // continue;
37
+ // }
38
+ // await this.issueRepository.createNewIssue(
39
+ // issue.org,
40
+ // issue.repo,
41
+ // `Please share the situation about #${issue.number} (${issue.title}) / total working time: ${totalWorkingTime} minutes`,
42
+ // this.createQuestionIssueBody(
43
+ // issue,
44
+ // totalWorkingTime,
45
+ // totalWorkingTimeByAssignee,
46
+ // ),
47
+ //
48
+ // [input.manager],
49
+ // ['story:workflow-management'],
50
+ // );
51
+ }
52
+ }
53
+ await this.issueRepository.createNewIssue(input.org, input.repo, `Summary of story issues`, this.createSummaryIssueBody(summaryStoryIssue), [input.manager], ['story:workflow-management']);
54
+ };
55
+ this.createSummaryIssueBody = (summaryStoryIssue) => {
56
+ let noMultipleNewLineBody = `${Array.from(summaryStoryIssue)
57
+ .map(([story, issues]) => `## ${this.dateRepository.formatDurationToHHMM(Array.from(issues.values()).reduce((a, b) => a + b.totalWorkingTime, 0))} ${story}
58
+ ${Array.from(issues)
59
+ .map(([issue, { totalWorkingTime, totalWorkingTimeByAssignee }]) => `- ${this.dateRepository.formatDurationToHHMM(totalWorkingTime)} ${totalWorkingTime > 300 ? ':warning: over 300min' : ''} ${issue.url} ${issue.assignees.map((a) => `@${a}`).join(' ')} ${issue.labels
60
+ .map((label) => `https://github.com/${issue.nameWithOwner}/labels/${encodeURI(label).replace(/:/g, '%3A')}`)
61
+ .join(' ')}
62
+ ${issue.workingTimeline.length > 0 ? ` - Total` : ''}
63
+ ${Array.from(totalWorkingTimeByAssignee)
64
+ .map(([author, workingMinutes]) => ` - ${this.dateRepository.formatDurationToHHMM(workingMinutes)}, @${author}`)
65
+ .join('\n')}
66
+ ${issue.workingTimeline.length > 0 ? ` - Timeline` : ''}
67
+ ${issue.workingTimeline
68
+ .map(({ startedAt, endedAt, durationMinutes, author }) => ` - ${this.dateRepository.formatDurationToHHMM(startedAt.getMinutes())}, ${this.dateRepository.formatDurationToHHMM(endedAt.getMinutes())}, ${this.dateRepository.formatDurationToHHMM(durationMinutes)}, @${author}`)
69
+ .join('\n')}`)
70
+ .join('\n')}`)
71
+ .join('\n')}`;
72
+ while (noMultipleNewLineBody.includes('\n\n')) {
73
+ noMultipleNewLineBody = noMultipleNewLineBody.replace('\n\n', '\n');
74
+ }
75
+ return noMultipleNewLineBody;
76
+ };
77
+ this.createQuestionIssueBody = (issue, totalWorkingTime, totalWorkingTimeByAssignee) => {
78
+ return `Hi,
79
+ I worry about the situation of #${issue.number} (${issue.title}) because the total working time is over 120 minutes.
80
+ Could you please share the situation? :pray:
81
+
82
+ ## Total
83
+ ${this.dateRepository.formatDurationToHHMM(totalWorkingTime)}
84
+
85
+ ## From the record
86
+ Working Minutes, Author,
87
+ ${Array.from(totalWorkingTimeByAssignee)
88
+ .map(([author, workingMinutes]) => `${this.dateRepository.formatDurationToHHMM(workingMinutes)}, ${author}`)
89
+ .join('\n')}
90
+
91
+
92
+ ## Timeline
93
+ Start, End, Duration, Author
94
+ ${issue.workingTimeline
95
+ .map(({ startedAt, endedAt, durationMinutes, author }) => `${this.dateRepository.formatDurationToHHMM(startedAt.getMinutes())}, ${this.dateRepository.formatDurationToHHMM(endedAt.getMinutes())}, ${this.dateRepository.formatDurationToHHMM(durationMinutes)}, ${author}`)
96
+ .join('\n')}
97
+ `;
98
+ };
99
+ this.calculateTotalWorkingMinutesByAssignee = (issue) => {
100
+ const workingTimeLine = issue.workingTimeline;
101
+ const mapWorkingTimeByAssignee = new Map();
102
+ for (const workingTime of workingTimeLine) {
103
+ const author = workingTime.author;
104
+ const workingMinutes = workingTime.durationMinutes;
105
+ if (!mapWorkingTimeByAssignee.has(author)) {
106
+ mapWorkingTimeByAssignee.set(author, 0);
107
+ }
108
+ const currentWorkingMinutes = mapWorkingTimeByAssignee.get(author) || 0;
109
+ mapWorkingTimeByAssignee.set(author, currentWorkingMinutes + workingMinutes);
110
+ }
111
+ return mapWorkingTimeByAssignee;
112
+ };
113
+ }
114
+ }
115
+ exports.AnalyzeProblemByIssueUseCase = AnalyzeProblemByIssueUseCase;
116
+ //# sourceMappingURL=AnalyzeProblemByIssueUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyzeProblemByIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/AnalyzeProblemByIssueUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClearNextActionHourUseCase = void 0;
4
+ class ClearNextActionHourUseCase {
5
+ constructor(issueRepository) {
6
+ this.issueRepository = issueRepository;
7
+ this.run = async (input) => {
8
+ const nextActionHour = input.project.nextActionHour;
9
+ if (!nextActionHour || input.cacheUsed) {
10
+ return;
11
+ }
12
+ const targetDates = input.targetDates
13
+ .filter((targetDate) => targetDate.getMinutes() === 45)
14
+ .reverse();
15
+ if (targetDates.length === 0) {
16
+ return;
17
+ }
18
+ const targetDate = new Date(targetDates[targetDates.length - 1].getTime() + 5 * 60 * 1000);
19
+ const targetHour = targetDate.getHours();
20
+ const isTargetIssue = (issue) => {
21
+ return (issue.nextActionHour !== null &&
22
+ issue.nextActionHour <= targetHour &&
23
+ (issue.nextActionDate === null ||
24
+ issue.nextActionDate.getTime() <= targetDate.getTime()) &&
25
+ issue.state === 'OPEN');
26
+ };
27
+ for (const issue of input.issues) {
28
+ if (!isTargetIssue(issue)) {
29
+ continue;
30
+ }
31
+ await this.issueRepository.clearProjectField(input.project, nextActionHour.fieldId, issue);
32
+ await new Promise((resolve) => setTimeout(resolve, 5000));
33
+ }
34
+ };
35
+ }
36
+ }
37
+ exports.ClearNextActionHourUseCase = ClearNextActionHourUseCase;
38
+ //# sourceMappingURL=ClearNextActionHourUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClearNextActionHourUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ClearNextActionHourUseCase.ts"],"names":[],"mappings":";;;AAIA,MAAa,0BAA0B;IACrC,YACW,eAA2D;QAA3D,oBAAe,GAAf,eAAe,CAA4C;QAGtE,QAAG,GAAG,KAAK,EAAE,KAKZ,EAAiB,EAAE;YAClB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;YACpD,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW;iBAClC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;iBACtD,OAAO,EAAE,CAAC;YACb,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,IAAI,CACzB,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAC9D,CAAC;YACF,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,aAAa,GAAG,CAAC,KAAY,EAAW,EAAE;gBAC9C,OAAO,CACL,KAAK,CAAC,cAAc,KAAK,IAAI;oBAC7B,KAAK,CAAC,cAAc,IAAI,UAAU;oBAClC,CAAC,KAAK,CAAC,cAAc,KAAK,IAAI;wBAC5B,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACzD,KAAK,CAAC,KAAK,KAAK,MAAM,CACvB,CAAC;YACJ,CAAC,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAC1C,KAAK,CAAC,OAAO,EACb,cAAc,CAAC,OAAO,EACtB,KAAK,CACN,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;IA1CC,CAAC;CA2CL;AA9CD,gEA8CC"}