From 1079ec44ebcd35de72fbeacd728a8a629c85285e Mon Sep 17 00:00:00 2001 From: Huangliancheng <3250106384@zju.edu.cn> Date: Tue, 26 May 2026 16:51:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A5=BD=E5=83=8F=E7=9C=9F=E7=9A=84=E4=B8=8D?= =?UTF-8?q?=E5=A4=AA=E4=BC=9A=E8=BF=99=E4=B8=AA=EF=BC=8C=E8=BF=99=E6=98=AF?= =?UTF-8?q?ai=E5=86=99=E7=9A=84=E4=BB=A3=E7=A0=81=E6=88=91=E4=B9=9F?= =?UTF-8?q?=E4=B8=8D=E7=9F=A5=E9=81=93=E5=8F=AF=E4=BB=A5=E7=94=A8=E5=90=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/room_member_handler | 139 +++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 internal/room_member_handler diff --git a/internal/room_member_handler b/internal/room_member_handler new file mode 100644 index 0000000..a536483 --- /dev/null +++ b/internal/room_member_handler @@ -0,0 +1,139 @@ +package group6 + +import ( + "net/http" + "strconv" + + "github.com/gin-gonic/gin" +) + +type RoomMemberHandler struct { + svc *RoomMemberService +} + +func NewRoomMemberHandler(svc *RoomMemberService) *RoomMemberHandler { + return &RoomMemberHandler{svc: svc} +} + +// Join POST /rooms/:id/join +func (h *RoomMemberHandler) Join(c *gin.Context) { + roomID, _ := strconv.ParseUint(c.Param("id"), 10, 64) + userID := c.GetUint("userID") + + if err := h.svc.JoinDirectly(c.Request.Context(), uint(roomID), uint(userID)); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": "加入成功"}) +} + +// Apply POST /rooms/:id/apply +func (h *RoomMemberHandler) Apply(c *gin.Context) { + roomID, _ := strconv.ParseUint(c.Param("id"), 10, 64) + userID := c.GetUint("userID") + + var input struct { + Message string `json:"message"` + } + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "无效的输入"}) + return + } + + if err := h.svc.ApplyToJoin(c.Request.Context(), uint(roomID), uint(userID), input.Message); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusAccepted, gin.H{"message": "申请已提交"}) +} + +// JoinByCode POST /rooms/join-by-code +func (h *RoomMemberHandler) JoinByCode(c *gin.Context) { + userID := c.GetUint("userID") + var input struct { + Code string `json:"code" binding:"required"` + } + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "邀请码必填"}) + return + } + + if err := h.svc.JoinByCode(c.Request.Context(), input.Code, uint(userID)); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": "加入成功"}) +} + +// Approve POST /rooms/:id/approve +func (h *RoomMemberHandler) Approve(c *gin.Context) { + roomID, _ := strconv.ParseUint(c.Param("id"), 10, 64) + ownerID := c.GetUint("userID") + + var input struct { + RequestID uint `json:"request_id" binding:"required"` + } + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "申请ID必填"}) + return + } + + if err := h.svc.ApproveRequest(c.Request.Context(), uint(roomID), input.RequestID, uint(ownerID)); err != nil { + c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": "审批成功"}) +} + +// Reject POST /rooms/:id/reject +func (h *RoomMemberHandler) Reject(c *gin.Context) { + roomID, _ := strconv.ParseUint(c.Param("id"), 10, 64) + ownerID := c.GetUint("userID") + + var input struct { + RequestID uint `json:"request_id" binding:"required"` + } + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "申请ID必填"}) + return + } + + if err := h.svc.RejectRequest(c.Request.Context(), uint(roomID), input.RequestID, uint(ownerID)); err != nil { + c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": "已拒绝申请"}) +} + +// Invite POST /rooms/:id/invite +func (h *RoomMemberHandler) Invite(c *gin.Context) { + roomID, _ := strconv.ParseUint(c.Param("id"), 10, 64) + ownerID := c.GetUint("userID") + + var input struct { + UserID uint `json:"user_id" binding:"required"` + } + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "被邀请用户ID必填"}) + return + } + + if err := h.svc.InviteMember(c.Request.Context(), uint(roomID), input.UserID, uint(ownerID)); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": "邀请成功"}) +} + +// Remove POST /rooms/:id/members/:userId/remove +func (h *RoomMemberHandler) Remove(c *gin.Context) { + roomID, _ := strconv.ParseUint(c.Param("id"), 10, 64) + targetUserID, _ := strconv.ParseUint(c.Param("userId"), 10, 64) + ownerID := c.GetUint("userID") + + if err := h.svc.RemoveMember(c.Request.Context(), uint(roomID), uint(targetUserID), uint(ownerID)); err != nil { + c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": "移除成功"}) +}