diff --git a/internal/api/routes/files.go b/internal/api/routes/files.go index ee1d295..28accb4 100644 --- a/internal/api/routes/files.go +++ b/internal/api/routes/files.go @@ -62,6 +62,57 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { c.JSON(200, gin.H{"message": "file uploaded successfully", "file_id": fileMeta.ID}) }) + api.DELETE("/delete", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { + claims := c.MustGet("claims").(jwt.MapClaims) + user := claims["user"].(auth.User) + + uid := user.ID + if uid == "" { + c.JSON(401, gin.H{"error": "unauthorized"}) + return + } + + var response struct { + FileID string `json:"file_id" binding:"required"` + } + + if err := c.ShouldBindJSON(&response); err != nil { + c.JSON(400, gin.H{"error": "file_id is required"}) + return + } + + resfID := response.FileID + if resfID == "" { + c.JSON(400, gin.H{"error": "file_id cannot be empty"}) + return + } + + parts := strings.SplitN(resfID, "_", 2) + if len(parts) != 2 { + c.JSON(400, gin.H{"error": "invalid file_id format"}) + return + } + + fileID, filename := parts[0], parts[1] + if fileID != uid { + c.JSON(403, gin.H{"error": "you can only delete your own files"}) + return + } + + filePath := filepath.Join(cfg.ImagePath, uid, filename) + if err := os.Remove(filePath); err != nil { + c.JSON(500, gin.H{"error": "failed to delete file"}) + return + } + + if err := cfg.Database.Where("id = ?", resfID).Delete(&types.File{}).Error; err != nil { + c.JSON(500, gin.H{"error": "failed to delete file metadata"}) + return + } + + c.JSON(200, gin.H{"message": "file deleted successfully"}) + }) + api.GET("/:name", func(c *gin.Context) { name := c.Param("name") parts := strings.SplitN(name, "_", 2)