Files
wx_service/internal/quitcheckin/handler/supervisor_handler.go
T

122 lines
3.7 KiB
Go

package handler
import (
"net/http"
"strings"
"time"
"github.com/gin-gonic/gin"
"wx_service/internal/middleware"
"wx_service/internal/model"
)
type createSupervisorInviteRequest struct {
Days int `json:"days"`
}
// CreateSupervisorInvite POST /api/v2/supervisor/invites
func (h *Handler) CreateSupervisorInvite(c *gin.Context) {
user := middleware.MustCurrentUser(c)
var req createSupervisorInviteRequest
_ = c.ShouldBindJSON(&req)
res, err := h.service.CreateSupervisorInvite(c.Request.Context(), int(user.ID), time.Now(), req.Days)
if err != nil {
c.JSON(http.StatusInternalServerError, model.Error(http.StatusInternalServerError, "生成邀请失败,请稍后重试"))
return
}
c.JSON(http.StatusOK, model.Success(res))
}
type bindSupervisorInviteRequest struct {
Token string `json:"token"`
}
// BindSupervisorInvite POST /api/v2/supervisor/bind
func (h *Handler) BindSupervisorInvite(c *gin.Context) {
user := middleware.MustCurrentUser(c)
var req bindSupervisorInviteRequest
if err := c.ShouldBindJSON(&req); err != nil || strings.TrimSpace(req.Token) == "" {
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "请求参数错误"))
return
}
if err := h.service.BindSupervisorInvite(c.Request.Context(), int(user.ID), req.Token, time.Now()); err != nil {
msg := "绑定失败,请稍后重试"
switch err {
case nil:
// no-op
default:
// 针对业务错误给出更友好的提示
switch err.Error() {
case "邀请不存在":
msg = "邀请不存在"
case "邀请已过期":
msg = "邀请已过期"
case "邀请已被使用":
msg = "邀请已被使用"
case "不能绑定自己为监督人":
msg = "不能绑定自己"
case "监督关系已存在":
msg = "已绑定,无需重复操作"
case "监督人已达上限":
msg = "对方监督人已达上限(最多 3 人)"
}
}
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, msg))
return
}
c.JSON(http.StatusOK, model.Success(gin.H{"ok": true}))
}
// GetSupervisorOverview GET /api/v2/supervisor/overview
func (h *Handler) GetSupervisorOverview(c *gin.Context) {
user := middleware.MustCurrentUser(c)
res, err := h.service.GetSupervisorOverview(c.Request.Context(), int(user.ID), time.Now())
if err != nil {
c.JSON(http.StatusInternalServerError, model.Error(http.StatusInternalServerError, "获取监督概览失败,请稍后重试"))
return
}
c.JSON(http.StatusOK, model.Success(res))
}
// GetSupervisorStatus GET /api/v2/supervisor/status
func (h *Handler) GetSupervisorStatus(c *gin.Context) {
user := middleware.MustCurrentUser(c)
res, err := h.service.GetSupervisorStatus(c.Request.Context(), int(user.ID))
if err != nil {
c.JSON(http.StatusInternalServerError, model.Error(http.StatusInternalServerError, "获取监督信息失败,请稍后重试"))
return
}
c.JSON(http.StatusOK, model.Success(res))
}
type revokeSupervisorBindingRequest struct {
OwnerUID int `json:"owner_uid"`
SupervisorUID int `json:"supervisor_uid"`
}
// RevokeSupervisorBinding POST /api/v2/supervisor/revoke
func (h *Handler) RevokeSupervisorBinding(c *gin.Context) {
user := middleware.MustCurrentUser(c)
var req revokeSupervisorBindingRequest
if err := c.ShouldBindJSON(&req); err != nil || req.OwnerUID <= 0 || req.SupervisorUID <= 0 {
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "请求参数错误"))
return
}
if err := h.service.RevokeSupervisorBinding(c.Request.Context(), int(user.ID), req.OwnerUID, req.SupervisorUID, time.Now()); err != nil {
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "解除失败"))
return
}
c.JSON(http.StatusOK, model.Success(gin.H{"ok": true}))
}