feat:rock增加软删除和恢复删除

This commit is contained in:
2026-10-31 16:48:47 +08:00
parent 2d1ff1b520
commit 909867b9fb
23 changed files with 2116 additions and 82 deletions
+127
View File
@@ -3,6 +3,7 @@ package handler
import (
"errors"
"fmt"
"net/http"
"strconv"
"strings"
@@ -182,6 +183,132 @@ func (h *RockHandler) ImportAllUpstreamPackages(c *gin.Context) {
response.OK(c, result)
}
// PreviewTokenDelete 预览当前筛选条件下的 Token 删除风险。
func (h *RockHandler) PreviewTokenDelete(c *gin.Context) {
status := strings.TrimSpace(c.Query("status"))
search := strings.TrimSpace(c.Query("search"))
preview, err := h.rockSvc.PreviewRockTokenDelete(c.Request.Context(), status, search)
if err != nil {
response.BadRequest(c, err.Error())
return
}
response.OK(c, preview)
}
type batchDeleteTokensReq struct {
IDs []uint `json:"ids" binding:"required"`
Force bool `json:"force"`
ForceConfirmText string `json:"force_confirm_text"`
}
// BatchDeleteTokens 软删除勾选的 Token。
func (h *RockHandler) BatchDeleteTokens(c *gin.Context) {
var req batchDeleteTokensReq
if err := c.ShouldBindJSON(&req); err != nil || len(req.IDs) == 0 {
response.BadRequest(c, "请选择要删除的 Token")
return
}
if req.Force && strings.TrimSpace(req.ForceConfirmText) != "强制删除" {
response.BadRequest(c, "包含使用中/已绑定/绑定错误的 Token,请输入「强制删除」确认")
return
}
result, err := h.rockSvc.DeleteRockTokens(c.Request.Context(), req.IDs, req.Force, middleware.GetUserID(c))
if err != nil {
writeRockDeleteError(c, err)
return
}
response.OK(c, result)
}
type deleteAllTokensReq struct {
Status string `json:"status"`
Search string `json:"search"`
ExpectedCount int64 `json:"expected_count"`
Force bool `json:"force"`
ConfirmText string `json:"confirm_text"`
ForceConfirmText string `json:"force_confirm_text"`
}
// DeleteAllTokens 按当前筛选条件软删除全部 Token。
func (h *RockHandler) DeleteAllTokens(c *gin.Context) {
var req deleteAllTokensReq
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数解析失败")
return
}
if strings.TrimSpace(req.ConfirmText) != "全部删除" {
response.BadRequest(c, "请输入「全部删除」确认本次操作")
return
}
if req.ExpectedCount <= 0 {
response.BadRequest(c, "缺少删除预览数量,请刷新后重试")
return
}
if req.Force && strings.TrimSpace(req.ForceConfirmText) != "强制删除" {
response.BadRequest(c, "包含使用中/已绑定/绑定错误的 Token,请输入「强制删除」确认")
return
}
result, err := h.rockSvc.DeleteAllRockTokens(c.Request.Context(), req.Status, req.Search, req.ExpectedCount, req.Force, middleware.GetUserID(c))
if err != nil {
writeRockDeleteError(c, err)
return
}
response.OK(c, result)
}
func writeRockDeleteError(c *gin.Context, err error) {
var forceErr *service.RockTokenForceRequiredError
if errors.As(err, &forceErr) {
response.Fail(c, http.StatusBadRequest, 400, forceErr.Error())
return
}
var conflictErr *service.RockTokenDeleteConflictError
if errors.As(err, &conflictErr) {
response.Fail(c, http.StatusConflict, 409, conflictErr.Error())
return
}
response.BadRequest(c, err.Error())
}
// ListDeletedTokens 分页查询回收站中的 Token(软删除记录)。
func (h *RockHandler) ListDeletedTokens(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
status := strings.TrimSpace(c.Query("status"))
search := strings.TrimSpace(c.Query("search"))
tokens, total, err := h.rockSvc.ListDeletedRockTokens(c.Request.Context(), page, pageSize, status, search)
if err != nil {
response.BadRequest(c, err.Error())
return
}
response.OK(c, gin.H{
"list": tokens,
"total": total,
"page": page,
"page_size": pageSize,
})
}
type restoreTokensReq struct {
IDs []uint `json:"ids" binding:"required"`
}
// RestoreTokens 恢复回收站中的 Token;冲突记录会被跳过并返回原因。
func (h *RockHandler) RestoreTokens(c *gin.Context) {
var req restoreTokensReq
if err := c.ShouldBindJSON(&req); err != nil || len(req.IDs) == 0 {
response.BadRequest(c, "请选择要恢复的 Token")
return
}
result, err := h.rockSvc.RestoreRockTokens(c.Request.Context(), req.IDs, middleware.GetUserID(c))
if err != nil {
response.BadRequest(c, err.Error())
return
}
response.OK(c, result)
}
// ListTokens 分页获取 Token 库存列表
func (h *RockHandler) ListTokens(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))