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}) }