package controllers import ( "errors" "clapclap/internal/apperr" "clapclap/internal/ginctx" "clapclap/internal/models" "github.com/gin-gonic/gin" ) // GetUploadUrl godoc // @Summary Get S3 Presigned Upload URL // @Description Generates a presigned URL to securely upload a file directly to S3 // @Tags upload // @Accept json // @Produce json // @Param type path string true "Type of upload" Enums(track, artwork, avatar) // @Param request body dtos.UploadFile true "File metadata" // @Success 200 {object} map[string]interface{} // @Failure 401 {object} swaggError401 // @Failure 500 {object} swaggError500 // @Security BearerAuth // @Router /upload/upload-url/{type} [post] func GetUploadUrl(c *gin.Context) { userUUID, _ := ginctx.GetUUID(c, "userID") repo, _ := ginctx.GetRepo(c, "repo") objectKey := c.GetString("s3ObjectKey") if objectKey == "" { apperr.AbortWithError(c, apperr.NewInternalServerError(errors.New("GetUploadUrl: no object key"))) return } postReq, err := ginctx.GetPresignedUrl(c, "presignedUrl") if err != nil { apperr.AbortWithError(c, apperr.NewInternalServerError(err)) return } trackUpload := models.Upload{ UserID: userUUID, ObjectKey: objectKey, } if err := repo.CreateUpload(&trackUpload); err != nil { apperr.AbortWithError(c, apperr.NewDatabaseError(err, "Failed to create upload record")) return } c.JSON(200, gin.H{ "upload_url": postReq.URL, "object_key": objectKey, "fields": postReq.Values, }) }