128 lines
3.2 KiB
Go
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, "密钥已删除")
|
|
}
|