diff --git a/internal/server/api/routes/api.go b/internal/server/api/routes/api.go index 85eccfc..1c0576c 100644 --- a/internal/server/api/routes/api.go +++ b/internal/server/api/routes/api.go @@ -27,7 +27,7 @@ func RegisterApiRoutes(api *gin.RouterGroup /* env runtime.Environment,*/, db *g // Display the information on what is going on at the moment api.GET("/command", func(c *gin.Context) { - state, err := database.GetState(db) + state, err := database.LatestState(db) if err != nil { slog.Error("unable to determine state", "error", err) c.JSON(http.StatusInternalServerError, response.BasicResponse{ @@ -48,7 +48,7 @@ func RegisterApiRoutes(api *gin.RouterGroup /* env runtime.Environment,*/, db *g // define a route to check what is registered api.GET("/available", func(c *gin.Context) { - files, err := database.GetFiles(db) + files, err := database.ListFiles(db) if err != nil { slog.Error("failed to retrieve available files", "error", err) c.JSON(http.StatusInternalServerError, response.BasicResponse{ diff --git a/internal/server/api/routes/file.go b/internal/server/api/routes/file.go index 7a9967c..0213829 100644 --- a/internal/server/api/routes/file.go +++ b/internal/server/api/routes/file.go @@ -17,8 +17,8 @@ func RegisterFileRoutes(file *gin.RouterGroup, env bootstrap.Environment, db *go // prefix: file // for example: /file/ file.GET("/:filename", func(c *gin.Context) { - f := c.Param("filename") - p := filepath.Join(env.ContentDirectory, f) + fileParam := c.Param("filename") + p := filepath.Join(env.ContentDirectory, fileParam) c.File(p) }) @@ -50,7 +50,7 @@ func RegisterFileRoutes(file *gin.RouterGroup, env bootstrap.Environment, db *go return } - if err := database.RegisterFile(db, fileData); err != nil { + if err := database.CreateFile(db, fileData); err != nil { if errors.Is(err, gorm.ErrDuplicatedKey) { slog.Debug("discarding file since its checksum is a duplicate", "error", err) c.JSON(http.StatusConflict, response.BasicResponse{ @@ -80,4 +80,18 @@ func RegisterFileRoutes(file *gin.RouterGroup, env bootstrap.Environment, db *go Data: fileData, }) }) + + file.DELETE("/:filename", func(c *gin.Context) { + fileParam := c.Param("filename") + f, err := database.FindFileByName(db, fileParam) + + slog.Info("received a detelte request for a file", "file", f, "filename", fileParam) + + if err != nil { + slog.Error("failed to filter the file database for the name") + c.JSON(http.StatusNotFound, response.BasicResponse{ + Msg: response.IntErrMes, + }) + } + }) } diff --git a/internal/server/database/database.go b/internal/server/database/database.go index 3ea8467..cc02c1e 100644 --- a/internal/server/database/database.go +++ b/internal/server/database/database.go @@ -25,11 +25,11 @@ func KickoffDatabase(workDir string) (*gorm.DB, error) { // try to use GORM automigrate if the schema changes if err := db.AutoMigrate( - &Command{}, - &File{}, - &Tenant{}, - &Group{}, - &Device{}, + &Command{}, // app state and command status + &File{}, // files database for keeping track + &Tenant{}, // table for tenants and its data + &Group{}, // group table for privileges + &Device{}, // devices table ); err != nil { return nil, err } diff --git a/internal/server/database/functions.go b/internal/server/database/functions.go index 69793c5..051cc3c 100644 --- a/internal/server/database/functions.go +++ b/internal/server/database/functions.go @@ -1,64 +1,31 @@ package database import ( - "fmt" - "io" - "log/slog" - "orbits-server/internal/shared/utility" - "path/filepath" - "gorm.io/gorm" ) -// it has been made more general for DRY purposes -// this function should only be called after manually checking the filetype -func BuildFileRecord(r io.Reader, origName string, contentDirectory string) (File, error) { - ext := filepath.Ext(origName) - category := utility.CategorizeMediaType(ext) - if category == utility.Unspecified { - return File{}, fmt.Errorf("unsupported filetype") - } - - checksum, err := utility.GenerateHashFromReader(r) - if err != nil { - slog.Error("failed to calculate hash of file at given path", "error", err) - return File{}, err - } - - safeName := utility.GenerateSafeName(category, ext) - destPath := filepath.Join(contentDirectory, safeName) - - fData := File{ - MediaType: category, - MetaName: origName, - FileName: safeName, - FilePath: destPath, - Checksum: checksum, - } - - return fData, nil -} - -func GetState(db *gorm.DB) (Command, error) { +func LatestState(db *gorm.DB) (Command, error) { var state Command - - if err := db.First(&state).Error; err != nil { - return Command{}, err - } - - return state, nil + err := db.Last(&state).Error + return state, err } -func GetFiles(db *gorm.DB) ([]File, error) { +func ListFiles(db *gorm.DB) ([]File, error) { var files []File - - return files, db.Find(&files).Error + err := db.Find(&files).Error + return files, err } -func RegisterFile(db *gorm.DB, f File) error { +func FindFileByName(db *gorm.DB, name string) (File, error) { + var file File + err := db.Where("file_name = ?", name).First(&file).Error + return file, err +} + +func CreateFile(db *gorm.DB, f File) error { return db.Create(&f).Error } -func DeregisterFile(db *gorm.DB, f File) error { +func DeleteFile(db *gorm.DB, f File) error { return db.Delete(&f).Error } diff --git a/internal/server/database/utility.go b/internal/server/database/utility.go new file mode 100644 index 0000000..b4dbd44 --- /dev/null +++ b/internal/server/database/utility.go @@ -0,0 +1,38 @@ +package database + +import ( + "fmt" + "io" + "log/slog" + "orbits-server/internal/shared/utility" + "path/filepath" +) + +// it has been made more general for DRY purposes +// this function should only be called after manually checking the filetype +func BuildFileRecord(r io.Reader, origName string, contentDirectory string) (File, error) { + ext := filepath.Ext(origName) + category := utility.CategorizeMediaType(ext) + if category == utility.Unspecified { + return File{}, fmt.Errorf("unsupported filetype") + } + + checksum, err := utility.GenerateHashFromReader(r) + if err != nil { + slog.Error("failed to calculate hash of file at given path", "error", err) + return File{}, err + } + + safeName := utility.GenerateSafeName(category, ext) + destPath := filepath.Join(contentDirectory, safeName) + + f := File{ + MediaType: category, + MetaName: origName, + FileName: safeName, + FilePath: destPath, + Checksum: checksum, + } + + return f, nil +} diff --git a/internal/server/database/watchdog.go b/internal/server/database/watchdog.go index 03ac128..a8bfaa1 100644 --- a/internal/server/database/watchdog.go +++ b/internal/server/database/watchdog.go @@ -30,7 +30,7 @@ func filesystemGather(env bootstrap.Environment) (map[string]struct{}, error) { } func databaseGather(db *gorm.DB) (map[string]File, error) { - dbFiles, err := GetFiles(db) + dbFiles, err := ListFiles(db) if err != nil { slog.Error("failed to retrieve the files indexed from the database", "error", err) return nil, err @@ -88,7 +88,7 @@ func watchdog(env bootstrap.Environment, db *gorm.DB) { continue } - if err := RegisterFile(db, fileData); err != nil { + if err := CreateFile(db, fileData); err != nil { if errors.Is(err, gorm.ErrDuplicatedKey) { slog.Debug("discarding file since its a duplicate", "error", err) } else { @@ -128,7 +128,7 @@ func watchdog(env bootstrap.Environment, db *gorm.DB) { if len(dbdbOrphans) > 0 { slog.Info("database orphans detected, engaging flow") for _, f := range dbdbOrphans { - DeregisterFile(db, f) + DeleteFile(db, f) } } }