57 lines
2.2 KiB
Go
57 lines
2.2 KiB
Go
// Package meeting 会议模块(Phase 2e-2)
|
||
package meeting
|
||
|
||
import (
|
||
"github.com/echochat/backend/app/meeting/controller"
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// RegisterRoutes 注册 meeting 模块的全部前台路由
|
||
// 所有接口统一挂载在 /api/v1/meeting/* 前缀下,均需 JWT 认证
|
||
// 设计文档 §6.2 的 12 个接口 Task 4 骨架阶段仅搭路由层,业务实现留待 Task 5/6/7
|
||
// Phase B 新增录制三接口(POST/DELETE/GET /rooms/:code/recordings*)
|
||
func RegisterRoutes(
|
||
r *gin.Engine,
|
||
ctrl *controller.MeetingController,
|
||
recordingCtrl *controller.MeetingRecordingController,
|
||
jwtAuth gin.HandlerFunc,
|
||
) {
|
||
authed := r.Group("/api/v1/meeting")
|
||
authed.Use(jwtAuth)
|
||
{
|
||
// 会议房间生命周期
|
||
authed.POST("/rooms", ctrl.CreateRoom)
|
||
authed.GET("/rooms/mine", ctrl.ListMyMeetings)
|
||
authed.GET("/rooms/:code", ctrl.GetRoom)
|
||
authed.POST("/rooms/:code/join", ctrl.JoinRoom)
|
||
authed.POST("/rooms/:code/leave", ctrl.LeaveRoom)
|
||
authed.POST("/rooms/:code/end", ctrl.EndRoom)
|
||
|
||
authed.POST("/rooms/:code/transfer-host", ctrl.TransferHost)
|
||
authed.POST("/rooms/:code/kick", ctrl.KickMember)
|
||
|
||
authed.POST("/rooms/:code/invite", ctrl.InviteUsers)
|
||
authed.POST("/invite-tokens/:token/redeem", ctrl.RedeemInvite)
|
||
|
||
authed.POST("/rooms/:code/chats", ctrl.SendChat)
|
||
authed.GET("/rooms/:code/chats", ctrl.ListChats)
|
||
|
||
// 会议录制(Phase B 引入)
|
||
authed.POST("/rooms/:code/recordings", recordingCtrl.StartRecording)
|
||
authed.DELETE("/rooms/:code/recordings/:id", recordingCtrl.StopRecording)
|
||
authed.GET("/rooms/:code/recordings", recordingCtrl.ListRecordings)
|
||
}
|
||
|
||
// 内部 webhook(Phase B watchdog):media-server 异常退出回调
|
||
// 鉴权由 controller 内部用 X-Internal-Secret header + INTERNAL_WEBHOOK_SECRET 校验
|
||
// 不走 JWT,因为调用方是 media-server 而非用户
|
||
r.POST("/internal/meeting/recordings/failure", recordingCtrl.MediaServerFailureWebhook)
|
||
|
||
internalCloudLaw := r.Group("/internal/cloud-law")
|
||
{
|
||
internalCloudLaw.POST("/meetings", ctrl.CloudLawCreateMeeting)
|
||
internalCloudLaw.GET("/meetings/:code", ctrl.CloudLawGetMeeting)
|
||
internalCloudLaw.POST("/meetings/:code/end", ctrl.CloudLawEndMeeting)
|
||
}
|
||
}
|