package handler import ( "errors" "net/http" "github.com/gin-gonic/gin" "wx_service/internal/model" "wx_service/internal/service" ) type AuthHandler struct { authService *service.AuthService } func NewAuthHandler(authService *service.AuthService) *AuthHandler { return &AuthHandler{ authService: authService, } } type weChatLoginRequest struct { MiniProgramID uint `json:"mini_program_id" binding:"required"` Code string `json:"code" binding:"required"` NickName string `json:"nickname"` AvatarURL string `json:"avatar_url"` Gender *int `json:"gender"` Phone string `json:"phone"` } func (h *AuthHandler) LoginWithWeChat(c *gin.Context) { var req weChatLoginRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "invalid request payload")) return } result, err := h.authService.LoginWithCode(c.Request.Context(), service.LoginRequest{ MiniProgramID: req.MiniProgramID, Code: req.Code, NickName: req.NickName, AvatarURL: req.AvatarURL, Gender: req.Gender, Phone: req.Phone, }) if err != nil { switch { case errors.Is(err, service.ErrCodeRequired): c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "code is required")) case errors.Is(err, service.ErrMiniProgramRequired): c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "mini_program_id is required")) case errors.Is(err, service.ErrMiniProgramNotFound): c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "mini program not found")) default: var apiErr *service.WeChatError if errors.As(err, &apiErr) { c.JSON(http.StatusBadGateway, model.Error(http.StatusBadGateway, apiErr.Error())) return } c.JSON(http.StatusInternalServerError, model.Error(http.StatusInternalServerError, "login failed")) } return } userPayload := gin.H{ "id": result.User.ID, "mini_program_id": result.User.MiniProgramID, "open_id": result.User.OpenID, "nickname": result.User.NickName, "avatar_url": result.User.AvatarURL, "gender": result.User.Gender, "phone": result.User.Phone, } if result.User.UnionID != "" { userPayload["union_id"] = result.User.UnionID } miniProgramPayload := gin.H{ "id": result.MiniProgram.ID, "name": result.MiniProgram.Name, "app_id": result.MiniProgram.AppID, } if result.MiniProgram.Description != "" { miniProgramPayload["description"] = result.MiniProgram.Description } c.JSON(http.StatusOK, model.Success(gin.H{ "user": userPayload, "session_key": result.SessionKey, "mini_program": miniProgramPayload, })) }