352 lines
12 KiB
Plaintext
352 lines
12 KiB
Plaintext
syntax = "v1"
|
||
|
||
// =================================================================
|
||
// Type: 聊天室 (Chat Room)
|
||
// =================================================================
|
||
type (
|
||
// CreateRoomReq 創建聊天室請求
|
||
CreateRoomReq {
|
||
Authorization
|
||
Name string `json:"name" validate:"required,min=1,max=100"` // 聊天室名稱
|
||
Status string `json:"status,optional" validate:"omitempty,oneof=active archived"` // 狀態,預設為 active
|
||
}
|
||
|
||
// UpdateRoomReq 更新聊天室請求
|
||
UpdateRoomReq {
|
||
Authorization
|
||
RoomID string `path:"room_id" validate:"required"`
|
||
Name *string `json:"name,optional" validate:"omitempty,min=1,max=100"`
|
||
Status *string `json:"status,optional" validate:"omitempty,oneof=active archived"`
|
||
}
|
||
|
||
// RoomResp 聊天室回應
|
||
RoomResp {
|
||
RoomID string `json:"room_id"`
|
||
Name string `json:"name"`
|
||
Status string `json:"status"`
|
||
CreatedAt string `json:"created_at"`
|
||
UpdatedAt string `json:"updated_at"`
|
||
}
|
||
|
||
// ListRoomsReq 查詢聊天室列表請求
|
||
ListRoomsReq {
|
||
Authorization
|
||
Status string `json:"status,optional" validate:"omitempty,oneof=active archived"` // 狀態篩選
|
||
PageSize int `json:"page_size,optional" validate:"omitempty,min=1,max=100"` // 每頁大小,預設 20
|
||
LastID string `json:"last_id,optional"` // 用於 cursor-based pagination
|
||
}
|
||
|
||
// ListRoomsResp 聊天室列表回應
|
||
ListRoomsResp {
|
||
Rooms []RoomResp `json:"rooms"`
|
||
LastID string `json:"last_id,optional"` // 用於下一頁查詢
|
||
Total int64 `json:"total,optional"` // 總數(僅第一頁返回)
|
||
}
|
||
|
||
// AddMemberReq 添加成員請求
|
||
AddMemberReq {
|
||
Authorization
|
||
RoomID string `json:"room_id" validate:"required"`
|
||
UID string `json:"uid" validate:"required"` // 要添加的用戶 UID
|
||
}
|
||
|
||
// RemoveMemberReq 移除成員請求
|
||
RemoveMemberReq {
|
||
Authorization
|
||
RoomID string `path:"room_id" validate:"required"`
|
||
UID string `path:"uid" validate:"required"` // 要移除的用戶 UID
|
||
}
|
||
|
||
// UpdateMemberRoleReq 更新成員角色請求
|
||
UpdateMemberRoleReq {
|
||
Authorization
|
||
RoomID string `path:"room_id" validate:"required"`
|
||
UID string `path:"uid" validate:"required"`
|
||
Role string `json:"role" validate:"required,oneof=admin member"`
|
||
}
|
||
|
||
// MemberResp 成員回應
|
||
MemberResp {
|
||
RoomID string `json:"room_id"`
|
||
UID string `json:"uid"`
|
||
Role string `json:"role"`
|
||
JoinedAt string `json:"joined_at"`
|
||
UpdatedAt string `json:"updated_at"`
|
||
}
|
||
|
||
// ListMembersResp 成員列表回應
|
||
ListMembersResp {
|
||
Members []Member `json:"members"`
|
||
Total int64 `json:"total"`
|
||
}
|
||
|
||
// MemberResp 成員回應
|
||
Member {
|
||
UID string `json:"uid"`
|
||
Name string `json:"name"`
|
||
Avatar string `json:"avatar"`
|
||
}
|
||
|
||
// GetUserRoomsResp 用戶聊天室列表回應
|
||
GetUserRoomsResp {
|
||
Rooms []RoomResp `json:"rooms"`
|
||
Total int64 `json:"total"`
|
||
}
|
||
|
||
RoomReq {
|
||
Authorization
|
||
RoomID string `path:"room_id"`
|
||
}
|
||
)
|
||
|
||
// =================================================================
|
||
// Type: 訊息 (Message)
|
||
// =================================================================
|
||
type (
|
||
// SendMessageReq 發送訊息請求
|
||
SendMessageReq {
|
||
Authorization
|
||
RoomID string `path:"room_id" validate:"required"`
|
||
Content string `json:"content" validate:"required,min=1,max=5000"` // 訊息內容
|
||
}
|
||
|
||
// SendMessageResp 發送訊息回應
|
||
SendMessageResp {
|
||
RoomID string `json:"room_id"`
|
||
BucketDay string `json:"bucket_day"` // yyyyMMdd
|
||
TS int64 `json:"ts"` // timestamp
|
||
UID string `json:"uid"`
|
||
Content string `json:"content"`
|
||
}
|
||
|
||
// ListMessagesReq 查詢訊息列表請求
|
||
ListMessagesReq {
|
||
Authorization
|
||
RoomID string `path:"room_id" validate:"required"`
|
||
BucketDay string `json:"bucket_day,optional"` // yyyyMMdd,不提供則使用今天
|
||
PageSize int64 `json:"page_size,optional" validate:"omitempty,min=1,max=100"` // 每頁大小,預設 20
|
||
LastTS int64 `json:"last_ts,optional"` // 用於 cursor-based pagination
|
||
}
|
||
|
||
// ListMessagesResp 訊息列表回應
|
||
ListMessagesResp {
|
||
Messages []MessageResp `json:"messages"`
|
||
Total int64 `json:"total,optional"` // 總數(僅第一頁返回)
|
||
LastTS int64 `json:"last_ts,optional"` // 用於下一頁查詢
|
||
}
|
||
|
||
// MessageResp 訊息回應
|
||
MessageResp {
|
||
RoomID string `json:"room_id"`
|
||
BucketDay string `json:"bucket_day"` // yyyyMMdd
|
||
TS int64 `json:"ts"` // timestamp
|
||
UID string `json:"uid"`
|
||
Content string `json:"content"`
|
||
}
|
||
|
||
|
||
IsMemberResp {
|
||
IsMember bool `json:"is_member"`
|
||
}
|
||
)
|
||
|
||
// =================================================================
|
||
// Service: 聊天 API - 需要登入 (Chat Service)
|
||
// =================================================================
|
||
@server(
|
||
group: chat
|
||
prefix: /api/v1/chat
|
||
schemes: https
|
||
timeout: 30s
|
||
middleware: AuthMiddleware
|
||
)
|
||
service gateway {
|
||
// ==================== 聊天室管理 ====================
|
||
@doc(
|
||
summary: "創建聊天室"
|
||
description: "創建一個新的聊天室,創建者自動成為管理員"
|
||
)
|
||
/*
|
||
@respdoc-200 (RoomResp) // 建立成功
|
||
@respdoc-400 (ErrorResp) "請求參數格式錯誤"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-422 (ErrorResp) "創建太多聊天室了(目前仙梅設定上限)"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler createRoom
|
||
post /rooms (CreateRoomReq) returns (RoomResp)
|
||
|
||
@doc(
|
||
summary: "取得聊天室資訊"
|
||
description: "根據 room_id 取得聊天室的詳細資訊"
|
||
)
|
||
/*
|
||
@respdoc-200 (RoomResp) // 取得聊天室
|
||
@respdoc-400 (ErrorResp) "請求參數格式錯誤"
|
||
@respdoc-401 (ErrorResp) "不再房間內的人"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-404 (ErrorResp) "找不到聊天室"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler getRoom
|
||
get /rooms/:room_id (RoomReq) returns (RoomResp)
|
||
|
||
@doc(
|
||
summary: "更新聊天室資訊"
|
||
description: "更新聊天室的名稱或狀態,需要管理員權限"
|
||
)
|
||
/*
|
||
@respdoc-200 (RoomResp) // 取得聊天室
|
||
@respdoc-400 (ErrorResp) "請求參數格式錯誤"
|
||
@respdoc-401 (ErrorResp) "不再房間內的人"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-404 (ErrorResp) "找不到聊天室"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler updateRoom
|
||
put /rooms/:room_id (UpdateRoomReq) returns (RoomResp)
|
||
|
||
@doc(
|
||
summary: "刪除聊天室"
|
||
description: "刪除聊天室及其所有成員和訊息,需要管理員權限"
|
||
)
|
||
/*
|
||
@respdoc-200 (RespOK)
|
||
@respdoc-400 (ErrorResp) "請求參數格式錯誤"
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-404 (ErrorResp) "找不到聊天室"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler deleteRoom
|
||
delete /rooms/:room_id (RoomReq) returns (RespOK)
|
||
|
||
@doc(
|
||
summary: "查詢聊天室列表"
|
||
description: "查詢聊天室列表,支援狀態篩選和分頁(自己的,之後再支援管理員吃全部)"
|
||
)
|
||
/*
|
||
@respdoc-200 (ListRoomsResp) // 取得聊天室列表
|
||
@respdoc-400 (ErrorResp) "請求參數格式錯誤"
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-404 (ErrorResp) "找不到聊天室"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler listRooms
|
||
get /rooms (ListRoomsReq) returns (ListRoomsResp)
|
||
|
||
// ==================== 成員管理 ====================
|
||
@doc(
|
||
summary: "添加成員到聊天室"
|
||
description: "將用戶添加到聊天室,需要管理員權限"
|
||
)
|
||
/*
|
||
@respdoc-200 (MemberResp) // 取得聊天室列表
|
||
@respdoc-400 (ErrorResp) "請求參數格式錯誤"
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-404 (ErrorResp) "找不到聊天室"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler addMember
|
||
post /rooms/:room_id/members (AddMemberReq) returns (MemberResp)
|
||
|
||
@doc(
|
||
summary: "移除聊天室成員"
|
||
description: "將成員從聊天室中移除,需要管理員權限或本人操作"
|
||
)
|
||
/*
|
||
@respdoc-200 (RespOK)
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-404 (ErrorResp) "找不到聊天室"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler removeMember
|
||
delete /rooms/:room_id/members/:uid (RemoveMemberReq) returns (RespOK)
|
||
|
||
@doc(
|
||
summary: "更新成員角色"
|
||
description: "更新成員在聊天室中的角色,需要管理員權限"
|
||
)
|
||
/*
|
||
@respdoc-200 (MemberResp)
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-404 (ErrorResp) "找不到聊天室"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler updateMemberRole
|
||
put /rooms/:room_id/members/:uid/role (UpdateMemberRoleReq) returns (MemberResp)
|
||
|
||
@doc(
|
||
summary: "查詢聊天室成員列表"
|
||
description: "查詢指定聊天室的所有成員"
|
||
)
|
||
/*
|
||
@respdoc-200 (ListMembersResp)
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler listMembers
|
||
get /rooms/:room_id/members (RoomReq) returns (ListMembersResp)
|
||
|
||
// ==================== 用戶相關 ====================
|
||
@doc(
|
||
summary: "查詢用戶所在的聊天室"
|
||
description: "查詢當前用戶或指定用戶所在的所有聊天室"
|
||
)
|
||
/*
|
||
@respdoc-200 (GetUserRoomsResp)
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler getUserRooms
|
||
get /users/rooms (Authorization) returns (GetUserRoomsResp)
|
||
|
||
@doc(
|
||
summary: "檢查用戶是否在聊天室中"
|
||
description: "檢查指定用戶是否在某個聊天室中"
|
||
)
|
||
/*
|
||
@respdoc-200 (IsMemberResp)
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler checkUserInRoom
|
||
get /rooms/:room_id/members/:uid (RemoveMemberReq) returns (IsMemberResp)
|
||
|
||
// ==================== 訊息相關 ====================
|
||
@doc(
|
||
summary: "發送訊息"
|
||
description: "在聊天室中發送訊息,需要是聊天室成員"
|
||
)
|
||
/*
|
||
@respdoc-200 (RespOK)
|
||
@respdoc-400 (ErrorResp) "請求參數格式錯誤"
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler sendMessage
|
||
post /rooms/:room_id/messages (SendMessageReq) returns (RespOK)
|
||
|
||
@doc(
|
||
summary: "查詢訊息列表"
|
||
description: "查詢聊天室中的訊息列表,支援分頁和按日期篩選"
|
||
)
|
||
/*
|
||
@respdoc-200 (ListMessagesResp)
|
||
@respdoc-400 (ErrorResp) "請求參數格式錯誤"
|
||
@respdoc-401 (ErrorResp) "權限不夠"
|
||
@respdoc-403 (ErrorResp) "沒有登入"
|
||
@respdoc-500 (ErrorResp) // 伺服器內部錯誤
|
||
*/
|
||
@handler listMessages
|
||
get /rooms/:room_id/messages (ListMessagesReq) returns (ListMessagesResp)
|
||
}
|
||
|