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.
- package/.env.example +6 -0
- package/.eslintrc.cjs +55 -0
- package/.github/CODEOWNERS +2 -0
- package/.github/workflows/assign-all-cards-to-owner.yml +14 -0
- package/.github/workflows/commit-lint.yml +54 -0
- package/.github/workflows/configs/commitlint.config.js +27 -0
- package/.github/workflows/create-pr.yml +64 -0
- package/.github/workflows/format.yml +25 -0
- package/.github/workflows/publish.yml +47 -0
- package/.github/workflows/test.yml +45 -0
- package/.github/workflows/umino-project.yml +181 -0
- package/.prettierignore +22 -0
- package/.prettierrc +5 -0
- package/CHANGELOG.md +49 -0
- package/CONTRIBUTING.md +107 -0
- package/README.md +108 -0
- package/bin/adapter/entry-points/cli/index.js +26 -0
- package/bin/adapter/entry-points/cli/index.js.map +1 -0
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +142 -0
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -0
- package/bin/adapter/repositories/AxiosSlackRepository.js +124 -0
- package/bin/adapter/repositories/AxiosSlackRepository.js.map +1 -0
- package/bin/adapter/repositories/BaseGitHubRepository.js +136 -0
- package/bin/adapter/repositories/BaseGitHubRepository.js.map +1 -0
- package/bin/adapter/repositories/GoogleSpreadsheetRepository.js +123 -0
- package/bin/adapter/repositories/GoogleSpreadsheetRepository.js.map +1 -0
- package/bin/adapter/repositories/GraphqlProjectRepository.js +167 -0
- package/bin/adapter/repositories/GraphqlProjectRepository.js.map +1 -0
- package/bin/adapter/repositories/LocalStorageCacheRepository.js +46 -0
- package/bin/adapter/repositories/LocalStorageCacheRepository.js.map +1 -0
- package/bin/adapter/repositories/LocalStorageRepository.js +30 -0
- package/bin/adapter/repositories/LocalStorageRepository.js.map +1 -0
- package/bin/adapter/repositories/SystemDateRepository.js +23 -0
- package/bin/adapter/repositories/SystemDateRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +148 -0
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/ApiV3IssueRepository.js +48 -0
- package/bin/adapter/repositories/issue/ApiV3IssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/CheerioIssueRepository.js +120 -0
- package/bin/adapter/repositories/issue/CheerioIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js +485 -0
- package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js +114 -0
- package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/RestIssueRepository.js +79 -0
- package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/issueTimelineUtils.js +38 -0
- package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +1 -0
- package/bin/adapter/repositories/utils.js +45 -0
- package/bin/adapter/repositories/utils.js.map +1 -0
- package/bin/domain/entities/Issue.js +3 -0
- package/bin/domain/entities/Issue.js.map +1 -0
- package/bin/domain/entities/Member.js +3 -0
- package/bin/domain/entities/Member.js.map +1 -0
- package/bin/domain/entities/Project.js +3 -0
- package/bin/domain/entities/Project.js.map +1 -0
- package/bin/domain/entities/ProjectField.js +3 -0
- package/bin/domain/entities/ProjectField.js.map +1 -0
- package/bin/domain/entities/ProjectFieldSingleSelect.js +3 -0
- package/bin/domain/entities/ProjectFieldSingleSelect.js.map +1 -0
- package/bin/domain/entities/ProjectFieldSingleSelectOption.js +3 -0
- package/bin/domain/entities/ProjectFieldSingleSelectOption.js.map +1 -0
- package/bin/domain/entities/WorkingTime.js +3 -0
- package/bin/domain/entities/WorkingTime.js.map +1 -0
- package/bin/domain/usecases/ActionAnnouncementUseCase.js +46 -0
- package/bin/domain/usecases/ActionAnnouncementUseCase.js.map +1 -0
- package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js +116 -0
- package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js.map +1 -0
- package/bin/domain/usecases/ClearNextActionHourUseCase.js +38 -0
- package/bin/domain/usecases/ClearNextActionHourUseCase.js.map +1 -0
- package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +180 -0
- package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +1 -0
- package/bin/domain/usecases/HandleScheduledEventUseCase.js +122 -0
- package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -0
- package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js +35 -0
- package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/DateRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/DateRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/IssueRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/IssueRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/ProjectRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/ProjectRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/SlackRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/SlackRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/SpreadsheetRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/SpreadsheetRepository.js.map +1 -0
- package/bin/index.js +13 -0
- package/bin/index.js.map +1 -0
- package/commitlint.config.js +6 -0
- package/jest.config.js +19 -0
- package/package.json +80 -0
- package/renovate.json +37 -0
- package/src/adapter/entry-points/cli/index.test.ts +20 -0
- package/src/adapter/entry-points/cli/index.ts +36 -0
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +95 -0
- package/src/adapter/repositories/AxiosSlackRepository.test.ts +119 -0
- package/src/adapter/repositories/AxiosSlackRepository.ts +184 -0
- package/src/adapter/repositories/BaseGitHubRepository.test.ts +95 -0
- package/src/adapter/repositories/BaseGitHubRepository.ts +172 -0
- package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +124 -0
- package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +151 -0
- package/src/adapter/repositories/GraphqlProjectRepository.test.ts +46 -0
- package/src/adapter/repositories/GraphqlProjectRepository.ts +236 -0
- package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +146 -0
- package/src/adapter/repositories/LocalStorageCacheRepository.ts +53 -0
- package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +142 -0
- package/src/adapter/repositories/LocalStorageRepository.test.ts +161 -0
- package/src/adapter/repositories/LocalStorageRepository.ts +21 -0
- package/src/adapter/repositories/SystemDateRepository.ts +20 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +158 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +274 -0
- package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +26 -0
- package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +59 -0
- package/src/adapter/repositories/issue/CheerioIssueRepository.test.ts +6610 -0
- package/src/adapter/repositories/issue/CheerioIssueRepository.ts +127 -0
- package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +49 -0
- package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +745 -0
- package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.test.ts +71 -0
- package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts +263 -0
- package/src/adapter/repositories/issue/RestIssueRepository.test.ts +29 -0
- package/src/adapter/repositories/issue/RestIssueRepository.ts +105 -0
- package/src/adapter/repositories/issue/issueTimelineUtils.test.ts +79 -0
- package/src/adapter/repositories/issue/issueTimelineUtils.ts +52 -0
- package/src/adapter/repositories/utils.test.ts +40 -0
- package/src/adapter/repositories/utils.ts +50 -0
- package/src/domain/entities/Issue.ts +23 -0
- package/src/domain/entities/Member.ts +3 -0
- package/src/domain/entities/Project.ts +29 -0
- package/src/domain/entities/ProjectField.ts +3 -0
- package/src/domain/entities/ProjectFieldSingleSelect.ts +8 -0
- package/src/domain/entities/ProjectFieldSingleSelectOption.ts +8 -0
- package/src/domain/entities/WorkingTime.ts +8 -0
- package/src/domain/usecases/ActionAnnouncementUseCase.ts +76 -0
- package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +209 -0
- package/src/domain/usecases/ClearNextActionHourUseCase.ts +51 -0
- package/src/domain/usecases/GenerateWorkingTimeReportUseCase.test.ts +382 -0
- package/src/domain/usecases/GenerateWorkingTimeReportUseCase.ts +284 -0
- package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +58 -0
- package/src/domain/usecases/HandleScheduledEventUseCase.ts +209 -0
- package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +46 -0
- package/src/domain/usecases/adapter-interfaces/DateRepository.ts +5 -0
- package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +44 -0
- package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +6 -0
- package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +20 -0
- package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +18 -0
- package/src/index.test.ts +8 -0
- package/src/index.ts +7 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +22 -0
- package/types/adapter/entry-points/cli/index.d.ts +3 -0
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -0
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts +11 -0
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -0
- package/types/adapter/repositories/AxiosSlackRepository.d.ts +13 -0
- package/types/adapter/repositories/AxiosSlackRepository.d.ts.map +1 -0
- package/types/adapter/repositories/BaseGitHubRepository.d.ts +32 -0
- package/types/adapter/repositories/BaseGitHubRepository.d.ts.map +1 -0
- package/types/adapter/repositories/GoogleSpreadsheetRepository.d.ts +13 -0
- package/types/adapter/repositories/GoogleSpreadsheetRepository.d.ts.map +1 -0
- package/types/adapter/repositories/GraphqlProjectRepository.d.ts +13 -0
- package/types/adapter/repositories/GraphqlProjectRepository.d.ts.map +1 -0
- package/types/adapter/repositories/LocalStorageCacheRepository.d.ts +12 -0
- package/types/adapter/repositories/LocalStorageCacheRepository.d.ts.map +1 -0
- package/types/adapter/repositories/LocalStorageRepository.d.ts +7 -0
- package/types/adapter/repositories/LocalStorageRepository.d.ts.map +1 -0
- package/types/adapter/repositories/SystemDateRepository.d.ts +7 -0
- package/types/adapter/repositories/SystemDateRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +38 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/ApiV3IssueRepository.d.ts +17 -0
- package/types/adapter/repositories/issue/ApiV3IssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts +31 -0
- package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts +39 -0
- package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts +83 -0
- package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/RestIssueRepository.d.ts +16 -0
- package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +12 -0
- package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +1 -0
- package/types/adapter/repositories/utils.d.ts +4 -0
- package/types/adapter/repositories/utils.d.ts.map +1 -0
- package/types/domain/entities/Issue.d.ts +24 -0
- package/types/domain/entities/Issue.d.ts.map +1 -0
- package/types/domain/entities/Member.d.ts +4 -0
- package/types/domain/entities/Member.d.ts.map +1 -0
- package/types/domain/entities/Project.d.ts +29 -0
- package/types/domain/entities/Project.d.ts.map +1 -0
- package/types/domain/entities/ProjectField.d.ts +3 -0
- package/types/domain/entities/ProjectField.d.ts.map +1 -0
- package/types/domain/entities/ProjectFieldSingleSelect.d.ts +8 -0
- package/types/domain/entities/ProjectFieldSingleSelect.d.ts.map +1 -0
- package/types/domain/entities/ProjectFieldSingleSelectOption.d.ts +8 -0
- package/types/domain/entities/ProjectFieldSingleSelectOption.d.ts.map +1 -0
- package/types/domain/entities/WorkingTime.d.ts +8 -0
- package/types/domain/entities/WorkingTime.d.ts.map +1 -0
- package/types/domain/usecases/ActionAnnouncementUseCase.d.ts +17 -0
- package/types/domain/usecases/ActionAnnouncementUseCase.d.ts.map +1 -0
- package/types/domain/usecases/AnalyzeProblemByIssueUseCase.d.ts +26 -0
- package/types/domain/usecases/AnalyzeProblemByIssueUseCase.d.ts.map +1 -0
- package/types/domain/usecases/ClearNextActionHourUseCase.d.ts +14 -0
- package/types/domain/usecases/ClearNextActionHourUseCase.d.ts.map +1 -0
- package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +50 -0
- package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +1 -0
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +63 -0
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -0
- package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts +14 -0
- package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/DateRepository.d.ts +6 -0
- package/types/domain/usecases/adapter-interfaces/DateRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +23 -0
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/ProjectRepository.d.ts +6 -0
- package/types/domain/usecases/adapter-interfaces/ProjectRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/SlackRepository.d.ts +9 -0
- package/types/domain/usecases/adapter-interfaces/SlackRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/SpreadsheetRepository.d.ts +6 -0
- package/types/domain/usecases/adapter-interfaces/SpreadsheetRepository.d.ts.map +1 -0
- package/types/index.d.ts +10 -0
- package/types/index.d.ts.map +1 -0
package/CONTRIBUTING.md
ADDED
|
@@ -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
|
+
[](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/actions/workflows/test.yml)
|
|
4
|
+
[](https://github.com/prettier/prettier)
|
|
5
|
+
[](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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"}
|