Files
orbits/internal/api/routes_file.go
T
2026-04-22 16:29:07 +02:00

80 lines
1.9 KiB
Go

package api
import (
"errors"
"log/slog"
"net/http"
"orbits-server/internal/database"
"orbits-server/internal/utility"
"path/filepath"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func spawnFileRoutes(file *gin.RouterGroup, env utility.Environment, db *gorm.DB) {
// /file/<file-name>
file.GET("/:filename", func(c *gin.Context) {
f := c.Param("filename")
p := filepath.Join(env.DataDirectory, "content", f)
c.File(p)
})
// define the upload route
// /file/upload
file.POST("/upload", func(c *gin.Context) {
f, err := c.FormFile("file")
if err != nil {
slog.Debug("no file or file headers provided on the request", "error", err)
c.JSON(http.StatusBadRequest, RespObj{
Msg: "a file is required",
})
return
}
readerStream, err := f.Open()
if err != nil {
slog.Error("failed to a reader stream")
}
defer readerStream.Close()
fileData, err := database.BuildFileRecord(readerStream, f.Filename, env.ContentDirectory)
if err != nil {
slog.Error("failed to enroll file to the database", "error", err)
c.JSON(http.StatusInternalServerError, RespObj{
Msg: ieMes,
})
return
}
if err := database.RegisterFile(db, fileData); err != nil {
if errors.Is(err, gorm.ErrDuplicatedKey) {
slog.Debug("discarding file since its a duplicate", "error", err)
c.JSON(http.StatusConflict, RespObj{
Msg: "file is a duplicate",
})
} else {
slog.Error("failed to insert filedata to the database", "error", err)
c.JSON(http.StatusInternalServerError, RespObj{
Msg: ieMes,
})
}
return
}
// save to filesystem after everything has given a green light
if err := c.SaveUploadedFile(f, fileData.FilePath); err != nil {
slog.Error("failed to receive the file over http:", "error", err)
c.JSON(http.StatusInternalServerError, RespObj{
Msg: ieMes,
})
return
}
c.JSON(http.StatusCreated, RespObj{
Msg: "file has succesfully been uploaded",
})
})
}