package database import ( "context" "log/slog" "github.com/jackc/pgx/v5" "golang.org/x/crypto/blake2b" "git.jmbit.de/jmb/scanfile/server/internal/sqlc" "git.jmbit.de/jmb/scanfile/server/internal/store" ) // CreateFile() creates the filesystem object and the DB entry for a file func CreateFile(ctx context.Context, name string, fileBytes []byte) (sqlc.File, error) { queries := sqlc.New(pool) file := sqlc.File{ Name: name, } var err error bl2hash := blake2b.Sum256(fileBytes) file.Blake2 = bl2hash[:] file.Size = int64(len(fileBytes)) file.Mimetype, _ = store.GetBytesFileType(fileBytes[:262]) file, err = queries.CreateFile(ctx, sqlc.CreateFileParams{}) if err == pgx.ErrNoRows { slog.Info("File already exists", "file-uuid", file.ID.String()) return file, nil } if err != nil { slog.Error("Error saving file to database", "error", err, "file-name", name) err = nil } //Using UUIDs instead of the file hash to make switching storage backends easier _, err = store.SaveFile(file.ID.String(), fileBytes) if err != nil { slog.Error("Error saving file to disk", "error", err, "file-uuid", file.ID.String()) errdel := queries.DeleteFile(ctx, file.ID) if errdel != nil { slog.Error("Error deleting file from database", "error", errdel, "file-uuid", file.ID.String()) } return file, err } return file, nil }