add file upload logic (it's kinda broken rn)

This commit is contained in:
wisplite
2025-11-23 00:27:57 -06:00
parent f764e888d6
commit b61bd2f8d6
6 changed files with 102 additions and 20 deletions
+1
View File
@@ -23,6 +23,7 @@ func Init() bool {
&models.User{},
&models.AccessToken{},
&models.UserAlbumAccess{},
&models.Media{},
)
if err != nil {
log.Fatal("failed to migrate database: ", err)
+39
View File
@@ -0,0 +1,39 @@
package routes
import (
"net/http"
"os"
"path/filepath"
"github.com/gin-gonic/gin"
"github.com/wisplite/raster/internal/services"
)
func RegisterMediaRoutes(rg *gin.RouterGroup) {
media := rg.Group("/media")
media.POST("/uploadMedia", func(c *gin.Context) {
file, err := c.FormFile("file")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
accessToken := c.GetHeader("Authorization")
albumID := c.PostForm("albumId")
media, err := services.UploadMedia(file, albumID, accessToken)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
if err := os.MkdirAll(filepath.Dir(media.Path), 0755); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to create directory"})
return
}
if err := c.SaveUploadedFile(file, media.Path); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to save file"})
return
}
c.JSON(http.StatusOK, gin.H{"media": media})
})
}
+1
View File
@@ -6,4 +6,5 @@ func RegisterRoutes(r *gin.Engine) {
rg := r.Group("/api")
RegisterAlbumRoutes(rg)
RegisterUserRoutes(rg)
RegisterMediaRoutes(rg)
}
+40
View File
@@ -0,0 +1,40 @@
package services
import (
"fmt"
"github.com/google/uuid"
"github.com/wisplite/raster/internal/db"
"github.com/wisplite/raster/internal/models"
"mime/multipart"
)
func UploadMedia(file *multipart.FileHeader, albumID string, accessToken string) (models.Media, error) {
userID, err := ValidateAccessToken(accessToken)
if err != nil {
return models.Media{}, err
}
accessLevel, err := CheckUserAlbumAccess(userID, albumID)
if err != nil {
return models.Media{}, err
}
if accessLevel < 1 {
return models.Media{}, fmt.Errorf("user does not have permission to upload media to this album")
}
albumPath := albumID
if albumID == "" {
albumPath = "root"
}
mediaID := uuid.New().String()
mediaPath := fmt.Sprintf("media/%s/%s.%s", albumPath, mediaID, file.Filename)
media := models.Media{
ID: mediaID,
AlbumID: albumID,
Path: mediaPath,
Type: file.Header.Get("Content-Type"),
}
result := db.GetDB().Create(&media)
if result.Error != nil {
return models.Media{}, result.Error
}
return media, nil
}