scanfile/server/internal/database/createFile.go

51 lines
1.4 KiB
Go

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
}