GET/api/projects
워크스페이스 단위의 프로젝트 목록 조회 및 신규 프로젝트 생성을 담당한다.
API 라우트: GET/POST /api/projects
워크스페이스 단위의 프로젝트 목록 조회 및 신규 프로젝트 생성을 담당한다.
- GET: 특정 워크스페이스의 프로젝트 목록 반환 (Redis 60초 캐시 적용)
- POST: 새 프로젝트 생성 — 이슈 상태(DEFAULT_STATUSES) 자동 삽입, 생성자를 admin으로 등록,
activity 로그 기록 후 워크스페이스 캐시 무효화
권한: 두 메서드 모두 requireWorkspaceMember (워크스페이스 멤버 이상)
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/projects \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
POST/api/projects
워크스페이스 단위의 프로젝트 목록 조회 및 신규 프로젝트 생성을 담당한다.
API 라우트: GET/POST /api/projects
워크스페이스 단위의 프로젝트 목록 조회 및 신규 프로젝트 생성을 담당한다.
- GET: 특정 워크스페이스의 프로젝트 목록 반환 (Redis 60초 캐시 적용)
- POST: 새 프로젝트 생성 — 이슈 상태(DEFAULT_STATUSES) 자동 삽입, 생성자를 admin으로 등록,
activity 로그 기록 후 워크스페이스 캐시 무효화
권한: 두 메서드 모두 requireWorkspaceMember (워크스페이스 멤버 이상)
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Request body
workspaceIdstring<uuid>required
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/projects \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"workspaceId":"00000000-0000-0000-0000-000000000000","name":"string","key":"string"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"workspaceId": "00000000-0000-0000-0000-000000000000",
"name": "string",
"key": "string"
})
});
const data = await res.json();
GET/api/projects/{projectId}
단일 프로젝트 CRUD 라우트.
/api/projects/[projectId] — 단일 프로젝트 CRUD 라우트.
GET : 프로젝트 상세 조회 (프로젝트 멤버라면 누구나)
PATCH: 프로젝트 메타 수정 (워크스페이스 어드민 전용)
이 라우트는 프로젝트 자체의 식별·표시 메타(name/description/icon/color)만 다룬다.
이슈·스프린트·멤버·레포 등은 각자의 하위 라우트에서 처리한다.
PATCH 성공 시: 워크스페이스 프로젝트 목록 Redis 캐시를 invalidate 하고
activity_logs 에 변경 내용을 기록한다.
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/projects/{projectId} \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
PATCH/api/projects/{projectId}
단일 프로젝트 CRUD 라우트.
/api/projects/[projectId] — 단일 프로젝트 CRUD 라우트.
GET : 프로젝트 상세 조회 (프로젝트 멤버라면 누구나)
PATCH: 프로젝트 메타 수정 (워크스페이스 어드민 전용)
이 라우트는 프로젝트 자체의 식별·표시 메타(name/description/icon/color)만 다룬다.
이슈·스프린트·멤버·레포 등은 각자의 하위 라우트에서 처리한다.
PATCH 성공 시: 워크스페이스 프로젝트 목록 Redis 캐시를 invalidate 하고
activity_logs 에 변경 내용을 기록한다.
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X PATCH https://sit.in-bridge.com/api/projects/{projectId} \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"string","description":"string","icon":"string","color":"string"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}", {
method: "PATCH",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "string",
"description": "string",
"icon": "string",
"color": "string"
})
});
const data = await res.json();
GET/api/projects/{projectId}/issues-git-activity
GET /api/projects/{projectId}/issues-git-activity
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/projects/{projectId}/issues-git-activity \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/issues-git-activity", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
POST/api/projects/{projectId}/issues/bulk-from-github
github
API 라우트: /api/projects/[projectId]/issues/bulk-from-github
Git 통합 화면에서 사용자가 선택한 커밋·PR·GitHub Issue 후보를
일괄로 index-pm issues 에 변환·생성하는 Phase D 엔드포인트.
POST — 선택 목록(selections)을 받아 gh_* 미러 테이블에서 조회 후
issues 행을 일괄 INSERT 한다. 부분 성공 허용.
권한: 프로젝트 소속 워크스페이스 멤버.
@author jijuta ([email protected])
@since 2026-05-15
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Request body
selectionsstring<uuid>required
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/projects/{projectId}/issues/bulk-from-github \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"selections":"00000000-0000-0000-0000-000000000000"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/issues/bulk-from-github", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"selections": "00000000-0000-0000-0000-000000000000"
})
});
const data = await res.json();
POST/api/projects/{projectId}/issues/import
GitHub PR/커밋 → index-pm 이슈 가져오기 라우트.
POST /api/projects/[projectId]/issues/import
GitHub PR/커밋 → index-pm 이슈 가져오기 라우트.
연결된 repo 들의 PR·커밋을 분석해 이슈 후보(ImportCandidate)를 생성하고,
dryRun=false 일 때 실제 issues 테이블에 insert 한다.
상세 흐름·권한·응답 스키마는 아래 POST 핸들러 jsdoc 참고.
점수·등급·평가 노출 금지 원칙 준수 (CLAUDE.md §제품 철학).
@author jijuta ([email protected])
@since 2026-05-15
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Request body
stateenumrequired
openclosedall
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/projects/{projectId}/issues/import \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"dryRun":true,"state":"open","perRepoLimit":null,"withAi":true,"aiRefineModel":"string"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/issues/import", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"dryRun": true,
"state": "open",
"perRepoLimit": null,
"withAi": true,
"aiRefineModel": "string"
})
});
const data = await res.json();
GET/api/projects/{projectId}/links
프로젝트 이슈 간 링크(의존 관계) 일괄 조회 라우트.
GET /api/projects/[projectId]/links
프로젝트 이슈 간 링크(의존 관계) 일괄 조회 라우트.
issueLinks 테이블은 이슈 쌍에 대한 관계 유형(blocks/blocked_by/relates_to/duplicates 등)을
양방향으로 저장한다. 이 엔드포인트는 한 프로젝트의 모든 링크를 한 번에 반환해,
간트 차트의 의존성 화살표나 보드의 차단 인디케이터 등에서 N번 호출을 줄인다.
권한: requireProjectAccess (프로젝트 멤버라면 누구나 조회 가능)
쿼리 파라미터: ?type=<IssueLinkType> (생략 시 전체 유형 반환)
@author jijuta ([email protected])
@since 2026-05-12
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/projects/{projectId}/links \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/links", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
GET/api/projects/{projectId}/repos
프로젝트 ↔ GitHub 저장소 연결 CRUD 라우트.
/api/projects/[projectId]/repos — 프로젝트 ↔ GitHub 저장소 연결 CRUD 라우트.
프로젝트 단위의 repo 링크(N:M, project_repos 테이블)를 관리한다.
repos 행 자체의 upsert, GitHub 메타 fetch, 백필 자동 트리거도 담당한다.
@author jijuta ([email protected])
@since 2026-05-15
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/projects/{projectId}/repos \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/repos", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
POST/api/projects/{projectId}/repos
프로젝트 ↔ GitHub 저장소 연결 CRUD 라우트.
/api/projects/[projectId]/repos — 프로젝트 ↔ GitHub 저장소 연결 CRUD 라우트.
프로젝트 단위의 repo 링크(N:M, project_repos 테이블)를 관리한다.
repos 행 자체의 upsert, GitHub 메타 fetch, 백필 자동 트리거도 담당한다.
@author jijuta ([email protected])
@since 2026-05-15
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/projects/{projectId}/repos \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"fullName":"string","primaryBranch":"string","isPrimary":true}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/repos", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"fullName": "string",
"primaryBranch": "string",
"isPrimary": true
})
});
const data = await res.json();
DELETE/api/projects/{projectId}/repos
프로젝트 ↔ GitHub 저장소 연결 CRUD 라우트.
/api/projects/[projectId]/repos — 프로젝트 ↔ GitHub 저장소 연결 CRUD 라우트.
프로젝트 단위의 repo 링크(N:M, project_repos 테이블)를 관리한다.
repos 행 자체의 upsert, GitHub 메타 fetch, 백필 자동 트리거도 담당한다.
@author jijuta ([email protected])
@since 2026-05-15
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X DELETE https://sit.in-bridge.com/api/projects/{projectId}/repos \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/repos", {
method: "DELETE",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
PATCH/api/projects/{projectId}/repos/{repoId}
PATCH /api/projects/{projectId}/repos/{repoId}
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X PATCH https://sit.in-bridge.com/api/projects/{projectId}/repos/{repoId} \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"primaryBranch":"string","isPrimary":true}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/repos/{repoId}", {
method: "PATCH",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"primaryBranch": "string",
"isPrimary": true
})
});
const data = await res.json();
GET/api/projects/{projectId}/teams
프로젝트-팀 매핑(projectTeams)을 관리하는 라우트.
API 라우트: GET/POST/DELETE /api/projects/[projectId]/teams
프로젝트-팀 매핑(projectTeams)을 관리하는 라우트.
- GET: 해당 프로젝트에 연결된 팀 목록 조회 (프로젝트 멤버 이상 접근 가능)
- POST: 팀을 프로젝트에 매핑 (workspace admin 전용, 같은 워크스페이스 팀만 허용)
- DELETE: 프로젝트에서 팀 매핑 해제 (workspace admin 전용)
권한:
GET — requireProjectAccess (멤버 이상)
POST — requireWorkspaceAdmin
DELETE — requireWorkspaceAdmin
@author jijuta ([email protected])
@since 2026-05-12
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/projects/{projectId}/teams \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/teams", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
POST/api/projects/{projectId}/teams
프로젝트-팀 매핑(projectTeams)을 관리하는 라우트.
API 라우트: GET/POST/DELETE /api/projects/[projectId]/teams
프로젝트-팀 매핑(projectTeams)을 관리하는 라우트.
- GET: 해당 프로젝트에 연결된 팀 목록 조회 (프로젝트 멤버 이상 접근 가능)
- POST: 팀을 프로젝트에 매핑 (workspace admin 전용, 같은 워크스페이스 팀만 허용)
- DELETE: 프로젝트에서 팀 매핑 해제 (workspace admin 전용)
권한:
GET — requireProjectAccess (멤버 이상)
POST — requireWorkspaceAdmin
DELETE — requireWorkspaceAdmin
@author jijuta ([email protected])
@since 2026-05-12
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Request body
teamIdstring<uuid>required
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/projects/{projectId}/teams \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"teamId":"00000000-0000-0000-0000-000000000000"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/teams", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"teamId": "00000000-0000-0000-0000-000000000000"
})
});
const data = await res.json();
DELETE/api/projects/{projectId}/teams
프로젝트-팀 매핑(projectTeams)을 관리하는 라우트.
API 라우트: GET/POST/DELETE /api/projects/[projectId]/teams
프로젝트-팀 매핑(projectTeams)을 관리하는 라우트.
- GET: 해당 프로젝트에 연결된 팀 목록 조회 (프로젝트 멤버 이상 접근 가능)
- POST: 팀을 프로젝트에 매핑 (workspace admin 전용, 같은 워크스페이스 팀만 허용)
- DELETE: 프로젝트에서 팀 매핑 해제 (workspace admin 전용)
권한:
GET — requireProjectAccess (멤버 이상)
POST — requireWorkspaceAdmin
DELETE — requireWorkspaceAdmin
@author jijuta ([email protected])
@since 2026-05-12
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X DELETE https://sit.in-bridge.com/api/projects/{projectId}/teams \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/teams", {
method: "DELETE",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();