file-system/internal/api/endpoints/bucket_endpoint.go
向宁 b5df6445e5 refactor: commit all pending file_system changes
- Restructure handlers into file_commands/file_queries/file_handlers
- Add gRPC auth client, JWT middleware, rate limiting, request ID
- Add common utilities: logger, sanitizer, s3_errors
- Add unit tests for config, mediator, auth, request_id, sanitize
- Add proto definitions and generated code
- Remove old web UI pages
- Add .dockerignore and .env.example
2026-05-17 22:20:02 +08:00

114 lines
3.4 KiB
Go

package endpoints
import (
"rag/file-system/internal/api/handlers"
"rag/file-system/internal/api/requests"
"rag/file-system/internal/api/validators"
"rag/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 Create bucket
// @Description Create a new S3 bucket
// @Tags Bucket Management
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param request body requests.CreateBucketRequest true "Bucket creation parameters"
// @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 {
handleError(c, err)
return
}
c.JSON(http.StatusOK, gin.H{"message": result})
}
// ListBuckets godoc
// @Summary List buckets
// @Description List all available S3 buckets
// @Tags Bucket Management
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @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 {
handleError(c, err)
return
}
c.JSON(http.StatusOK, gin.H{"buckets": result})
}
// DeleteBucket godoc
// @Summary Delete bucket
// @Description Delete an S3 bucket (must be empty)
// @Tags Bucket Management
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param request body requests.DeleteBucketRequest true "Bucket deletion parameters"
// @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 {
handleError(c, err)
return
}
c.JSON(http.StatusOK, gin.H{"message": result})
}