projects

Sentivex Incidents Ticket API

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 없음
cURL
curl -X GET https://sit.in-bridge.com/api/projects \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const 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
namestringrequired
keystringrequired

Responses

200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -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"}'
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Responses

200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -X GET https://sit.in-bridge.com/api/projects/{projectId} \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Request body

namestring
descriptionstring
iconstring
colorstring

Responses

200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -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"}'
JavaScript
const 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

Path parameters

projectIdstringrequired

Responses

200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -X GET https://sit.in-bridge.com/api/projects/{projectId}/issues-git-activity \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Request body

selectionsstring<uuid>required

Responses

200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -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"}'
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Request body

dryRunbooleanrequired
stateenumrequired
openclosedall
perRepoLimitanyrequired
withAibooleanrequired
aiRefineModelstring

Responses

200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -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"}'
JavaScript
const 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}/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 등) 적용

Path parameters

projectIdstringrequired

Responses

200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -X GET https://sit.in-bridge.com/api/projects/{projectId}/repos \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Request body

fullNamestringrequired
primaryBranchstring
isPrimaryboolean

Responses

200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -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}'
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Responses

200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -X DELETE https://sit.in-bridge.com/api/projects/{projectId}/repos \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const 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}

Path parameters

projectIdstringrequired
repoIdstringrequired

Request body

primaryBranchstring
isPrimaryboolean

Responses

200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -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}'
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Responses

200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -X GET https://sit.in-bridge.com/api/projects/{projectId}/teams \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Request body

teamIdstring<uuid>required

Responses

200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -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"}'
JavaScript
const 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 등) 적용

Path parameters

projectIdstringrequired

Responses

200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -X DELETE https://sit.in-bridge.com/api/projects/{projectId}/teams \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const res = await fetch("https://sit.in-bridge.com/api/projects/{projectId}/teams", {
  method: "DELETE",
  headers: {
    "Authorization": `Bearer ${token}`
  }
});
const data = await res.json();