188 lines
4.7 KiB
Plaintext
188 lines
4.7 KiB
Plaintext
syntax = "v1"
|
||
|
||
info (
|
||
title: "GaoBinYou"
|
||
desc: "this service will manager chat services"
|
||
version: "0.0.1"
|
||
contactName: "daniel wang"
|
||
contactEmail: "igs170911@gmail.com"
|
||
consumes: "application/json"
|
||
produces: "application/json"
|
||
schemes: "http"
|
||
host: "127.0.0.1:8091"
|
||
)
|
||
|
||
type BaseReq {}
|
||
|
||
type BaseResp {}
|
||
|
||
type BaseResponse {
|
||
Code string `json:"code"` // 狀態碼
|
||
Message string `json:"message"` // 訊息
|
||
Data interface{} `json:"data,omitempty"` // 資料
|
||
Error interface{} `json:"error,omitempty"` // 可選的錯誤信息
|
||
}
|
||
|
||
type AuthHeader {
|
||
Authorization string `header:"Authorization" binding:"required"`
|
||
}
|
||
|
||
type AnonLoginReq {
|
||
Name string `json:"name" required:"required"`
|
||
}
|
||
|
||
type AnonLoginResp {
|
||
UID string `json:"uid"`
|
||
Token string `json:"token"`
|
||
CentrifugoToken string `json:"centrifugo_token"` // Centrifugo WebSocket 連線用的 token
|
||
RefreshToken string `json:"refresh_token"`
|
||
ExpireAt int64 `json:"expire_at"`
|
||
}
|
||
|
||
type RefreshTokenReq {
|
||
Token string `json:"token"` // 舊的 token(可以是已過期的)
|
||
}
|
||
|
||
type SendMessageReq {
|
||
AuthHeader
|
||
RoomID string `path:"room_id"`
|
||
Content string `json:"content"`
|
||
ClientMsgID string `json:"client_msg_id"`
|
||
}
|
||
|
||
type Message {
|
||
MessageID string `json:"message_id"`
|
||
UID string `json:"uid"`
|
||
Content string `json:"content"`
|
||
Timestamp int64 `json:"timestamp"`
|
||
}
|
||
|
||
type ListMessageReq {
|
||
AuthHeader
|
||
RoomID string `path:"room_id"`
|
||
PageSize int64 `form:"page_size,default=20"`
|
||
PageIndex int64 `form:"page_index,default=1"`
|
||
}
|
||
|
||
type Pagination {
|
||
Total int64 `json:"total,example=100"`
|
||
Page int64 `json:"page,example=1"`
|
||
PageSize int64 `json:"pageSize,example=10"`
|
||
TotalPages int64 `json:"totalPages,example=10"`
|
||
}
|
||
|
||
type ListMessageResp {
|
||
Pager Pagination `json:"pager"`
|
||
Data []Message `json:"data"`
|
||
}
|
||
|
||
// 加入配對池
|
||
type MatchJoinReq {
|
||
AuthHeader
|
||
}
|
||
|
||
type MatchJoinResp {
|
||
Status string `json:"status"` // waiting | matched
|
||
}
|
||
|
||
// 查詢配對結果(Polling 版,最快能上)
|
||
type MatchStatusResp {
|
||
Status string `json:"status"` // waiting | matched
|
||
RoomID string `json:"room_id,omitempty"`
|
||
}
|
||
|
||
@server (
|
||
group: chat
|
||
prefix: /api/v1
|
||
schemes: https
|
||
timeout: 10s
|
||
)
|
||
service chat-api {
|
||
@doc (
|
||
summary: "匿名登入"
|
||
description: "拿到匿名的token使得,確認聊天的身分"
|
||
)
|
||
/*
|
||
@respdoc-200 (AnonLoginResp)
|
||
@respdoc-400 (BaseResponse) "請求參數格式錯誤"
|
||
@respdoc-500 (BaseResponse) // 伺服器內部錯誤
|
||
*/
|
||
@handler AnonLogin
|
||
post /auth/anon (AnonLoginReq) returns (AnonLoginResp)
|
||
|
||
@doc (
|
||
summary: "刷新 Token"
|
||
description: "使用現有的 token 來刷新,同時更新 API token 和 Centrifugo token"
|
||
)
|
||
/*
|
||
@respdoc-200 (AnonLoginResp) "返回新的 token"
|
||
@respdoc-400 (BaseResponse) "請求參數格式錯誤"
|
||
@respdoc-401 (BaseResponse) "Token 無效或已過期"
|
||
@respdoc-500 (BaseResponse) // 伺服器內部錯誤
|
||
*/
|
||
@handler RefreshToken
|
||
post /auth/refresh (RefreshTokenReq) returns (AnonLoginResp)
|
||
}
|
||
|
||
@server (
|
||
group: chat
|
||
prefix: /api/v1
|
||
schemes: https
|
||
timeout: 10s
|
||
middleware: AnonMiddleware // 所有此 group 的路由都需要經過 JWT 驗證
|
||
)
|
||
service chat-api {
|
||
@doc (
|
||
summary: "傳送訊息"
|
||
description: "傳送訊息"
|
||
)
|
||
/*
|
||
@respdoc-201
|
||
@respdoc-400 (BaseResponse) "請求參數格式錯誤"
|
||
@respdoc-401 (BaseResponse) "未授權或 Token 無效"
|
||
@respdoc-500 (BaseResponse) // 伺服器內部錯誤
|
||
*/
|
||
@handler SendMessage
|
||
post /rooms/:room_id/messages (SendMessageReq) returns (BaseResp)
|
||
|
||
@doc (
|
||
summary: "取得訊息"
|
||
description: "取得訊息"
|
||
)
|
||
/*
|
||
@respdoc-200 (ListMessageResp) "取得聊天訊息"
|
||
@respdoc-400 (BaseResponse) "請求參數格式錯誤"
|
||
@respdoc-401 (BaseResponse) "未授權或 Token 無效"
|
||
@respdoc-500 (BaseResponse) // 伺服器內部錯誤
|
||
*/
|
||
@handler ListMessages
|
||
get /rooms/:room_id/messages (ListMessageReq) returns (ListMessageResp)
|
||
|
||
@doc (
|
||
summary: "加入等待序列"
|
||
description: "加入等待序列"
|
||
)
|
||
/*
|
||
@respdoc-201 (MatchJoinResp) ""
|
||
@respdoc-400 (BaseResponse) "請求參數格式錯誤"
|
||
@respdoc-401 (BaseResponse) "未授權或 Token 無效"
|
||
@respdoc-500 (BaseResponse) // 伺服器內部錯誤
|
||
*/
|
||
@handler MatchJoin
|
||
post /matchmaking/join (MatchJoinReq) returns (MatchJoinResp)
|
||
|
||
@doc (
|
||
summary: "取得房間資訊"
|
||
description: "取得房間資訊"
|
||
)
|
||
/*
|
||
@respdoc-201 (MatchStatusResp) "取得房間資訊"
|
||
@respdoc-400 (BaseResponse) "請求參數格式錯誤"
|
||
@respdoc-401 (BaseResponse) "未授權或 Token 無效"
|
||
@respdoc-500 (BaseResponse) // 伺服器內部錯誤
|
||
*/
|
||
@handler MatchStatus
|
||
get /matchmaking/status (MatchJoinReq) returns (MatchStatusResp)
|
||
}
|
||
|