- 新增 DeleteBucketHandler 处理存储桶删除请求 - 添加 DELETE /buckets API 端点 - 在前端界面添加删除存储桶按钮功能 - 添加存储桶删除请求验证器 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
120 lines
3.9 KiB
Go
120 lines
3.9 KiB
Go
package endpoints
|
|
|
|
import (
|
|
"file-system/internal/api/handlers"
|
|
"file-system/internal/api/requests"
|
|
"file-system/internal/api/validators"
|
|
"file-system/internal/common"
|
|
"file-system/internal/infrastructure/mediator"
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type BucketEndpoint struct {
|
|
Mediator *mediator.Mediator
|
|
CreateBucketValidator *validators.CreateBucketValidator
|
|
}
|
|
|
|
func NewBucketEndpoint(m *mediator.Mediator, cbv *validators.CreateBucketValidator) *BucketEndpoint {
|
|
return &BucketEndpoint{
|
|
Mediator: m,
|
|
CreateBucketValidator: cbv,
|
|
}
|
|
}
|
|
|
|
// CreateBucket godoc
|
|
// @Summary 创建存储桶
|
|
// @Description 创建一个新的 S3 存储桶
|
|
// @Tags 存储桶管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body requests.CreateBucketRequest true "创建存储桶请求参数"
|
|
// @Success 200 {object} map[string]string "创建成功消息"
|
|
// @Failure 400 {object} map[string]string "参数错误"
|
|
// @Failure 500 {object} map[string]string "服务器内部错误"
|
|
// @Router /buckets [post]
|
|
func (e *BucketEndpoint) CreateBucket(c *gin.Context) {
|
|
var req requests.CreateBucketRequest
|
|
if err := c.ShouldBind(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if err := e.CreateBucketValidator.Validate(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
cmd := handlers.CreateBucketCommand{BucketName: req.BucketName}
|
|
|
|
result, err := mediator.Send[handlers.CreateBucketCommand, string](e.Mediator, c.Request.Context(), cmd)
|
|
if err != nil {
|
|
if be, ok := err.(*common.BusinessException); ok {
|
|
c.JSON(be.Code, gin.H{"error": be.Message})
|
|
} else {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
}
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": result})
|
|
}
|
|
|
|
// ListBuckets godoc
|
|
// @Summary 获取存储桶列表
|
|
// @Description 列出所有可用的 S3 存储桶
|
|
// @Tags 存储桶管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {object} map[string][]string "存储桶列表"
|
|
// @Failure 500 {object} map[string]string "服务器内部错误"
|
|
// @Router /buckets [get]
|
|
func (e *BucketEndpoint) ListBuckets(c *gin.Context) {
|
|
query := handlers.ListBucketsQuery{}
|
|
result, err := mediator.Send[handlers.ListBucketsQuery, []string](e.Mediator, c.Request.Context(), query)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"buckets": result})
|
|
}
|
|
|
|
// DeleteBucket godoc
|
|
// @Summary 删除存储桶
|
|
// @Description 删除指定的 S3 存储桶(桶必须为空)
|
|
// @Tags 存储桶管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body requests.DeleteBucketRequest true "删除存储桶请求参数"
|
|
// @Success 200 {object} map[string]string "删除成功消息"
|
|
// @Failure 400 {object} map[string]string "参数错误"
|
|
// @Failure 500 {object} map[string]string "服务器内部错误"
|
|
// @Router /buckets [delete]
|
|
func (e *BucketEndpoint) DeleteBucket(c *gin.Context) {
|
|
var req requests.DeleteBucketRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if err := e.CreateBucketValidator.ValidateDelete(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
cmd := handlers.DeleteBucketCommand{BucketName: req.BucketName}
|
|
|
|
result, err := mediator.Send[handlers.DeleteBucketCommand, string](e.Mediator, c.Request.Context(), cmd)
|
|
if err != nil {
|
|
if be, ok := err.(*common.BusinessException); ok {
|
|
c.JSON(be.Code, gin.H{"error": be.Message})
|
|
} else {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
}
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": result})
|
|
}
|