feat: add working watchdog cycle
This commit is contained in:
+43
-20
@@ -3,7 +3,8 @@ package api
|
||||
import (
|
||||
"eden-server/internal/crypto"
|
||||
"eden-server/internal/database"
|
||||
"eden-server/internal/runtime"
|
||||
"eden-server/internal/utility"
|
||||
"errors"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"path/filepath"
|
||||
@@ -13,7 +14,7 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func spawnFileRoutes(file *gin.RouterGroup, env runtime.Environment, db *gorm.DB) {
|
||||
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")
|
||||
@@ -27,26 +28,63 @@ func spawnFileRoutes(file *gin.RouterGroup, env runtime.Environment, db *gorm.DB
|
||||
file.POST("/upload", func(c *gin.Context) {
|
||||
f, err := c.FormFile("file")
|
||||
if err != nil {
|
||||
slog.Error("failed to get file details from request", "error", err)
|
||||
slog.Debug("no file or file headers provided on the request", "error", err)
|
||||
c.JSON(http.StatusBadRequest, RespObj{
|
||||
Msg: "a file is required",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
checksum, err := crypto.CalculateHashFromRequest(f)
|
||||
if err != nil {
|
||||
slog.Error("failed to calculate hash of file at given path", "error", err)
|
||||
c.JSON(http.StatusInternalServerError, RespObj{
|
||||
Msg: ieMes,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
e := filepath.Ext(f.Filename)
|
||||
m := categorizeFilemode(e)
|
||||
if m == database.Unspecified {
|
||||
slog.Warn("discarding file since its filetype is unsupported")
|
||||
slog.Debug("discarding file since its filetype is unsupported")
|
||||
c.JSON(http.StatusUnsupportedMediaType, RespObj{
|
||||
Msg: "unsupported filetype",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
safeName := uuid.New().String()[:8] + "_" + string(m) + e
|
||||
safeName := uuid.New().String() + "_" + string(m) + e
|
||||
destPath := filepath.Join(env.DataDirectory, "content", safeName)
|
||||
|
||||
fData := database.File{
|
||||
MediaType: m,
|
||||
MetaName: f.Filename,
|
||||
FileName: safeName,
|
||||
FilePath: destPath,
|
||||
Checksum: checksum,
|
||||
}
|
||||
|
||||
// first register the file to the database
|
||||
// error out if something bad happens (duplicate, failing db, etc)
|
||||
err = database.RegisterFile(db, fData)
|
||||
if 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",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
slog.Error("discarding file since an error occured", "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, destPath); err != nil {
|
||||
slog.Error("failed to receive the file over http:", "error", err)
|
||||
c.JSON(http.StatusInternalServerError, RespObj{
|
||||
@@ -55,21 +93,6 @@ func spawnFileRoutes(file *gin.RouterGroup, env runtime.Environment, db *gorm.DB
|
||||
return
|
||||
}
|
||||
|
||||
cSum, err := crypto.CalculateHash(destPath)
|
||||
if err != nil {
|
||||
slog.Error("failed to calculate hash of file at given path", "error", err)
|
||||
c.JSON(http.StatusInternalServerError, RespObj{
|
||||
Msg: ieMes,
|
||||
})
|
||||
}
|
||||
|
||||
fData := database.File{
|
||||
MediaType: m,
|
||||
GivenName: f.Filename,
|
||||
Filepath: destPath,
|
||||
Checksum: cSum,
|
||||
}
|
||||
database.RegisterFile(db, fData)
|
||||
c.JSON(http.StatusCreated, RespObj{
|
||||
Msg: "file has succesfully been uploaded",
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user