scanfile/server/internal/database/createFile.go

65 lines
1.5 KiB
Go

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
}