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,107 @@
1
+ # CONTRIBUTING
2
+
3
+ First off, thank you for considering contributing to our project. We value all our contributors and the insights they bring to the table.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Code of Conduct](#code-of-conduct)
8
+ - [Coding Guidelines](#coding-guidelines)
9
+ - [Clean Architecture Rules](#clean-architecture-rules)
10
+ - [Type-Safe Programming](#type-safe-programming)
11
+ - [Writing Tests](#writing-tests)
12
+ - [How to Submit Changes](#how-to-submit-changes)
13
+ - [Recognition](#recognition)
14
+ - [Getting Help](#getting-help)
15
+
16
+ ## Code of Conduct
17
+
18
+ We expect everyone participating in this project to adhere to our Code of Conduct. Below are the main points, but we encourage you to read the full Code of Conduct.
19
+
20
+ - Treat everyone with respect.
21
+ - Avoid making assumptions about other people's identities and experiences.
22
+ - Keep criticism constructive and respectful.
23
+ - Report any incidents of harassment or inappropriate behavior to the project maintainers.
24
+
25
+ ## Coding Guidelines
26
+
27
+ ### Clean Architecture Rules
28
+
29
+ Our project follows the principles of Clean Architecture. This means that we separate concerns, make the project independent of any frameworks, and make it testable and independent of the UI.
30
+
31
+ In addition, our domain layer should not depend on the adapter layer. Please ensure that any contributions you make maintain this separation and adhere to these principles.
32
+
33
+ ### Type-Safe Programming
34
+
35
+ We aim for a type-safe programming style, so please avoid using `any` or `as`. Instead, use type guards or other means to determine types.
36
+
37
+ ### Code Style
38
+
39
+ - As a general rule, please refrain from writing comments whenever possible.
40
+ - Your first approach should be to make your variable and function names as descriptive and self-explanatory as possible.
41
+ - Only when this is not sufficient, and the functionality or purpose of the code is not immediately clear, should comments be used.
42
+ - We encourage the use of the arrow function style as much as possible. It offers a more concise syntax and aligns with contemporary JavaScript practices. Please favor this style when contributing to our codebase.
43
+
44
+ ## Writing Tests
45
+
46
+ Testing is a crucial part of our development process. We expect all code contributions to be accompanied by corresponding tests. This helps us maintain the quality of the project and catch any potential issues early.
47
+
48
+ ### Unit Test Template
49
+
50
+ ```
51
+ import { ReplaceAllWords } from './ReplaceAllWords';
52
+ import { FileRepository } from './adapter-interfaces/FileRepository';
53
+ import { StringConvertor } from './adapter-interfaces/StringConvertor';
54
+ type Mocked<T> = jest.Mocked<T> & jest.MockedObject<T>
55
+
56
+ describe('ReplaceAllWords', () => {
57
+
58
+ beforeEach(() => {
59
+ jest.resetAllMocks();
60
+ });
61
+
62
+ const createUseCaseAndMockRepositories = ()=>{
63
+ const fileRepository: Mocked<FileRepository> = {
64
+ readdirSync: jest.fn(),
65
+ renameSync: jest.fn(),
66
+ lstatSync: jest.fn(),
67
+ statSync: jest.fn(),
68
+ readFileSync: jest.fn(),
69
+ writeFileSync: jest.fn(),
70
+ };
71
+
72
+ const stringConvertor: Mocked<StringConvertor> = {
73
+ camelCase: jest.fn(),
74
+ snakeCase: jest.fn(),
75
+ pascalCase: jest.fn(),
76
+ kebabCase: jest.fn(),
77
+ screamSnakeCase: jest.fn(),
78
+ };
79
+
80
+ const useCase: ReplaceAllWords = new ReplaceAllWords(fileRepository, stringConvertor);
81
+ return {
82
+ fileRepository,
83
+ stringConvertor,
84
+ useCase
85
+ }
86
+ }
87
+ });
88
+
89
+ ```
90
+
91
+ ## How to Submit Changes
92
+
93
+ Once you've identified a bug or an enhancement you'd like to work on, follow these steps to make and submit your changes:
94
+
95
+ 1. Fork the repository.
96
+ 2. Create a new branch.
97
+ 3. Make your changes, ensuring you follow our coding conventions and style guide.
98
+ 4. Write tests for your changes.
99
+ 5. Submit a pull request.
100
+
101
+ Please note that we may take a while to respond, but we appreciate your patience. We aim to make the contribution process as transparent as possible and will keep you updated every step of the way.
102
+
103
+ ## Getting Help
104
+
105
+ If you need help or have any questions, please create an issue in the project's GitHub repository. We aim to respond to issues promptly and appreciate your patience.
106
+
107
+ Again, thank you for considering contributing to our project. Your input is valuable, and we look forward to working with you.
package/README.md ADDED
@@ -0,0 +1,108 @@
1
+ # npm-cli-github-issue-tower-defence-management
2
+
3
+ [![Test](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/actions/workflows/test.yml/badge.svg)](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/actions/workflows/test.yml)
4
+ [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
5
+ [![semantic-release: angular](https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release)
6
+
7
+ Welcome to npm-cli-github-issue-tower-defence-management :tada:
8
+
9
+ ## Usage 🛠️
10
+
11
+ Here's how you can use github-issue-tower-defence-management:
12
+
13
+ ```
14
+ Usage: github-issue-tower-defence-management [options]
15
+
16
+ CLI tool for GitHub Issue Tower Defence Management
17
+
18
+ Options:
19
+ -t, --trigger <type> Trigger type: issue or schedule
20
+ -c, --config <path> Path to config YAML file
21
+ -i, --issue <url> GitHub Issue URL
22
+ -h, --help display help for command
23
+ ```
24
+
25
+ ## Example 📖
26
+
27
+ Here's a quick example to illustrate its usage:
28
+
29
+ ```
30
+ npx github-issue-tower-defence-management -t schedule -c ./config.yml
31
+ ```
32
+
33
+ ```
34
+ npx github-issue-tower-defence-management -t issue -c ./config.yml -i https://github.com/HiromiShikata/test-repository/issues/1
35
+ ```
36
+
37
+ ## Config
38
+
39
+ The `config.yaml` must match the input type of `HandleScheduledEventUseCase.run()`. Below is the structure:
40
+
41
+ ```yaml
42
+ org: string # Organization name
43
+ projectUrl: string # URL of the target project
44
+ manager: string # GitHub account name of the manager
45
+ workingReport:
46
+ repo: string # Repository name
47
+ members: # Array of member's GitHub account names
48
+ - string
49
+ - string
50
+ warningThresholdHour?: number # Optional: Warning threshold in hours
51
+ spreadsheetUrl: string # URL of the Google Spreadsheet
52
+ reportIssueTemplate?: string # Optional: Template for issue reports
53
+ reportIssueLabels: # Array of issue labels
54
+ - string
55
+ - string
56
+ ```
57
+
58
+ Example:
59
+
60
+ ```yaml
61
+ org: 'my-org'
62
+ projectUrl: 'https://github.com/orgs/my-org/projects/1'
63
+ manager: 'HiromiShikata'
64
+ workingReport:
65
+ repo: 'work-report'
66
+ members:
67
+ - 'HiromiShikata'
68
+ - 'octokit'
69
+ warningThresholdHour: 40
70
+ spreadsheetUrl: 'https://docs.google.com/spreadsheets/d/xxx'
71
+ reportIssueTemplate: |
72
+ ## Working Time Report
73
+
74
+ ### Summary
75
+ Period: {period}
76
+ Team: {team}
77
+
78
+ ### Details
79
+ {details}
80
+ reportIssueLabels:
81
+ - 'report'
82
+ - 'working-time'
83
+ slack:
84
+ userToken: 'xoxp-xxx'
85
+ ```
86
+
87
+ ### Slack User Token
88
+
89
+ #### scope
90
+
91
+ - channels:read
92
+ - groups:read
93
+ - mpim:read
94
+ - im:read
95
+ - chat:write
96
+ - identify
97
+ - usergroups:read
98
+ - users:read
99
+ - files:write
100
+ - files:read
101
+
102
+ ## Contributing
103
+
104
+ See [CONTRIBUTING.md](./CONTRIBUTING.md)
105
+
106
+ ## License
107
+
108
+ MIT
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const HandleScheduledEventUseCaseHandler_1 = require("../handlers/HandleScheduledEventUseCaseHandler");
6
+ const program = new commander_1.Command();
7
+ program
8
+ .name('github-issue-tower-defence-management')
9
+ .description('CLI tool for GitHub Issue Tower Defence Management')
10
+ .requiredOption('-t, --trigger <type>', 'Trigger type: issue or schedule', /^(issue|schedule)$/i)
11
+ .requiredOption('-c, --config <path>', 'Path to config YAML file')
12
+ .option('-i, --issue <url>', 'GitHub Issue URL')
13
+ .action(async (options) => {
14
+ if (options.trigger === 'issue' && !options.issue) {
15
+ console.error('Issue URL is required when trigger type is "issue"');
16
+ process.exit(1);
17
+ }
18
+ if (options.trigger === 'schedule') {
19
+ const handler = new HandleScheduledEventUseCaseHandler_1.HandleScheduledEventUseCaseHandler();
20
+ await handler.handle(options.config);
21
+ }
22
+ });
23
+ if (process.argv) {
24
+ program.parse(process.argv);
25
+ }
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,uGAAoG;AAEpG,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAQ9B,OAAO;KACJ,IAAI,CAAC,uCAAuC,CAAC;KAC7C,WAAW,CAAC,oDAAoD,CAAC;KACjE,cAAc,CACb,sBAAsB,EACtB,iCAAiC,EACjC,qBAAqB,CACtB;KACA,cAAc,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;KACjE,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;IACjC,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,uEAAkC,EAAE,CAAC;QACzD,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,142 @@
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.HandleScheduledEventUseCaseHandler = void 0;
7
+ const yaml_1 = __importDefault(require("yaml"));
8
+ const typia_1 = __importDefault(require("typia"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const SystemDateRepository_1 = require("../../repositories/SystemDateRepository");
11
+ const LocalStorageRepository_1 = require("../../repositories/LocalStorageRepository");
12
+ const GoogleSpreadsheetRepository_1 = require("../../repositories/GoogleSpreadsheetRepository");
13
+ const GraphqlProjectRepository_1 = require("../../repositories/GraphqlProjectRepository");
14
+ const ApiV3IssueRepository_1 = require("../../repositories/issue/ApiV3IssueRepository");
15
+ const CheerioIssueRepository_1 = require("../../repositories/issue/CheerioIssueRepository");
16
+ const RestIssueRepository_1 = require("../../repositories/issue/RestIssueRepository");
17
+ const GraphqlProjectItemRepository_1 = require("../../repositories/issue/GraphqlProjectItemRepository");
18
+ const ApiV3CheerioRestIssueRepository_1 = require("../../repositories/issue/ApiV3CheerioRestIssueRepository");
19
+ const GenerateWorkingTimeReportUseCase_1 = require("../../../domain/usecases/GenerateWorkingTimeReportUseCase");
20
+ const HandleScheduledEventUseCase_1 = require("../../../domain/usecases/HandleScheduledEventUseCase");
21
+ const LocalStorageCacheRepository_1 = require("../../repositories/LocalStorageCacheRepository");
22
+ const ActionAnnouncementUseCase_1 = require("../../../domain/usecases/ActionAnnouncementUseCase");
23
+ const SetWorkflowManagementIssueToStoryUseCase_1 = require("../../../domain/usecases/SetWorkflowManagementIssueToStoryUseCase");
24
+ const InternalGraphqlIssueRepository_1 = require("../../repositories/issue/InternalGraphqlIssueRepository");
25
+ const ClearNextActionHourUseCase_1 = require("../../../domain/usecases/ClearNextActionHourUseCase");
26
+ const AnalyzeProblemByIssueUseCase_1 = require("../../../domain/usecases/AnalyzeProblemByIssueUseCase");
27
+ class HandleScheduledEventUseCaseHandler {
28
+ constructor() {
29
+ this.handle = async (configFilePath) => {
30
+ const configFileContent = fs_1.default.readFileSync(configFilePath, 'utf8');
31
+ const input = yaml_1.default.parse(configFileContent);
32
+ if (!(() => { const $io0 = input => "string" === typeof input.org && "string" === typeof input.projectUrl && "string" === typeof input.manager && ("object" === typeof input.workingReport && null !== input.workingReport && $io1(input.workingReport)); const $io1 = input => "string" === typeof input.repo && (Array.isArray(input.members) && input.members.every(elem => "string" === typeof elem)) && (undefined === input.warningThresholdHour || "number" === typeof input.warningThresholdHour) && "string" === typeof input.spreadsheetUrl && (undefined === input.reportIssueTemplate || "string" === typeof input.reportIssueTemplate) && (Array.isArray(input.reportIssueLabels) && input.reportIssueLabels.every(elem => "string" === typeof elem)); return input => "object" === typeof input && null !== input && $io0(input); })()(input)) {
33
+ throw new Error(`Invalid input: ${JSON.stringify(input)}\n\n${JSON.stringify((() => { const $io0 = input => "string" === typeof input.org && "string" === typeof input.projectUrl && "string" === typeof input.manager && ("object" === typeof input.workingReport && null !== input.workingReport && $io1(input.workingReport)); const $io1 = input => "string" === typeof input.repo && (Array.isArray(input.members) && input.members.every(elem => "string" === typeof elem)) && (undefined === input.warningThresholdHour || "number" === typeof input.warningThresholdHour) && "string" === typeof input.spreadsheetUrl && (undefined === input.reportIssueTemplate || "string" === typeof input.reportIssueTemplate) && (Array.isArray(input.reportIssueLabels) && input.reportIssueLabels.every(elem => "string" === typeof elem)); const $vo0 = (input, _path, _exceptionable = true) => ["string" === typeof input.org || $report(_exceptionable, {
34
+ path: _path + ".org",
35
+ expected: "string",
36
+ value: input.org
37
+ }), "string" === typeof input.projectUrl || $report(_exceptionable, {
38
+ path: _path + ".projectUrl",
39
+ expected: "string",
40
+ value: input.projectUrl
41
+ }), "string" === typeof input.manager || $report(_exceptionable, {
42
+ path: _path + ".manager",
43
+ expected: "string",
44
+ value: input.manager
45
+ }), ("object" === typeof input.workingReport && null !== input.workingReport || $report(_exceptionable, {
46
+ path: _path + ".workingReport",
47
+ expected: "__type.o1",
48
+ value: input.workingReport
49
+ })) && $vo1(input.workingReport, _path + ".workingReport", true && _exceptionable) || $report(_exceptionable, {
50
+ path: _path + ".workingReport",
51
+ expected: "__type.o1",
52
+ value: input.workingReport
53
+ })].every(flag => flag); const $vo1 = (input, _path, _exceptionable = true) => ["string" === typeof input.repo || $report(_exceptionable, {
54
+ path: _path + ".repo",
55
+ expected: "string",
56
+ value: input.repo
57
+ }), (Array.isArray(input.members) || $report(_exceptionable, {
58
+ path: _path + ".members",
59
+ expected: "Array<string>",
60
+ value: input.members
61
+ })) && input.members.map((elem, _index3) => "string" === typeof elem || $report(_exceptionable, {
62
+ path: _path + ".members[" + _index3 + "]",
63
+ expected: "string",
64
+ value: elem
65
+ })).every(flag => flag) || $report(_exceptionable, {
66
+ path: _path + ".members",
67
+ expected: "Array<string>",
68
+ value: input.members
69
+ }), undefined === input.warningThresholdHour || "number" === typeof input.warningThresholdHour || $report(_exceptionable, {
70
+ path: _path + ".warningThresholdHour",
71
+ expected: "(number | undefined)",
72
+ value: input.warningThresholdHour
73
+ }), "string" === typeof input.spreadsheetUrl || $report(_exceptionable, {
74
+ path: _path + ".spreadsheetUrl",
75
+ expected: "string",
76
+ value: input.spreadsheetUrl
77
+ }), undefined === input.reportIssueTemplate || "string" === typeof input.reportIssueTemplate || $report(_exceptionable, {
78
+ path: _path + ".reportIssueTemplate",
79
+ expected: "(string | undefined)",
80
+ value: input.reportIssueTemplate
81
+ }), (Array.isArray(input.reportIssueLabels) || $report(_exceptionable, {
82
+ path: _path + ".reportIssueLabels",
83
+ expected: "Array<string>",
84
+ value: input.reportIssueLabels
85
+ })) && input.reportIssueLabels.map((elem, _index4) => "string" === typeof elem || $report(_exceptionable, {
86
+ path: _path + ".reportIssueLabels[" + _index4 + "]",
87
+ expected: "string",
88
+ value: elem
89
+ })).every(flag => flag) || $report(_exceptionable, {
90
+ path: _path + ".reportIssueLabels",
91
+ expected: "Array<string>",
92
+ value: input.reportIssueLabels
93
+ })].every(flag => flag); const __is = input => "object" === typeof input && null !== input && $io0(input); let errors; let $report; return input => {
94
+ if (false === __is(input)) {
95
+ errors = [];
96
+ $report = typia_1.default.validate.report(errors);
97
+ ((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || $report(true, {
98
+ path: _path + "",
99
+ expected: "__type",
100
+ value: input
101
+ })) && $vo0(input, _path + "", true) || $report(true, {
102
+ path: _path + "",
103
+ expected: "__type",
104
+ value: input
105
+ }))(input, "$input", true);
106
+ const success = 0 === errors.length;
107
+ return {
108
+ success,
109
+ errors,
110
+ data: success ? input : undefined
111
+ };
112
+ }
113
+ return {
114
+ success: true,
115
+ errors: [],
116
+ data: input
117
+ };
118
+ }; })()(input))}`);
119
+ }
120
+ const systemDateRepository = new SystemDateRepository_1.SystemDateRepository();
121
+ const localStorageRepository = new LocalStorageRepository_1.LocalStorageRepository();
122
+ const googleSpreadsheetRepository = new GoogleSpreadsheetRepository_1.GoogleSpreadsheetRepository(localStorageRepository);
123
+ const localStorageCacheRepository = new LocalStorageCacheRepository_1.LocalStorageCacheRepository(localStorageRepository);
124
+ const projectRepository = new GraphqlProjectRepository_1.GraphqlProjectRepository();
125
+ const apiV3IssueRepository = new ApiV3IssueRepository_1.ApiV3IssueRepository();
126
+ const internalGraphqlIssueRepository = new InternalGraphqlIssueRepository_1.InternalGraphqlIssueRepository();
127
+ const cheerioIssueRepository = new CheerioIssueRepository_1.CheerioIssueRepository(internalGraphqlIssueRepository);
128
+ const restIssueRepository = new RestIssueRepository_1.RestIssueRepository();
129
+ const graphqlProjectItemRepository = new GraphqlProjectItemRepository_1.GraphqlProjectItemRepository();
130
+ const issueRepository = new ApiV3CheerioRestIssueRepository_1.ApiV3CheerioRestIssueRepository(apiV3IssueRepository, cheerioIssueRepository, restIssueRepository, graphqlProjectItemRepository, localStorageCacheRepository);
131
+ const generateWorkingTimeReportUseCase = new GenerateWorkingTimeReportUseCase_1.GenerateWorkingTimeReportUseCase(issueRepository, googleSpreadsheetRepository, systemDateRepository);
132
+ const actionAnnouncement = new ActionAnnouncementUseCase_1.ActionAnnouncementUseCase(issueRepository);
133
+ const setWorkflowManagementIssueToStoryUseCase = new SetWorkflowManagementIssueToStoryUseCase_1.SetWorkflowManagementIssueToStoryUseCase(issueRepository);
134
+ const clearNextActionHourUseCase = new ClearNextActionHourUseCase_1.ClearNextActionHourUseCase(issueRepository);
135
+ const analyzeProblemByIssueUseCase = new AnalyzeProblemByIssueUseCase_1.AnalyzeProblemByIssueUseCase(issueRepository, systemDateRepository);
136
+ const handleScheduledEventUseCase = new HandleScheduledEventUseCase_1.HandleScheduledEventUseCase(generateWorkingTimeReportUseCase, actionAnnouncement, setWorkflowManagementIssueToStoryUseCase, clearNextActionHourUseCase, analyzeProblemByIssueUseCase, systemDateRepository, googleSpreadsheetRepository, projectRepository, issueRepository);
137
+ return await handleScheduledEventUseCase.run(input);
138
+ };
139
+ }
140
+ }
141
+ exports.HandleScheduledEventUseCaseHandler = HandleScheduledEventUseCaseHandler;
142
+ //# sourceMappingURL=HandleScheduledEventUseCaseHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HandleScheduledEventUseCaseHandler.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,kDAA0B;AAC1B,4CAAoB;AACpB,kFAA+E;AAC/E,sFAAmF;AACnF,gGAA6F;AAC7F,0FAAuF;AACvF,wFAAqF;AACrF,4FAAyF;AACzF,sFAAmF;AACnF,wGAAqG;AACrG,8GAA2G;AAC3G,gHAA6G;AAC7G,sGAAmG;AACnG,gGAA6F;AAC7F,kGAA+F;AAC/F,gIAA6H;AAC7H,4GAAyG;AACzG,oGAAiG;AACjG,wGAAqG;AAIrG,MAAa,kCAAkC;IAA/C;QACE,WAAM,GAAG,KAAK,EACZ,cAAsB,EAMrB,EAAE;YACH,MAAM,iBAAiB,GAAG,YAAE,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YAClE,MAAM,KAAK,GAAY,cAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAErD,IAAI,izBAAqB,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAAC,eAAK,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;wBAAY,KAAK,EAAE,EAAE,CACjG,CAAC;YACJ,CAAC;YAED,MAAM,oBAAoB,GAAG,IAAI,2CAAoB,EAAE,CAAC;YACxD,MAAM,sBAAsB,GAAG,IAAI,+CAAsB,EAAE,CAAC;YAC5D,MAAM,2BAA2B,GAAG,IAAI,yDAA2B,CACjE,sBAAsB,CACvB,CAAC;YACF,MAAM,2BAA2B,GAAG,IAAI,yDAA2B,CACjE,sBAAsB,CACvB,CAAC;YACF,MAAM,iBAAiB,GAAG,IAAI,mDAAwB,EAAE,CAAC;YACzD,MAAM,oBAAoB,GAAG,IAAI,2CAAoB,EAAE,CAAC;YACxD,MAAM,8BAA8B,GAAG,IAAI,+DAA8B,EAAE,CAAC;YAC5E,MAAM,sBAAsB,GAAG,IAAI,+CAAsB,CACvD,8BAA8B,CAC/B,CAAC;YACF,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,EAAE,CAAC;YACtD,MAAM,4BAA4B,GAAG,IAAI,2DAA4B,EAAE,CAAC;YACxE,MAAM,eAAe,GAAG,IAAI,iEAA+B,CACzD,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC5B,2BAA2B,CAC5B,CAAC;YACF,MAAM,gCAAgC,GACpC,IAAI,mEAAgC,CAClC,eAAe,EACf,2BAA2B,EAC3B,oBAAoB,CACrB,CAAC;YACJ,MAAM,kBAAkB,GAAG,IAAI,qDAAyB,CAAC,eAAe,CAAC,CAAC;YAC1E,MAAM,wCAAwC,GAC5C,IAAI,mFAAwC,CAAC,eAAe,CAAC,CAAC;YAChE,MAAM,0BAA0B,GAAG,IAAI,uDAA0B,CAC/D,eAAe,CAChB,CAAC;YACF,MAAM,4BAA4B,GAAG,IAAI,2DAA4B,CACnE,eAAe,EACf,oBAAoB,CACrB,CAAC;YACF,MAAM,2BAA2B,GAAG,IAAI,yDAA2B,CACjE,gCAAgC,EAChC,kBAAkB,EAClB,wCAAwC,EACxC,0BAA0B,EAC1B,4BAA4B,EAC5B,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,CAChB,CAAC;YAEF,OAAO,MAAM,2BAA2B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC;IACJ,CAAC;CAAA;AAvED,gFAuEC"}
@@ -0,0 +1,124 @@
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.AxiosSlackRepository = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ class AxiosSlackRepository {
10
+ constructor(userToken) {
11
+ this.baseUrl = 'https://slack.com/api';
12
+ if (!userToken.startsWith('xoxp-')) {
13
+ throw new Error('Invalid user token. It should start with xoxp-');
14
+ }
15
+ this.client = axios_1.default.create({
16
+ baseURL: this.baseUrl,
17
+ headers: {
18
+ Authorization: `Bearer ${userToken}`,
19
+ },
20
+ });
21
+ }
22
+ async postMessageToChannel(message, channelName) {
23
+ const { data } = await this.client.get('/conversations.list');
24
+ const channel = data.channels.find((c) => c.name === channelName);
25
+ if (!channel)
26
+ throw new Error(`Channel ${channelName} not found`);
27
+ const res = await this.client.post('/chat.postMessage', {
28
+ channel: channel.id,
29
+ text: message,
30
+ });
31
+ if (!res.data.ok) {
32
+ throw new Error(`Failed to post message: ${JSON.stringify(res.data)}`);
33
+ }
34
+ return {
35
+ threadTs: res.data.ts,
36
+ };
37
+ }
38
+ async postMessageToChannelThread(message, channelName, threadTs) {
39
+ const { data } = await this.client.get('/conversations.list');
40
+ const channel = data.channels.find((c) => c.name === channelName);
41
+ if (!channel)
42
+ throw new Error(`Channel ${channelName} not found`);
43
+ const res = await this.client.post('/chat.postMessage', {
44
+ channel: channel.id,
45
+ text: message,
46
+ thread_ts: threadTs,
47
+ });
48
+ if (!res.data.ok) {
49
+ throw new Error(`Failed to post message: ${JSON.stringify(res.data)}`);
50
+ }
51
+ }
52
+ async postMessageToDirectMessage(message, userName) {
53
+ const { data } = await this.client.get('/users.list');
54
+ const user = data.members.find((u) => u.name === userName);
55
+ if (!user)
56
+ throw new Error(`User ${userName} not found`);
57
+ const res = await this.client.post('/chat.postMessage', {
58
+ channel: user.id,
59
+ text: message,
60
+ });
61
+ if (!res.data.ok) {
62
+ throw new Error(`Failed to post message: ${JSON.stringify(res.data)}`);
63
+ }
64
+ }
65
+ async postMessageToChannelWithImage(message, channelName, imageFilePath) {
66
+ const { data } = await this.client.get('/conversations.list');
67
+ const channel = data.channels.find((c) => c.name === channelName);
68
+ if (!channel)
69
+ throw new Error(`Channel ${channelName} not found`);
70
+ const fileStats = fs_1.default.statSync(imageFilePath);
71
+ const fileName = imageFilePath.split('/').pop();
72
+ const uploadUrlRes = await this.client.post('/files.getUploadURLExternal', {
73
+ filename: fileName,
74
+ length: fileStats.size,
75
+ }, {
76
+ headers: {
77
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
78
+ },
79
+ });
80
+ if (!uploadUrlRes.data.ok) {
81
+ throw new Error(`Failed to get upload URL: ${JSON.stringify(uploadUrlRes.data)}`);
82
+ }
83
+ await new Promise((resolve) => setTimeout(resolve, 1000));
84
+ const fileContent = fs_1.default.readFileSync(imageFilePath);
85
+ await axios_1.default.post(uploadUrlRes.data.upload_url, fileContent, {
86
+ headers: {
87
+ 'Content-Type': 'application/octet-stream',
88
+ },
89
+ });
90
+ await new Promise((resolve) => setTimeout(resolve, 1000));
91
+ const completeRes = await this.client.post('/files.completeUploadExternal', {
92
+ files: [
93
+ {
94
+ id: uploadUrlRes.data.file_id,
95
+ },
96
+ ],
97
+ });
98
+ if (!completeRes.data.ok) {
99
+ throw new Error(`Failed to complete upload: ${JSON.stringify(completeRes.data)}`);
100
+ }
101
+ const fileInfo = await this.client.get(`/files.info?file=${uploadUrlRes.data.file_id}`);
102
+ if (!fileInfo.data.ok) {
103
+ throw new Error(`Failed to get file info: ${JSON.stringify(fileInfo.data)}`);
104
+ }
105
+ const imageUrl = fileInfo.data.file.url_private;
106
+ await new Promise((resolve) => setTimeout(resolve, 2000));
107
+ const res = await this.client.post('/chat.postMessage', {
108
+ channel: channel.id,
109
+ text: message,
110
+ blocks: [
111
+ {
112
+ type: 'image',
113
+ image_url: imageUrl,
114
+ alt_text: fileName,
115
+ },
116
+ ],
117
+ });
118
+ if (!res.data.ok) {
119
+ throw new Error(`Failed to post message: ${JSON.stringify(res.data)}`);
120
+ }
121
+ }
122
+ }
123
+ exports.AxiosSlackRepository = AxiosSlackRepository;
124
+ //# sourceMappingURL=AxiosSlackRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AxiosSlackRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/AxiosSlackRepository.ts"],"names":[],"mappings":"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"}