GET/api/workspaces
현재 로그인 사용자가 속한 워크스페이스 목록 반환.
API 라우트: GET /api/workspaces — 현재 로그인 사용자가 속한 워크스페이스 목록 반환.
POST /api/workspaces — 새 워크스페이스 생성 + 생성자를 admin 멤버로 자동 등록.
권한: 로그인 필수(requireUser). 슈퍼관리자는 전체 워크스페이스 조회 가능(멤버십 불문).
캐시: Redis에 사용자별 30초 TTL로 목록을 저장하고, 생성 시 무효화.
@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/workspaces \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
POST/api/workspaces
현재 로그인 사용자가 속한 워크스페이스 목록 반환.
API 라우트: GET /api/workspaces — 현재 로그인 사용자가 속한 워크스페이스 목록 반환.
POST /api/workspaces — 새 워크스페이스 생성 + 생성자를 admin 멤버로 자동 등록.
권한: 로그인 필수(requireUser). 슈퍼관리자는 전체 워크스페이스 조회 가능(멤버십 불문).
캐시: Redis에 사용자별 30초 TTL로 목록을 저장하고, 생성 시 무효화.
@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 POST https://sit.in-bridge.com/api/workspaces \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"string","slug":"string"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "string",
"slug": "string"
})
});
const data = await res.json();
GET/api/workspaces/{workspaceId}
특정 워크스페이스의 단건 조회 및 정보 수정을 담당한다.
API 라우트: /api/workspaces/[workspaceId]
특정 워크스페이스의 단건 조회 및 정보 수정을 담당한다.
지원 메서드:
- GET : 워크스페이스 상세 정보 반환. 모든 워크스페이스 멤버 접근 가능.
- PATCH: 워크스페이스 이름·설명·로고 URL 업데이트. admin 전용.
변경 시 전체 멤버의 캐시(workspacesByUser)를 즉시 무효화.
관련 테이블: workspaces, workspaceMembers
캐시: cacheDel(cacheKeys.workspacesByUser) — 멤버 전원 캐시 무효화
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/workspaces/{workspaceId} \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
PATCH/api/workspaces/{workspaceId}
특정 워크스페이스의 단건 조회 및 정보 수정을 담당한다.
API 라우트: /api/workspaces/[workspaceId]
특정 워크스페이스의 단건 조회 및 정보 수정을 담당한다.
지원 메서드:
- GET : 워크스페이스 상세 정보 반환. 모든 워크스페이스 멤버 접근 가능.
- PATCH: 워크스페이스 이름·설명·로고 URL 업데이트. admin 전용.
변경 시 전체 멤버의 캐시(workspacesByUser)를 즉시 무효화.
관련 테이블: workspaces, workspaceMembers
캐시: cacheDel(cacheKeys.workspacesByUser) — 멤버 전원 캐시 무효화
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X PATCH https://sit.in-bridge.com/api/workspaces/{workspaceId} \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"string","description":"string","logoUrl":"string"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}", {
method: "PATCH",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "string",
"description": "string",
"logoUrl": "string"
})
});
const data = await res.json();
GET/api/workspaces/{workspaceId}/git
GET /api/workspaces/{workspaceId}/git
Path parameters
workspaceIdstringrequired
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/workspaces/{workspaceId}/git \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/git", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
GET/api/workspaces/{workspaceId}/invitations
워크스페이스 이메일 초대 목록 조회 및 신규 초대 발송을 담당한다.
API 라우트: /api/workspaces/[workspaceId]/invitations
워크스페이스 이메일 초대 목록 조회 및 신규 초대 발송을 담당한다.
지원 메서드:
- GET : 해당 워크스페이스의 보류 중(미수락·미만료) 초대 목록 반환. admin 전용.
- POST: 특정 이메일 주소로 초대 생성 + 이메일 자동 발송. admin 전용.
동일 이메일에 유효한 초대가 이미 존재하면 재사용(reused: true).
권한: 두 메서드 모두 requireWorkspaceAdmin — admin이 아니면 403.
관련 테이블: workspaceInvitations, workspaceMembers, workspaces, users
외부 부작용: sendMail (초대 이메일 발송 — 실패해도 초대 생성에 영향 없음)
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/workspaces/{workspaceId}/invitations \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/invitations", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
POST/api/workspaces/{workspaceId}/invitations
워크스페이스 이메일 초대 목록 조회 및 신규 초대 발송을 담당한다.
API 라우트: /api/workspaces/[workspaceId]/invitations
워크스페이스 이메일 초대 목록 조회 및 신규 초대 발송을 담당한다.
지원 메서드:
- GET : 해당 워크스페이스의 보류 중(미수락·미만료) 초대 목록 반환. admin 전용.
- POST: 특정 이메일 주소로 초대 생성 + 이메일 자동 발송. admin 전용.
동일 이메일에 유효한 초대가 이미 존재하면 재사용(reused: true).
권한: 두 메서드 모두 requireWorkspaceAdmin — admin이 아니면 403.
관련 테이블: workspaceInvitations, workspaceMembers, workspaces, users
외부 부작용: sendMail (초대 이메일 발송 — 실패해도 초대 생성에 영향 없음)
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
Request body
roleenumrequired
adminmember
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/workspaces/{workspaceId}/invitations \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":null,"role":"admin","teamRoles":"00000000-0000-0000-0000-000000000000","projectRoles":"00000000-0000-0000-0000-000000000000"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/invitations", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"email": null,
"role": "admin",
"teamRoles": "00000000-0000-0000-0000-000000000000",
"projectRoles": "00000000-0000-0000-0000-000000000000"
})
});
const data = await res.json();
DELETE/api/workspaces/{workspaceId}/invitations/{invitationId}
특정 워크스페이스 초대 건(invitationId)을 대상으로 하는 단건 조작 엔드포인트.
API 라우트: /api/workspaces/[workspaceId]/invitations/[invitationId]
특정 워크스페이스 초대 건(invitationId)을 대상으로 하는 단건 조작 엔드포인트.
현재 지원 메서드:
- DELETE: 보류 중인 초대를 취소(삭제). workspace admin 전용.
권한: requireWorkspaceAdmin — admin이 아니면 403 Forbidden.
관련 테이블: workspaceInvitations
@author jijuta ([email protected])
@since 2026-05-12
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
invitationIdstringrequired
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X DELETE https://sit.in-bridge.com/api/workspaces/{workspaceId}/invitations/{invitationId} \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/invitations/{invitationId}", {
method: "DELETE",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
GET/api/workspaces/{workspaceId}/members
워크스페이스 멤버 목록 조회 및 멤버 추가·역할 변경·제거를 담당한다.
API 라우트: /api/workspaces/[workspaceId]/members
워크스페이스 멤버 목록 조회 및 멤버 추가·역할 변경·제거를 담당한다.
지원 메서드:
- GET : 해당 워크스페이스의 전체 멤버 목록 반환. 모든 워크스페이스 멤버 접근 가능.
- POST : 이메일로 기존 사용자를 워크스페이스에 직접 추가(초대 없이). admin 전용.
추가 시 대상 사용자에게 알림 전송.
- PATCH : 특정 멤버의 역할(admin/member)을 변경. admin 전용.
- DELETE: 특정 멤버를 워크스페이스에서 제거. admin 전용.
관련 테이블: workspaceMembers, users, workspaces
외부 부작용: notify (멤버 추가 시 인앱 알림)
주의: 이 라우트의 POST는 이미 가입된 사용자를 직접 추가하는 것이며,
이메일 초대 흐름은 /invitations 라우트가 담당한다.
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/workspaces/{workspaceId}/members \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/members", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
POST/api/workspaces/{workspaceId}/members
워크스페이스 멤버 목록 조회 및 멤버 추가·역할 변경·제거를 담당한다.
API 라우트: /api/workspaces/[workspaceId]/members
워크스페이스 멤버 목록 조회 및 멤버 추가·역할 변경·제거를 담당한다.
지원 메서드:
- GET : 해당 워크스페이스의 전체 멤버 목록 반환. 모든 워크스페이스 멤버 접근 가능.
- POST : 이메일로 기존 사용자를 워크스페이스에 직접 추가(초대 없이). admin 전용.
추가 시 대상 사용자에게 알림 전송.
- PATCH : 특정 멤버의 역할(admin/member)을 변경. admin 전용.
- DELETE: 특정 멤버를 워크스페이스에서 제거. admin 전용.
관련 테이블: workspaceMembers, users, workspaces
외부 부작용: notify (멤버 추가 시 인앱 알림)
주의: 이 라우트의 POST는 이미 가입된 사용자를 직접 추가하는 것이며,
이메일 초대 흐름은 /invitations 라우트가 담당한다.
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
Request body
roleenumrequired
adminmember
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/workspaces/{workspaceId}/members \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":null,"role":"admin","teamRoles":"00000000-0000-0000-0000-000000000000","projectRoles":"00000000-0000-0000-0000-000000000000"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/members", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"email": null,
"role": "admin",
"teamRoles": "00000000-0000-0000-0000-000000000000",
"projectRoles": "00000000-0000-0000-0000-000000000000"
})
});
const data = await res.json();
PATCH/api/workspaces/{workspaceId}/members
워크스페이스 멤버 목록 조회 및 멤버 추가·역할 변경·제거를 담당한다.
API 라우트: /api/workspaces/[workspaceId]/members
워크스페이스 멤버 목록 조회 및 멤버 추가·역할 변경·제거를 담당한다.
지원 메서드:
- GET : 해당 워크스페이스의 전체 멤버 목록 반환. 모든 워크스페이스 멤버 접근 가능.
- POST : 이메일로 기존 사용자를 워크스페이스에 직접 추가(초대 없이). admin 전용.
추가 시 대상 사용자에게 알림 전송.
- PATCH : 특정 멤버의 역할(admin/member)을 변경. admin 전용.
- DELETE: 특정 멤버를 워크스페이스에서 제거. admin 전용.
관련 테이블: workspaceMembers, users, workspaces
외부 부작용: notify (멤버 추가 시 인앱 알림)
주의: 이 라우트의 POST는 이미 가입된 사용자를 직접 추가하는 것이며,
이메일 초대 흐름은 /invitations 라우트가 담당한다.
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
Request body
memberIdstring<uuid>required
roleenumrequired
adminmember
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X PATCH https://sit.in-bridge.com/api/workspaces/{workspaceId}/members \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"memberId":"00000000-0000-0000-0000-000000000000","role":"admin"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/members", {
method: "PATCH",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"memberId": "00000000-0000-0000-0000-000000000000",
"role": "admin"
})
});
const data = await res.json();
DELETE/api/workspaces/{workspaceId}/members
워크스페이스 멤버 목록 조회 및 멤버 추가·역할 변경·제거를 담당한다.
API 라우트: /api/workspaces/[workspaceId]/members
워크스페이스 멤버 목록 조회 및 멤버 추가·역할 변경·제거를 담당한다.
지원 메서드:
- GET : 해당 워크스페이스의 전체 멤버 목록 반환. 모든 워크스페이스 멤버 접근 가능.
- POST : 이메일로 기존 사용자를 워크스페이스에 직접 추가(초대 없이). admin 전용.
추가 시 대상 사용자에게 알림 전송.
- PATCH : 특정 멤버의 역할(admin/member)을 변경. admin 전용.
- DELETE: 특정 멤버를 워크스페이스에서 제거. admin 전용.
관련 테이블: workspaceMembers, users, workspaces
외부 부작용: notify (멤버 추가 시 인앱 알림)
주의: 이 라우트의 POST는 이미 가입된 사용자를 직접 추가하는 것이며,
이메일 초대 흐름은 /invitations 라우트가 담당한다.
@author jijuta ([email protected])
@since 2026-05-03
@updated 2026-06-07 — JSDoc 표준(@author/@since/@param 등) 적용
Path parameters
workspaceIdstringrequired
Request body
memberIdstring<uuid>required
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X DELETE https://sit.in-bridge.com/api/workspaces/{workspaceId}/members \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"memberId":"00000000-0000-0000-0000-000000000000"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/members", {
method: "DELETE",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"memberId": "00000000-0000-0000-0000-000000000000"
})
});
const data = await res.json();
GET/api/workspaces/{workspaceId}/members/{userId}
워크스페이스 멤버 상세 조회. users.settings.memberProfile 에 적재된 연락처·스킬
API 라우트: /api/workspaces/[workspaceId]/members/[userId]
워크스페이스 멤버 상세 조회. users.settings.memberProfile 에 적재된 연락처·스킬
프로필과 워크스페이스/팀/프로젝트/SOC 역할 멤버십을 한 응답으로 반환한다.
@author jijuta ([email protected])
@since 2026-06-13
Path parameters
workspaceIdstringrequired
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/workspaces/{workspaceId}/members/{userId} \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/workspaces/{workspaceId}/members/{userId}", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();