Files
nebula/internal/api/handler/auth.go
2026-03-10 16:26:48 +08:00

125 lines
2.6 KiB
Go

package handler
import (
"nebula/internal/api/response"
"nebula/internal/auth"
"github.com/gin-gonic/gin"
)
type AuthHandler struct {
service *auth.AuthService
}
func NewAuthHandler(service *auth.AuthService) *AuthHandler {
return &AuthHandler{service: service}
}
// Register 用户注册
// POST /api/auth/register
func (h *AuthHandler) Register(c *gin.Context) {
var req auth.RegisterRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailBadRequest(c, err.Error())
return
}
user, tokens, err := h.service.Register(req)
if err != nil {
response.FailServer(c, err.Error())
return
}
response.Ok(c, gin.H{
"user": user,
"tokens": tokens,
})
}
// Login 用户登录
// POST /api/auth/login
func (h *AuthHandler) Login(c *gin.Context) {
var req auth.LoginRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailBadRequest(c, err.Error())
return
}
user, tokens, err := h.service.Login(req)
if err != nil {
response.Fail(c, 401, err.Error())
return
}
response.Ok(c, gin.H{
"user": user,
"tokens": tokens,
})
}
// RefreshToken 刷新访问令牌
// POST /api/auth/refresh
func (h *AuthHandler) RefreshToken(c *gin.Context) {
var req auth.RefreshTokenRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailBadRequest(c, err.Error())
return
}
tokens, err := h.service.RefreshToken(req)
if err != nil {
response.Fail(c, 401, err.Error())
return
}
response.Ok(c, tokens)
}
// GetProfile 获取当前用户信息
// GET /api/auth/profile
func (h *AuthHandler) GetProfile(c *gin.Context) {
userID, exists := auth.GetCurrentUserID(c)
if !exists {
response.Fail(c, 401, "unauthorized")
return
}
user, err := h.service.GetUserByID(userID)
if err != nil {
response.FailServer(c, err.Error())
return
}
response.Ok(c, user)
}
// ChangePasswordRequest 修改密码请求
type ChangePasswordRequest struct {
OldPassword string `json:"oldPassword" binding:"required"`
NewPassword string `json:"newPassword" binding:"required,min=6"`
}
// ChangePassword 修改密码
// POST /api/auth/change-password
func (h *AuthHandler) ChangePassword(c *gin.Context) {
userID, exists := auth.GetCurrentUserID(c)
if !exists {
response.Fail(c, 401, "unauthorized")
return
}
var req ChangePasswordRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailBadRequest(c, err.Error())
return
}
err := h.service.ChangePassword(userID, req.OldPassword, req.NewPassword)
if err != nil {
response.FailServer(c, err.Error())
return
}
response.OkMsg(c, "password changed successfully")
}