Files
filestoragesystem/go/internal/controller/auth.go
T
2026-08-23 00:48:10 +08:00

128 lines
3.2 KiB
Go

package controller
import (
"github.com/gin-gonic/gin"
"filestoragesystem/internal/middleware"
"filestoragesystem/internal/utils"
)
// AuthController 认证控制器
type AuthController struct {
*Base
}
// NewAuthController 创建认证控制器
func NewAuthController(b *Base) *AuthController { return &AuthController{Base: b} }
type registerReq struct {
Username string `json:"username" binding:"required"`
Email string `json:"email" binding:"required"`
Password string `json:"password" binding:"required"`
}
// Register 用户注册
func (ctl *AuthController) Register(c *gin.Context) {
var req registerReq
if !bindJSON(c, &req) {
return
}
u, err := ctl.svc.Auth.Register(req.Username, req.Email, req.Password)
if err != nil {
ctl.svc.RecordOpLog(ctl.opCtx(c), "create", "user", 0, req.Username, false, err.Error())
utils.FailMsg(c, err.Error())
return
}
ctl.svc.RecordOpLog(ctl.opCtx(c), "create", "user", u.ID, u.Username, true, "")
utils.OK(c, gin.H{"id": u.ID, "username": u.Username, "email": u.Email})
}
type loginReq struct {
Account string `json:"account" binding:"required"` // 用户名或邮箱
Password string `json:"password" binding:"required"`
}
// Login 用户登录
func (ctl *AuthController) Login(c *gin.Context) {
var req loginReq
if !bindJSON(c, &req) {
return
}
ip := utils.ClientIP(c)
u, token, err := ctl.svc.Auth.Login(req.Account, req.Password, ip)
if err != nil {
ctl.svc.RecordOpLog(ctl.opCtx(c), "login", "user", 0, req.Account, false, err.Error())
utils.Unauthorized(c, err.Error())
return
}
oc := ctl.opCtx(c)
uid := u.ID
oc.UserID = &uid
oc.Username = u.Username
ctl.svc.RecordOpLog(oc, "login", "user", u.ID, u.Username, true, "")
utils.OK(c, gin.H{
"token": token,
"user": gin.H{
"id": u.ID,
"username": u.Username,
"email": u.Email,
"role": u.Role,
"storage_used": u.StorageUsed,
"storage_limit": u.StorageLimit,
},
})
}
type createAPIKeyReq struct {
Name string `json:"name"`
}
// CreateAPIKey 生成API密钥
func (ctl *AuthController) CreateAPIKey(c *gin.Context) {
var req createAPIKeyReq
if !bindJSON(c, &req) {
return
}
userID := middleware.CurrentUserID(c)
key, secret, err := ctl.svc.Auth.CreateAPIKey(userID, req.Name)
if err != nil {
utils.FailMsg(c, err.Error())
return
}
ctl.svc.RecordOpLog(ctl.opCtx(c), "create", "apikey", key.ID, key.Name, true, "")
utils.OK(c, gin.H{
"id": key.ID,
"access_key": key.AccessKey,
"secret_key": secret, // 仅创建时返回一次
"name": key.Name,
"notice": "secret_key仅在创建时展示,请妥善保存",
})
}
// ListAPIKeys 密钥列表
func (ctl *AuthController) ListAPIKeys(c *gin.Context) {
userID := middleware.CurrentUserID(c)
keys, err := ctl.svc.Auth.ListAPIKeys(userID)
if err != nil {
utils.ServerError(c, err.Error())
return
}
utils.OK(c, keys)
}
// DeleteAPIKey 删除密钥
func (ctl *AuthController) DeleteAPIKey(c *gin.Context) {
id, ok := paramID(c)
if !ok {
return
}
userID := middleware.CurrentUserID(c)
if err := ctl.svc.Auth.DeleteAPIKey(userID, id); err != nil {
utils.FailMsg(c, err.Error())
return
}
ctl.svc.RecordOpLog(ctl.opCtx(c), "delete", "apikey", id, "", true, "")
utils.OKMsg(c, "密钥已删除")
}