87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
package user
|
||
|
||
import (
|
||
"net/http"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
type Handler struct {
|
||
svc *Service
|
||
}
|
||
|
||
func NewHandler(svc *Service) *Handler {
|
||
return &Handler{svc: svc}
|
||
}
|
||
|
||
type registerReq struct {
|
||
Username string `json:"username"`
|
||
Password string `json:"password"`
|
||
}
|
||
|
||
type loginReq struct {
|
||
Username string `json:"username"`
|
||
Password string `json:"password"`
|
||
}
|
||
|
||
func (h *Handler) Register(c *gin.Context) {
|
||
var req registerReq
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "invalid request"})
|
||
return
|
||
}
|
||
|
||
if err := h.svc.Register(c.Request.Context(), req.Username, req.Password); err != nil {
|
||
if err == ErrUserAlreadyExists {
|
||
c.JSON(http.StatusConflict, gin.H{"code": 409, "message": "user already exists"})
|
||
return
|
||
}
|
||
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": err.Error()})
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "register success"})
|
||
}
|
||
|
||
func (h *Handler) Login(c *gin.Context) {
|
||
var req loginReq
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "invalid request"})
|
||
return
|
||
}
|
||
|
||
token, err := h.svc.Login(c.Request.Context(), req.Username, req.Password)
|
||
if err != nil {
|
||
// login 统一返回 401,避免泄露用户名是否存在
|
||
c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "invalid credentials"})
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, gin.H{
|
||
"code": 0,
|
||
"message": "login success",
|
||
"data": gin.H{
|
||
"token": token,
|
||
"token_type": "Bearer",
|
||
},
|
||
})
|
||
}
|
||
|
||
// Me 当前登录用户信息(需要 JWT middleware)。
|
||
func (h *Handler) Me(c *gin.Context) {
|
||
username, ok := c.Get("username")
|
||
if !ok || username == "" {
|
||
c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "unauthorized"})
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, gin.H{
|
||
"code": 0,
|
||
"message": "ok",
|
||
"data": gin.H{
|
||
"username": username,
|
||
},
|
||
})
|
||
}
|
||
|