Skip to main content

Roles & Permissions

Tài liệu này mô tả hệ thống roles & permissions trong Cohost, cách backend kiểm tra quyền và cách FE/bên thứ 3 cần gửi context khi gọi API.


1. Team Member Roles

Trong phạm vi team, Cohost sử dụng các role sau:

RoleMô tảQuyền
OWNERChủ teamToàn quyền (listing, booking, financial, members, settings)
HOSTNgười quản lý chínhTạo/sửa listing, quản lý booking, xem financial
COHOSTNgười hỗ trợHỗ trợ HOST/OWNER quản lý listing và booking
GUESTKháchKhông tham gia quản lý team

Enum: TeamMemberRoleEnum


2. Team Member States

Mỗi member có trạng thái (state) trong team:

StateMô tả
INVITEDĐã được mời nhưng chưa tham gia
JOINEDĐã tham gia team
LEFTĐã rời team
REMOVEDBị xóa khỏi team

Enum: TeamMemberStateEnum

Quan trọng: Để truy cập API, user phải có state JOINED.


3. Team Status

Team cũng có trạng thái riêng:

StatusMô tả
ACTIVETeam đang hoạt động
SUSPENDEDTeam bị tạm dừng
DELETEDTeam đã bị xóa

Quan trọng: Để truy cập API, team phải có status ACTIVE.


4. X-Team-ID Header

Đa số API quản trị (listing, booking, financial, members, settings...) là team-scoped:

Authorization: Bearer <jwt_token>
X-Team-ID: <team_id>

Backend validate:

  • Team tồn tại và có status ACTIVE
  • User là owner HOẶC member với state JOINED

Chi tiết xem thêm: X-Team-ID Guide


5. Role Validation trong Backend

Backend sử dụng các dependency để kiểm tra quyền:

5.1. get_current_team

Validate team context:

  • Team tồn tại và status ACTIVE
  • User là owner HOẶC member với state JOINED

5.2. get_current_team_member

Lấy bản ghi TeamMember hiện tại (bao gồm role và state).

5.3. require_team_role(*roles)

Dependency factory để kiểm tra role cụ thể:

@router.get(/financial”)
async def get_financial(
current_team: Team = Depends(get_current_team),
_: TeamMember = Depends(require_team_role(TeamMemberRoleEnum.OWNER, TeamMemberRoleEnum.HOST)),
):
# Chỉ OWNER hoặc HOST mới truy cập được
...

6. Ví dụ API Authorization

EndpointRequired Role
GET /api/v1/listingsOWNER, HOST, COHOST, GUEST
POST /api/v1/listingsOWNER, HOST
PATCH /api/v1/listings/{id}OWNER, HOST
DELETE /api/v1/listings/{id}OWNER, HOST
GET /api/v1/financialOWNER, HOST
POST /api/v1/teams/membersOWNER, HOST
PATCH /api/v1/teams/members/{id}OWNER

7. Hướng dẫn cho FE

  • Duy trì selectedTeamId trong state/context
  • Interceptor API phải luôn gắn X-Team-ID header
  • Khi đổi team:
    • Cập nhật selectedTeamId
    • Invalidate cache các query liên quan team