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)
|
|||
|
|
}
|
|||
|
|
|