package database import ( "context" "encoding/hex" "log/slog" "github.com/google/uuid" "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, size int64) (File, error) { file := sqlc.File{ Name: name, Size: size, } bl2hash := blake2b.Sum256(fileBytes) file.Blake2 = bl2hash[:] queries := sqlc.New(pool) fileExists, err := queries.GetFileByBlake2() if err == pgx.ErrNoRows { slog.Info("File already exists", "file-uuid", ) } if err != nil { slog.Error("Could not check if a duplicate exists", "error", err) err = nil } if fileExists { slog.Info("File seems to already exist") sameFile, err := FileByBlake2(file.Blake2) if err != nil { slog.Error("Could not retrieve duplicate", "error", err) err = nil } return sameFile, nil } //Using UUIDs instead of the file hash to make switching storage backends easier fileUUID, err := uuid.NewRandom() if err != nil { slog.Error("could not save file,", "error", err) return file, err } uuid, err := store.SaveFile(fileUUID.String(), fileBytes) if err != nil { return file, err } file.Uuid = uuid file.MimeType, _ = store.GetFileType(file.Uuid) err = file.Insert() if err != nil { return file, nil } return file, nil }