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, "密钥已删除") }