목표
현재 등록된 apps/gateway/api/v1/endpoints/team.py와 미등록 teams.py가 서로 다른 /teams 구현을 갖고 있어 Team 관리 API의 유지보수 경계가 불명확하다. 문서 기준에 맞춰 등록 라우터를 정리하고 누락된 team 비활성화 API를 복구한다.
배경
문서 기준:
docs/architecture/auth-rbac.md: Controller가 resource permission 비즈니스 규칙을 소유하지 않는다.
docs/requirements/mvp-1-foundation-llmops.md: Team/member management 범위에 team 생성, member 추가/제거, team 비활성화가 포함된다.
docs/api/organization-rbac.md: Team/member API는 X-Organization-Id active organization scope와 organization manager 권한을 사용한다.
현재 상태:
- 실제 등록 라우터는
team.py다.
- 미등록
teams.py에도 별도 /teams 구현이 남아 있다.
TeamService.deactivate_team()은 있지만 등록된 team.py에는 DELETE /api/v1/teams/{team_id}가 없다.
team.py가 owner/manager 판정, active membership 판정, 403/404 분기, 팀 목록 DB 조회를 직접 들고 있어 RBAC 기준이 중복될 위험이 있다.
managed_by 업데이트는 active user 여부만 확인하고 같은 organization 소속 여부를 확인하지 않는다.
작업 범위
- 등록된 Team API 구현 기준을 하나로 정리한다.
DELETE /api/v1/teams/{team_id} 비활성화 엔드포인트를 문서 기준으로 복구한다.
- controller에 있는 RBAC/scope 판정과 DB 조회를 가능한 service/helper 쪽으로 이동한다.
managed_by 업데이트 시 같은 organization active membership 여부를 검증한다.
teams.py 중복 구현을 제거하거나 등록되지 않는 이유를 명확히 정리한다.
- 기존 Team API 테스트를 보강하고 회귀를 확인한다.
Acceptance Criteria
DELETE /api/v1/teams/{team_id}가 등록 라우터에서 동작한다.
- team 생성/수정/비활성화/member 추가/member 제거가
X-Organization-Id와 organization manager 권한 기준으로 동작한다.
- scope 밖 organization/team은 404로 숨기고, scope 안 일반 member의 manager 권한 부족은 403으로 반환한다.
managed_by는 같은 organization의 active member 또는 null만 허용한다.
- 등록되지 않은
teams.py와 실제 team.py 사이의 중복/혼선이 제거된다.
- 관련 API/service 테스트가 통과한다.
목표
현재 등록된
apps/gateway/api/v1/endpoints/team.py와 미등록teams.py가 서로 다른/teams구현을 갖고 있어 Team 관리 API의 유지보수 경계가 불명확하다. 문서 기준에 맞춰 등록 라우터를 정리하고 누락된 team 비활성화 API를 복구한다.배경
문서 기준:
docs/architecture/auth-rbac.md: Controller가 resource permission 비즈니스 규칙을 소유하지 않는다.docs/requirements/mvp-1-foundation-llmops.md: Team/member management 범위에 team 생성, member 추가/제거, team 비활성화가 포함된다.docs/api/organization-rbac.md: Team/member API는X-Organization-Idactive organization scope와 organization manager 권한을 사용한다.현재 상태:
team.py다.teams.py에도 별도/teams구현이 남아 있다.TeamService.deactivate_team()은 있지만 등록된team.py에는DELETE /api/v1/teams/{team_id}가 없다.team.py가 owner/manager 판정, active membership 판정, 403/404 분기, 팀 목록 DB 조회를 직접 들고 있어 RBAC 기준이 중복될 위험이 있다.managed_by업데이트는 active user 여부만 확인하고 같은 organization 소속 여부를 확인하지 않는다.작업 범위
DELETE /api/v1/teams/{team_id}비활성화 엔드포인트를 문서 기준으로 복구한다.managed_by업데이트 시 같은 organization active membership 여부를 검증한다.teams.py중복 구현을 제거하거나 등록되지 않는 이유를 명확히 정리한다.Acceptance Criteria
DELETE /api/v1/teams/{team_id}가 등록 라우터에서 동작한다.X-Organization-Id와 organization manager 권한 기준으로 동작한다.managed_by는 같은 organization의 active member 또는 null만 허용한다.teams.py와 실제team.py사이의 중복/혼선이 제거된다.