github-project-manager 0.1.4 → 0.2.1
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/README.md +89 -50
- package/apps/backend/dist/modules/milestone/milestone.controller.d.ts +12 -0
- package/apps/backend/dist/modules/milestone/milestone.controller.js +59 -0
- package/apps/backend/dist/modules/milestone/milestone.controller.js.map +1 -0
- package/apps/backend/dist/modules/milestone/milestone.module.js +7 -2
- package/apps/backend/dist/modules/milestone/milestone.module.js.map +1 -1
- package/apps/backend/dist/modules/milestone/milestone.service.d.ts +15 -0
- package/apps/backend/dist/modules/milestone/milestone.service.js +75 -0
- package/apps/backend/dist/modules/milestone/milestone.service.js.map +1 -0
- package/apps/backend/dist/modules/project/project.controller.d.ts +1 -0
- package/apps/backend/dist/modules/project/project.controller.js +16 -0
- package/apps/backend/dist/modules/project/project.controller.js.map +1 -1
- package/apps/backend/dist/modules/project/project.entity.d.ts +2 -0
- package/apps/backend/dist/modules/project/project.entity.js +10 -0
- package/apps/backend/dist/modules/project/project.entity.js.map +1 -1
- package/apps/backend/dist/modules/project/project.service.d.ts +1 -0
- package/apps/backend/dist/modules/project/project.service.js +3 -0
- package/apps/backend/dist/modules/project/project.service.js.map +1 -1
- package/apps/backend/dist/modules/sync/github.service.d.ts +18 -0
- package/apps/backend/dist/modules/sync/github.service.js +14 -4
- package/apps/backend/dist/modules/sync/github.service.js.map +1 -1
- package/apps/backend/dist/modules/sync/sync.controller.d.ts +3 -2
- package/apps/backend/dist/modules/sync/sync.controller.js +29 -6
- package/apps/backend/dist/modules/sync/sync.controller.js.map +1 -1
- package/apps/backend/dist/modules/sync/sync.module.js +2 -1
- package/apps/backend/dist/modules/sync/sync.module.js.map +1 -1
- package/apps/backend/dist/modules/sync/sync.service.d.ts +5 -1
- package/apps/backend/dist/modules/sync/sync.service.js +80 -2
- package/apps/backend/dist/modules/sync/sync.service.js.map +1 -1
- package/apps/backend/dist/modules/task/task.controller.d.ts +6 -6
- package/apps/backend/dist/modules/task/task.controller.js +41 -27
- package/apps/backend/dist/modules/task/task.controller.js.map +1 -1
- package/apps/backend/dist/modules/task/task.entity.d.ts +10 -1
- package/apps/backend/dist/modules/task/task.entity.js +27 -0
- package/apps/backend/dist/modules/task/task.entity.js.map +1 -1
- package/apps/backend/dist/modules/task/task.service.js +2 -2
- package/apps/backend/dist/modules/task/task.service.js.map +1 -1
- package/apps/cli/dist/commands/hooks.d.ts +11 -0
- package/apps/cli/dist/commands/hooks.js +113 -0
- package/apps/cli/dist/commands/hooks.js.map +1 -0
- package/apps/cli/dist/commands/init.d.ts +4 -1
- package/apps/cli/dist/commands/init.js +16 -1
- package/apps/cli/dist/commands/init.js.map +1 -1
- package/apps/cli/dist/hooks/hook-registry.d.ts +9 -0
- package/apps/cli/dist/hooks/hook-registry.js +29 -0
- package/apps/cli/dist/hooks/hook-registry.js.map +1 -0
- package/apps/cli/dist/index.js +23 -2
- package/apps/cli/dist/index.js.map +1 -1
- package/apps/cli/dist/utils/settings.d.ts +10 -0
- package/apps/cli/dist/utils/settings.js +93 -0
- package/apps/cli/dist/utils/settings.js.map +1 -0
- package/apps/cli/dist/utils/template.d.ts +1 -0
- package/apps/cli/dist/utils/template.js +20 -0
- package/apps/cli/dist/utils/template.js.map +1 -0
- package/apps/frontend/dist/assets/index-C-VkfAuU.css +1 -0
- package/apps/frontend/dist/assets/index-CJ-smTcW.js +92 -0
- package/apps/frontend/dist/index.html +2 -2
- package/package.json +2 -2
- package/templates/claude-settings-hooks.json +35 -0
- package/templates/hooks/gpm-commit-linker.sh +72 -0
- package/templates/hooks/gpm-response-suggest.sh +63 -0
- package/templates/hooks/gpm-session-briefing.sh +104 -0
- package/apps/frontend/dist/assets/index-5kQElBCK.css +0 -1
- package/apps/frontend/dist/assets/index-DzMlDUgv.js +0 -60
package/README.md
CHANGED
|
@@ -1,65 +1,112 @@
|
|
|
1
1
|
# GPM - GitHub Project Manager
|
|
2
2
|
|
|
3
|
-
GitHub Project V2를 CLI와 웹 UI로 관리하는 도구.
|
|
3
|
+
GitHub Project V2를 CLI와 웹 UI로 관리하는 도구.
|
|
4
|
+
Claude Code에서 AI PM처럼 태스크를 추천받고, 브라우저에서 칸반 보드로 시각화합니다.
|
|
4
5
|
|
|
5
|
-
## 설치
|
|
6
|
+
## 설치 & 세팅 (Claude Code에서 그대로 실행)
|
|
6
7
|
|
|
7
8
|
```bash
|
|
8
|
-
|
|
9
|
+
# 1. GitHub CLI 인증 (아직 안 했다면)
|
|
10
|
+
gh auth login
|
|
11
|
+
|
|
12
|
+
# 2. git repo 안에서 초기화
|
|
13
|
+
npx github-project-manager init
|
|
14
|
+
# → GitHub Project URL 입력
|
|
15
|
+
# → .gpmrc 생성
|
|
16
|
+
# → .claude/skills/gpm/SKILL.md 생성 (Claude Code Skill)
|
|
17
|
+
# → .claude/agents/gpm-pm.md 생성 (AI PM Agent)
|
|
18
|
+
|
|
19
|
+
# 3. 동기화
|
|
20
|
+
npx github-project-manager sync
|
|
9
21
|
```
|
|
10
22
|
|
|
11
|
-
|
|
23
|
+
init 완료 후 Claude Code에서 `/gpm status`, `/gpm next` 등을 바로 사용할 수 있습니다.
|
|
12
24
|
|
|
13
|
-
|
|
14
|
-
- [GitHub CLI](https://cli.github.com/) 설치 및 인증 (`gh auth login`)
|
|
15
|
-
- GitHub Project V2
|
|
25
|
+
## Claude Code 연동
|
|
16
26
|
|
|
17
|
-
|
|
27
|
+
`gpm init`을 실행하면 아래 파일이 자동 생성됩니다:
|
|
18
28
|
|
|
19
|
-
```
|
|
20
|
-
#
|
|
21
|
-
|
|
29
|
+
```
|
|
30
|
+
.gpmrc # GitHub Project 연결 설정
|
|
31
|
+
.claude/skills/gpm/SKILL.md # /gpm 슬래시 커맨드 (Skill)
|
|
32
|
+
.claude/agents/gpm-pm.md # AI PM Agent
|
|
33
|
+
```
|
|
22
34
|
|
|
23
|
-
|
|
24
|
-
npx github-project-manager sync
|
|
35
|
+
### Skill 커맨드 (`/gpm`)
|
|
25
36
|
|
|
26
|
-
|
|
27
|
-
npx github-project-manager task list
|
|
37
|
+
Claude Code에서 슬래시 커맨드로 사용:
|
|
28
38
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
| 커맨드 | 설명 |
|
|
40
|
+
|--------|------|
|
|
41
|
+
| `/gpm next` | 마일스톤 기한 + 최근 작업 맥락 기반으로 다음 태스크 추천 → 선택 → 작업 시작 |
|
|
42
|
+
| `/gpm done` | 현재 작업 완료 처리 (git log 분석으로 태스크 추론 + 사용자 확인) |
|
|
43
|
+
| `/gpm status` | 프로젝트 현황 브리핑 (상태별 집계, 진행 중 태스크, 마일스톤 진행률) |
|
|
44
|
+
| `/gpm plan` | 남은 태스크 분석 → 마일스톤 기한 기준 작업 순서 제안 |
|
|
45
|
+
| `/gpm sync` | GitHub Project와 동기화 |
|
|
46
|
+
| `/gpm create <title>` | 태스크 생성 + 목적/완료기준/구현방향 작업 계획 자동 작성 |
|
|
32
47
|
|
|
33
|
-
|
|
48
|
+
### AI PM Agent (`gpm-pm`)
|
|
34
49
|
|
|
35
|
-
|
|
50
|
+
Claude Code가 자동으로 PM처럼 행동합니다:
|
|
36
51
|
|
|
37
|
-
|
|
38
|
-
|
|
52
|
+
- **"다음 뭐 해?"** → 마일스톤 기한, 최근 작업, 의존성을 분석하여 추천
|
|
53
|
+
- **"이거 끝났어"** → git log에서 작업 추론 + 상태 변경 + 다음 추천
|
|
54
|
+
- **"현황 알려줘"** → 마일스톤 진행률 바 + 리스크 감지 + In Progress 목록
|
|
55
|
+
- **커밋/PR 시** → "이 작업이 #N 태스크와 관련있네요. 완료 처리할까요?"
|
|
56
|
+
|
|
57
|
+
### 기존 프로젝트에 GPM 적용하기
|
|
58
|
+
|
|
59
|
+
이미 CLAUDE.md가 있는 프로젝트에서 GPM을 사용하려면, CLAUDE.md에 아래 내용을 추가하세요:
|
|
60
|
+
|
|
61
|
+
```markdown
|
|
62
|
+
## GPM 태스크 관리
|
|
63
|
+
|
|
64
|
+
이 프로젝트는 [GPM](https://www.npmjs.com/package/github-project-manager)으로 GitHub Project V2 태스크를 관리합니다.
|
|
65
|
+
|
|
66
|
+
### 설정 파일
|
|
67
|
+
- `.gpmrc` — GitHub Project 연결 정보
|
|
68
|
+
- `.claude/skills/gpm/SKILL.md` — /gpm 슬래시 커맨드
|
|
69
|
+
- `.claude/agents/gpm-pm.md` — AI PM Agent
|
|
70
|
+
|
|
71
|
+
### 사용 방법
|
|
72
|
+
- `/gpm next` — 다음 작업 추천 (마일스톤 기한 + 최근 작업 맥락 기반)
|
|
73
|
+
- `/gpm done` — 현재 작업 완료 처리
|
|
74
|
+
- `/gpm status` — 프로젝트 현황 브리핑
|
|
75
|
+
- `/gpm plan` — 작업 계획 수립
|
|
76
|
+
|
|
77
|
+
### 태스크 관리 규칙
|
|
78
|
+
- 새 기능 작업 시작 전 `/gpm next`로 GitHub Project 태스크를 확인한다
|
|
79
|
+
- 작업 완료 후 `/gpm done`으로 태스크 상태를 업데이트한다
|
|
80
|
+
- 새 태스크가 필요하면 `/gpm create`로 GitHub Project에 직접 생성한다
|
|
39
81
|
```
|
|
40
82
|
|
|
83
|
+
이 내용을 CLAUDE.md에 추가하면 Claude Code가 GPM Skill/Agent를 적극적으로 활용합니다.
|
|
84
|
+
|
|
85
|
+
## 사전 조건
|
|
86
|
+
|
|
87
|
+
- Node.js 22+
|
|
88
|
+
- [GitHub CLI](https://cli.github.com/) (`gh auth login`)
|
|
89
|
+
- [Claude Code](https://claude.com/claude-code) (Skill/Agent 사용 시)
|
|
90
|
+
- GitHub Project V2
|
|
91
|
+
|
|
92
|
+
## CLI 명령어
|
|
93
|
+
|
|
41
94
|
### 태스크 관리
|
|
42
95
|
|
|
43
96
|
```bash
|
|
44
97
|
npx github-project-manager task list # 태스크 목록
|
|
45
|
-
npx github-project-manager task list --json # JSON 출력
|
|
98
|
+
npx github-project-manager task list --json # JSON 출력
|
|
46
99
|
npx github-project-manager task show <id> # 태스크 상세
|
|
47
100
|
npx github-project-manager task create <title> # 태스크 생성 (GitHub에 직접 반영)
|
|
48
|
-
npx github-project-manager task update <id> # 태스크 수정
|
|
49
101
|
npx github-project-manager task status <id> <status> # 상태 변경
|
|
50
102
|
npx github-project-manager task delete <id> # 태스크 삭제
|
|
51
103
|
```
|
|
52
104
|
|
|
53
|
-
### 동기화
|
|
105
|
+
### 동기화 & 서버
|
|
54
106
|
|
|
55
107
|
```bash
|
|
56
108
|
npx github-project-manager sync # GitHub → 로컬 DB 동기화
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
### 웹 서버
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
npx github-project-manager server # API + 웹 UI 서버 시작 (포트 6170)
|
|
109
|
+
npx github-project-manager server # 웹 UI 서버 시작 (포트 6170)
|
|
63
110
|
npx github-project-manager server --port 8080 # 포트 변경
|
|
64
111
|
npx github-project-manager server --no-open # 브라우저 자동 열기 비활성화
|
|
65
112
|
```
|
|
@@ -68,23 +115,16 @@ npx github-project-manager server --no-open # 브라우저 자동 열
|
|
|
68
115
|
|
|
69
116
|
## 아키텍처
|
|
70
117
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
npx github-project-manager task create "제목"
|
|
76
|
-
→ GitHub Project에 Draft Issue 직접 생성
|
|
77
|
-
|
|
78
|
-
npx github-project-manager sync
|
|
79
|
-
→ GitHub → 로컬 SQLite DB (Pull only)
|
|
118
|
+
- **GitHub = SSOT**: 쓰기는 GitHub API에 직접 반영, 로컬 DB는 읽기 캐시 (Pull-only sync)
|
|
119
|
+
- **멀티 프로젝트**: 하나의 서버에서 여러 GitHub Project 관리 (`.gpmrc`로 식별)
|
|
120
|
+
- **CLI 독립 실행**: NestJS Standalone Mode로 서버 없이도 CLI 사용 가능
|
|
80
121
|
|
|
81
|
-
npx github-project-manager server (port 6170)
|
|
82
|
-
→ NestJS API + React 웹 UI 단일 포트 서빙
|
|
83
122
|
```
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
123
|
+
gpm init → .gpmrc + .claude/skills + .claude/agents 생성
|
|
124
|
+
gpm task create → GitHub Project에 Draft Issue 직접 생성
|
|
125
|
+
gpm sync → GitHub → 로컬 SQLite DB
|
|
126
|
+
gpm server → NestJS API + React 웹 UI (단일 포트)
|
|
127
|
+
```
|
|
88
128
|
|
|
89
129
|
## 기술 스택
|
|
90
130
|
|
|
@@ -94,11 +134,11 @@ npx github-project-manager server (port 6170)
|
|
|
94
134
|
| Backend | NestJS, TypeORM, SQLite |
|
|
95
135
|
| Frontend | React, Vite, TailwindCSS |
|
|
96
136
|
| GitHub API | Octokit GraphQL API v4 |
|
|
137
|
+
| AI 연동 | Claude Code Skill + Agent |
|
|
97
138
|
|
|
98
139
|
## 개발
|
|
99
140
|
|
|
100
141
|
```bash
|
|
101
|
-
# 의존성 설치
|
|
102
142
|
yarn install
|
|
103
143
|
|
|
104
144
|
# 개발 서버 (터미널 2개)
|
|
@@ -115,9 +155,8 @@ yarn gpm -- task list
|
|
|
115
155
|
## 배포
|
|
116
156
|
|
|
117
157
|
```bash
|
|
118
|
-
./deploy.sh patch # 0.1.
|
|
119
|
-
./deploy.sh minor # 0.
|
|
120
|
-
./deploy.sh major # 0.1.0 → 1.0.0
|
|
158
|
+
./deploy.sh patch # 0.1.x → patch 버전 업
|
|
159
|
+
./deploy.sh minor # 0.x.0 → minor 버전 업
|
|
121
160
|
```
|
|
122
161
|
|
|
123
162
|
`v*` 태그 push 시 GitHub Actions가 자동으로 npm에 배포합니다.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MilestoneService } from './milestone.service';
|
|
2
|
+
export declare class MilestoneController {
|
|
3
|
+
private readonly milestoneService;
|
|
4
|
+
constructor(milestoneService: MilestoneService);
|
|
5
|
+
findAll(projectId?: string): Promise<(import("./milestone.entity").Milestone & {
|
|
6
|
+
taskCount: number;
|
|
7
|
+
doneCount: number;
|
|
8
|
+
})[]>;
|
|
9
|
+
findOne(id: number): Promise<import("./milestone.entity").Milestone & {
|
|
10
|
+
tasks: import("../task/task.entity").Task[];
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MilestoneController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const milestone_service_1 = require("./milestone.service");
|
|
18
|
+
let MilestoneController = class MilestoneController {
|
|
19
|
+
milestoneService;
|
|
20
|
+
constructor(milestoneService) {
|
|
21
|
+
this.milestoneService = milestoneService;
|
|
22
|
+
}
|
|
23
|
+
async findAll(projectId) {
|
|
24
|
+
if (!projectId) {
|
|
25
|
+
throw new common_1.BadRequestException('projectId query parameter is required');
|
|
26
|
+
}
|
|
27
|
+
const parsed = Number(projectId);
|
|
28
|
+
if (Number.isNaN(parsed)) {
|
|
29
|
+
throw new common_1.BadRequestException('projectId must be a number');
|
|
30
|
+
}
|
|
31
|
+
return this.milestoneService.findAllByProject(parsed);
|
|
32
|
+
}
|
|
33
|
+
async findOne(id) {
|
|
34
|
+
const milestone = await this.milestoneService.findOne(id);
|
|
35
|
+
if (!milestone)
|
|
36
|
+
throw new common_1.NotFoundException(`Milestone #${id} not found`);
|
|
37
|
+
return milestone;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
exports.MilestoneController = MilestoneController;
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, common_1.Get)(),
|
|
43
|
+
__param(0, (0, common_1.Query)('projectId')),
|
|
44
|
+
__metadata("design:type", Function),
|
|
45
|
+
__metadata("design:paramtypes", [String]),
|
|
46
|
+
__metadata("design:returntype", Promise)
|
|
47
|
+
], MilestoneController.prototype, "findAll", null);
|
|
48
|
+
__decorate([
|
|
49
|
+
(0, common_1.Get)(':id'),
|
|
50
|
+
__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
|
|
51
|
+
__metadata("design:type", Function),
|
|
52
|
+
__metadata("design:paramtypes", [Number]),
|
|
53
|
+
__metadata("design:returntype", Promise)
|
|
54
|
+
], MilestoneController.prototype, "findOne", null);
|
|
55
|
+
exports.MilestoneController = MilestoneController = __decorate([
|
|
56
|
+
(0, common_1.Controller)('milestones'),
|
|
57
|
+
__metadata("design:paramtypes", [milestone_service_1.MilestoneService])
|
|
58
|
+
], MilestoneController);
|
|
59
|
+
//# sourceMappingURL=milestone.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"milestone.controller.js","sourceRoot":"","sources":["../../../src/modules/milestone/milestone.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAQwB;AACxB,2DAAuD;AAGhD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACD;IAA7B,YAA6B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;IAAG,CAAC;IAG7D,AAAN,KAAK,CAAC,OAAO,CAAqB,SAAkB;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,4BAAmB,CAAC,uCAAuC,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAA4B,EAAU;QACjD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,0BAAiB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAC1E,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAA;AArBY,kDAAmB;AAIxB;IADL,IAAA,YAAG,GAAE;IACS,WAAA,IAAA,cAAK,EAAC,WAAW,CAAC,CAAA;;;;kDAShC;AAGK;IADL,IAAA,YAAG,EAAC,KAAK,CAAC;IACI,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;;;;kDAIvC;8BApBU,mBAAmB;IAD/B,IAAA,mBAAU,EAAC,YAAY,CAAC;qCAEwB,oCAAgB;GADpD,mBAAmB,CAqB/B"}
|
|
@@ -10,13 +10,18 @@ exports.MilestoneModule = void 0;
|
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
11
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
12
12
|
const milestone_entity_1 = require("./milestone.entity");
|
|
13
|
+
const milestone_service_1 = require("./milestone.service");
|
|
14
|
+
const milestone_controller_1 = require("./milestone.controller");
|
|
15
|
+
const task_entity_1 = require("../task/task.entity");
|
|
13
16
|
let MilestoneModule = class MilestoneModule {
|
|
14
17
|
};
|
|
15
18
|
exports.MilestoneModule = MilestoneModule;
|
|
16
19
|
exports.MilestoneModule = MilestoneModule = __decorate([
|
|
17
20
|
(0, common_1.Module)({
|
|
18
|
-
imports: [typeorm_1.TypeOrmModule.forFeature([milestone_entity_1.Milestone])],
|
|
19
|
-
|
|
21
|
+
imports: [typeorm_1.TypeOrmModule.forFeature([milestone_entity_1.Milestone, task_entity_1.Task])],
|
|
22
|
+
controllers: [milestone_controller_1.MilestoneController],
|
|
23
|
+
providers: [milestone_service_1.MilestoneService],
|
|
24
|
+
exports: [milestone_service_1.MilestoneService, typeorm_1.TypeOrmModule],
|
|
20
25
|
})
|
|
21
26
|
], MilestoneModule);
|
|
22
27
|
//# sourceMappingURL=milestone.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"milestone.module.js","sourceRoot":"","sources":["../../../src/modules/milestone/milestone.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAAgD;AAChD,yDAA+C;
|
|
1
|
+
{"version":3,"file":"milestone.module.js","sourceRoot":"","sources":["../../../src/modules/milestone/milestone.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAAgD;AAChD,yDAA+C;AAC/C,2DAAuD;AACvD,iEAA6D;AAC7D,qDAA2C;AAQpC,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAN3B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,uBAAa,CAAC,UAAU,CAAC,CAAC,4BAAS,EAAE,kBAAI,CAAC,CAAC,CAAC;QACtD,WAAW,EAAE,CAAC,0CAAmB,CAAC;QAClC,SAAS,EAAE,CAAC,oCAAgB,CAAC;QAC7B,OAAO,EAAE,CAAC,oCAAgB,EAAE,uBAAa,CAAC;KAC3C,CAAC;GACW,eAAe,CAAG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Repository } from 'typeorm';
|
|
2
|
+
import { Milestone } from './milestone.entity';
|
|
3
|
+
import { Task } from '../task/task.entity';
|
|
4
|
+
export declare class MilestoneService {
|
|
5
|
+
private readonly milestoneRepo;
|
|
6
|
+
private readonly taskRepo;
|
|
7
|
+
constructor(milestoneRepo: Repository<Milestone>, taskRepo: Repository<Task>);
|
|
8
|
+
findAllByProject(projectId: number): Promise<(Milestone & {
|
|
9
|
+
taskCount: number;
|
|
10
|
+
doneCount: number;
|
|
11
|
+
})[]>;
|
|
12
|
+
findOne(id: number): Promise<(Milestone & {
|
|
13
|
+
tasks: Task[];
|
|
14
|
+
}) | null>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MilestoneService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
18
|
+
const typeorm_2 = require("typeorm");
|
|
19
|
+
const milestone_entity_1 = require("./milestone.entity");
|
|
20
|
+
const task_entity_1 = require("../task/task.entity");
|
|
21
|
+
let MilestoneService = class MilestoneService {
|
|
22
|
+
milestoneRepo;
|
|
23
|
+
taskRepo;
|
|
24
|
+
constructor(milestoneRepo, taskRepo) {
|
|
25
|
+
this.milestoneRepo = milestoneRepo;
|
|
26
|
+
this.taskRepo = taskRepo;
|
|
27
|
+
}
|
|
28
|
+
async findAllByProject(projectId) {
|
|
29
|
+
const milestones = await this.milestoneRepo.find({
|
|
30
|
+
where: { projectId },
|
|
31
|
+
order: { dueDate: 'ASC' },
|
|
32
|
+
});
|
|
33
|
+
if (milestones.length === 0)
|
|
34
|
+
return [];
|
|
35
|
+
const milestoneIds = milestones.map((m) => m.id);
|
|
36
|
+
const counts = await this.taskRepo
|
|
37
|
+
.createQueryBuilder('task')
|
|
38
|
+
.select('task.milestoneId', 'milestoneId')
|
|
39
|
+
.addSelect('COUNT(*)', 'total')
|
|
40
|
+
.addSelect('SUM(CASE WHEN task.status = :done THEN 1 ELSE 0 END)', 'doneCount')
|
|
41
|
+
.where('task.milestoneId IN (:...milestoneIds)', { milestoneIds })
|
|
42
|
+
.setParameter('done', 'Done')
|
|
43
|
+
.groupBy('task.milestoneId')
|
|
44
|
+
.getRawMany();
|
|
45
|
+
const countMap = new Map(counts.map((c) => [c.milestoneId, { total: Number(c.total), done: Number(c.doneCount) }]));
|
|
46
|
+
return milestones.map((milestone) => {
|
|
47
|
+
const counts = countMap.get(milestone.id) ?? { total: 0, done: 0 };
|
|
48
|
+
return {
|
|
49
|
+
...milestone,
|
|
50
|
+
taskCount: counts.total,
|
|
51
|
+
doneCount: counts.done,
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async findOne(id) {
|
|
56
|
+
const milestone = await this.milestoneRepo.findOneBy({ id });
|
|
57
|
+
if (!milestone)
|
|
58
|
+
return null;
|
|
59
|
+
const tasks = await this.taskRepo.find({
|
|
60
|
+
where: { milestoneId: milestone.id },
|
|
61
|
+
relations: ['labels'],
|
|
62
|
+
order: { createdAt: 'DESC' },
|
|
63
|
+
});
|
|
64
|
+
return { ...milestone, tasks };
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
exports.MilestoneService = MilestoneService;
|
|
68
|
+
exports.MilestoneService = MilestoneService = __decorate([
|
|
69
|
+
(0, common_1.Injectable)(),
|
|
70
|
+
__param(0, (0, typeorm_1.InjectRepository)(milestone_entity_1.Milestone)),
|
|
71
|
+
__param(1, (0, typeorm_1.InjectRepository)(task_entity_1.Task)),
|
|
72
|
+
__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
73
|
+
typeorm_2.Repository])
|
|
74
|
+
], MilestoneService);
|
|
75
|
+
//# sourceMappingURL=milestone.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"milestone.service.js","sourceRoot":"","sources":["../../../src/modules/milestone/milestone.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,yDAA+C;AAC/C,qDAA2C;AAGpC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAGR;IAEA;IAJnB,YAEmB,aAAoC,EAEpC,QAA0B;QAF1B,kBAAa,GAAb,aAAa,CAAuB;QAEpC,aAAQ,GAAR,QAAQ,CAAkB;IAC1C,CAAC;IAEJ,KAAK,CAAC,gBAAgB,CACpB,SAAiB;QAEjB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC/C,KAAK,EAAE,EAAE,SAAS,EAAE;YACpB,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SAC1B,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEvC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAGjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ;aAC/B,kBAAkB,CAAC,MAAM,CAAC;aAC1B,MAAM,CAAC,kBAAkB,EAAE,aAAa,CAAC;aACzC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;aAC9B,SAAS,CAAC,sDAAsD,EAAE,WAAW,CAAC;aAC9E,KAAK,CAAC,wCAAwC,EAAE,EAAE,YAAY,EAAE,CAAC;aACjE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;aAC5B,OAAO,CAAC,kBAAkB,CAAC;aAC3B,UAAU,EAA6D,CAAC;QAE3E,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAC1F,CAAC;QAEF,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACnE,OAAO;gBACL,GAAG,SAAS;gBACZ,SAAS,EAAE,MAAM,CAAC,KAAK;gBACvB,SAAS,EAAE,MAAM,CAAC,IAAI;aACvB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CACX,EAAU;QAEV,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACrC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE;YACpC,SAAS,EAAE,CAAC,QAAQ,CAAC;YACrB,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;SAC7B,CAAC,CAAC;QAEH,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC;IACjC,CAAC;CACF,CAAA;AA3DY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,4BAAS,CAAC,CAAA;IAE3B,WAAA,IAAA,0BAAgB,EAAC,kBAAI,CAAC,CAAA;qCADS,oBAAU;QAEf,oBAAU;GAL5B,gBAAgB,CA2D5B"}
|
|
@@ -8,6 +8,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
exports.ProjectController = void 0;
|
|
13
16
|
const common_1 = require("@nestjs/common");
|
|
@@ -20,6 +23,12 @@ let ProjectController = class ProjectController {
|
|
|
20
23
|
async findAll() {
|
|
21
24
|
return this.projectService.findAll();
|
|
22
25
|
}
|
|
26
|
+
async findOne(id) {
|
|
27
|
+
const project = await this.projectService.findById(id);
|
|
28
|
+
if (!project)
|
|
29
|
+
throw new common_1.NotFoundException(`Project #${id} not found`);
|
|
30
|
+
return project;
|
|
31
|
+
}
|
|
23
32
|
};
|
|
24
33
|
exports.ProjectController = ProjectController;
|
|
25
34
|
__decorate([
|
|
@@ -28,6 +37,13 @@ __decorate([
|
|
|
28
37
|
__metadata("design:paramtypes", []),
|
|
29
38
|
__metadata("design:returntype", Promise)
|
|
30
39
|
], ProjectController.prototype, "findAll", null);
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, common_1.Get)(':id'),
|
|
42
|
+
__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
|
|
43
|
+
__metadata("design:type", Function),
|
|
44
|
+
__metadata("design:paramtypes", [Number]),
|
|
45
|
+
__metadata("design:returntype", Promise)
|
|
46
|
+
], ProjectController.prototype, "findOne", null);
|
|
31
47
|
exports.ProjectController = ProjectController = __decorate([
|
|
32
48
|
(0, common_1.Controller)('projects'),
|
|
33
49
|
__metadata("design:paramtypes", [project_service_1.ProjectService])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.controller.js","sourceRoot":"","sources":["../../../src/modules/project/project.controller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project.controller.js","sourceRoot":"","sources":["../../../src/modules/project/project.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAyF;AACzF,uDAAmD;AAG5C,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACC;IAA7B,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAGzD,AAAN,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IACvC,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAA4B,EAAU;QACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,0BAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAA;AAdY,8CAAiB;AAItB;IADL,IAAA,YAAG,GAAE;;;;gDAGL;AAGK;IADL,IAAA,YAAG,EAAC,KAAK,CAAC;IACI,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;;;;gDAIvC;4BAbU,iBAAiB;IAD7B,IAAA,mBAAU,EAAC,UAAU,CAAC;qCAEwB,gCAAc;GADhD,iBAAiB,CAc7B"}
|
|
@@ -23,6 +23,8 @@ let Project = class Project {
|
|
|
23
23
|
projectNumber;
|
|
24
24
|
projectUrl;
|
|
25
25
|
githubProjectId;
|
|
26
|
+
statusOptions;
|
|
27
|
+
statusOptionsFetchedAt;
|
|
26
28
|
createdAt;
|
|
27
29
|
updatedAt;
|
|
28
30
|
tasks;
|
|
@@ -59,6 +61,14 @@ __decorate([
|
|
|
59
61
|
(0, typeorm_1.Column)({ name: 'github_project_id', nullable: true }),
|
|
60
62
|
__metadata("design:type", String)
|
|
61
63
|
], Project.prototype, "githubProjectId", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
(0, typeorm_1.Column)({ name: 'status_options', type: 'simple-json', nullable: true }),
|
|
66
|
+
__metadata("design:type", Object)
|
|
67
|
+
], Project.prototype, "statusOptions", void 0);
|
|
68
|
+
__decorate([
|
|
69
|
+
(0, typeorm_1.Column)({ name: 'status_options_fetched_at', type: 'datetime', nullable: true }),
|
|
70
|
+
__metadata("design:type", Object)
|
|
71
|
+
], Project.prototype, "statusOptionsFetchedAt", void 0);
|
|
62
72
|
__decorate([
|
|
63
73
|
(0, typeorm_1.CreateDateColumn)({ name: 'created_at' }),
|
|
64
74
|
__metadata("design:type", Date)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.entity.js","sourceRoot":"","sources":["../../../src/modules/project/project.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAQiB;AACjB,qDAA2C;AAC3C,wDAA8C;AAC9C,oEAA0D;AAC1D,6DAAkD;AAI3C,IAAM,OAAO,GAAb,MAAM,OAAO;IAElB,EAAE,CAAS;IAGX,KAAK,CAAS;IAGd,SAAS,CAAS;IAGlB,IAAI,CAAS;IAGb,aAAa,CAAS;IAGtB,UAAU,CAAS;IAGnB,eAAe,CAAS;IAGxB,SAAS,CAAO;IAGhB,SAAS,CAAO;IAGhB,KAAK,CAAS;IAGd,MAAM,CAAU;IAGhB,UAAU,CAAc;IAGxB,QAAQ,CAAY;CACrB,CAAA;
|
|
1
|
+
{"version":3,"file":"project.entity.js","sourceRoot":"","sources":["../../../src/modules/project/project.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAQiB;AACjB,qDAA2C;AAC3C,wDAA8C;AAC9C,oEAA0D;AAC1D,6DAAkD;AAI3C,IAAM,OAAO,GAAb,MAAM,OAAO;IAElB,EAAE,CAAS;IAGX,KAAK,CAAS;IAGd,SAAS,CAAS;IAGlB,IAAI,CAAS;IAGb,aAAa,CAAS;IAGtB,UAAU,CAAS;IAGnB,eAAe,CAAS;IAGxB,aAAa,CAAkB;IAG/B,sBAAsB,CAAc;IAGpC,SAAS,CAAO;IAGhB,SAAS,CAAO;IAGhB,KAAK,CAAS;IAGd,MAAM,CAAU;IAGhB,UAAU,CAAc;IAGxB,QAAQ,CAAY;CACrB,CAAA;AA7CY,0BAAO;AAElB;IADC,IAAA,gCAAsB,GAAE;;mCACd;AAGX;IADC,IAAA,gBAAM,GAAE;;sCACK;AAGd;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;;0CACtC;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qCACd;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;;8CACb;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;2CACb;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;gDAC9B;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CACzC;AAG/B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDAC5C;AAGpC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC9B,IAAI;0CAAC;AAGhB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC9B,IAAI;0CAAC;AAGhB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;;sCAChC;AAGd;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,oBAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;;uCACjC;AAGhB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,4BAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;;2CACrC;AAGxB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yBAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;;yCACnC;kBA5CT,OAAO;IAFnB,IAAA,gBAAM,EAAC,UAAU,CAAC;IAClB,IAAA,gBAAM,EAAC,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;GACtB,OAAO,CA6CnB"}
|
|
@@ -7,4 +7,5 @@ export declare class ProjectService {
|
|
|
7
7
|
findById(id: number): Promise<Project | null>;
|
|
8
8
|
findOrCreate(owner: string, projectNumber: number, extra?: Partial<Pick<Project, 'ownerType' | 'repo' | 'projectUrl'>>): Promise<Project>;
|
|
9
9
|
findByOwnerAndNumber(owner: string, projectNumber: number): Promise<Project | null>;
|
|
10
|
+
save(project: Project): Promise<Project>;
|
|
10
11
|
}
|
|
@@ -49,6 +49,9 @@ let ProjectService = class ProjectService {
|
|
|
49
49
|
async findByOwnerAndNumber(owner, projectNumber) {
|
|
50
50
|
return this.projectRepo.findOneBy({ owner, projectNumber });
|
|
51
51
|
}
|
|
52
|
+
async save(project) {
|
|
53
|
+
return this.projectRepo.save(project);
|
|
54
|
+
}
|
|
52
55
|
};
|
|
53
56
|
exports.ProjectService = ProjectService;
|
|
54
57
|
exports.ProjectService = ProjectService = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../../src/modules/project/project.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,qDAA2C;AAGpC,IAAM,cAAc,GAApB,MAAM,cAAc;IAGN;IAFnB,YAEmB,WAAgC;QAAhC,gBAAW,GAAX,WAAW,CAAqB;IAChD,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,aAAqB,EACrB,KAAmE;QAEnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAC5E,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACtC,KAAK;YACL,aAAa;YACb,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,EAAE;YACnC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,cAAc;YAC7C,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,SAAS;SAC/B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAa,EAAE,aAAqB;QAC7D,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9D,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../../src/modules/project/project.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAAqC;AACrC,qDAA2C;AAGpC,IAAM,cAAc,GAApB,MAAM,cAAc;IAGN;IAFnB,YAEmB,WAAgC;QAAhC,gBAAW,GAAX,WAAW,CAAqB;IAChD,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,aAAqB,EACrB,KAAmE;QAEnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAC5E,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACtC,KAAK;YACL,aAAa;YACb,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,EAAE;YACnC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,cAAc;YAC7C,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,SAAS;SAC/B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAa,EAAE,aAAqB;QAC7D,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAgB;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACF,CAAA;AA7CY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,wBAAO,CAAC,CAAA;qCACI,oBAAU;GAH/B,cAAc,CA6C1B"}
|
|
@@ -5,6 +5,14 @@ interface ProjectItem {
|
|
|
5
5
|
title?: string;
|
|
6
6
|
body?: string;
|
|
7
7
|
updatedAt?: string;
|
|
8
|
+
headRefName?: string;
|
|
9
|
+
linkedBranches?: {
|
|
10
|
+
nodes: {
|
|
11
|
+
ref: {
|
|
12
|
+
name: string;
|
|
13
|
+
};
|
|
14
|
+
}[];
|
|
15
|
+
};
|
|
8
16
|
labels?: {
|
|
9
17
|
nodes: {
|
|
10
18
|
name: string;
|
|
@@ -14,10 +22,20 @@ interface ProjectItem {
|
|
|
14
22
|
assignees?: {
|
|
15
23
|
nodes: {
|
|
16
24
|
login: string;
|
|
25
|
+
avatarUrl: string;
|
|
17
26
|
}[];
|
|
18
27
|
};
|
|
28
|
+
author?: {
|
|
29
|
+
login: string;
|
|
30
|
+
avatarUrl: string;
|
|
31
|
+
} | null;
|
|
19
32
|
milestone?: {
|
|
33
|
+
id: string;
|
|
20
34
|
title: string;
|
|
35
|
+
description: string | null;
|
|
36
|
+
dueOn: string | null;
|
|
37
|
+
state: string;
|
|
38
|
+
number: number;
|
|
21
39
|
} | null;
|
|
22
40
|
} | null;
|
|
23
41
|
fieldValues: {
|
|
@@ -64,25 +64,35 @@ let GitHubService = class GitHubService {
|
|
|
64
64
|
title
|
|
65
65
|
body
|
|
66
66
|
updatedAt
|
|
67
|
+
author { login avatarUrl }
|
|
67
68
|
labels(first: 20) {
|
|
68
69
|
nodes { name color }
|
|
69
70
|
}
|
|
70
71
|
assignees(first: 10) {
|
|
71
|
-
nodes { login }
|
|
72
|
+
nodes { login avatarUrl }
|
|
73
|
+
}
|
|
74
|
+
milestone { id title description dueOn state number }
|
|
75
|
+
linkedBranches(first: 1) {
|
|
76
|
+
nodes {
|
|
77
|
+
ref {
|
|
78
|
+
name
|
|
79
|
+
}
|
|
80
|
+
}
|
|
72
81
|
}
|
|
73
|
-
milestone { title }
|
|
74
82
|
}
|
|
75
83
|
... on PullRequest {
|
|
76
84
|
title
|
|
77
85
|
body
|
|
78
86
|
updatedAt
|
|
87
|
+
headRefName
|
|
88
|
+
author { login avatarUrl }
|
|
79
89
|
labels(first: 20) {
|
|
80
90
|
nodes { name color }
|
|
81
91
|
}
|
|
82
92
|
assignees(first: 10) {
|
|
83
|
-
nodes { login }
|
|
93
|
+
nodes { login avatarUrl }
|
|
84
94
|
}
|
|
85
|
-
milestone { title }
|
|
95
|
+
milestone { id title description dueOn state number }
|
|
86
96
|
}
|
|
87
97
|
}
|
|
88
98
|
fieldValues(first: 20) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.service.js","sourceRoot":"","sources":["../../../src/modules/sync/github.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,8CAA2C;AAC3C,iDAAyC;
|
|
1
|
+
{"version":3,"file":"github.service.js","sourceRoot":"","sources":["../../../src/modules/sync/github.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { SyncService, SyncResult } from './sync.service';
|
|
|
3
3
|
export declare class SyncController {
|
|
4
4
|
private readonly syncService;
|
|
5
5
|
constructor(syncService: SyncService);
|
|
6
|
-
private
|
|
7
|
-
pull(req: Request): Promise<SyncResult>;
|
|
6
|
+
private getProjectId;
|
|
7
|
+
pull(req: Request, projectId?: string): Promise<SyncResult>;
|
|
8
|
+
statusOptions(req: Request, projectId?: string, force?: string): Promise<string[]>;
|
|
8
9
|
}
|