feat: add locally syncing and watchdog

This commit is contained in:
DaanSelen
2026-04-22 15:26:59 +02:00
parent 0c287cc917
commit ec3a996d6a
12 changed files with 283 additions and 179 deletions
+15 -36
View File
@@ -1,7 +1,6 @@
package api
import (
"eden-server/internal/crypto"
"eden-server/internal/database"
"eden-server/internal/utility"
"errors"
@@ -10,7 +9,6 @@ import (
"path/filepath"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"gorm.io/gorm"
)
@@ -35,57 +33,38 @@ func spawnFileRoutes(file *gin.RouterGroup, env utility.Environment, db *gorm.DB
return
}
checksum, err := crypto.CalculateHashFromRequest(f)
readerStream, err := f.Open()
if err != nil {
slog.Error("failed to calculate hash of file at given path", "error", err)
slog.Error("failed to open uploaded file in memory")
}
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
}
e := filepath.Ext(f.Filename)
m := categorizeFilemode(e)
if m == database.Unspecified {
slog.Debug("discarding file since its filetype is unsupported")
c.JSON(http.StatusUnsupportedMediaType, RespObj{
Msg: "unsupported filetype",
})
return
}
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 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",
})
return
} else {
slog.Error("failed to insert filedata to the database", "error", err)
c.JSON(http.StatusInternalServerError, RespObj{
Msg: ieMes,
})
}
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 {
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,