feat:rock增加软删除和恢复删除
This commit is contained in:
@@ -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"))
|
||||
|
||||
Reference in New Issue
Block a user