package database import ( "encoding/hex" "log/slog" "github.com/google/uuid" "golang.org/x/crypto/blake2b" "git.jmbit.de/jmb/scanfile/server/internal/store" ) // CreateFile() creates the filesystem object and the DB entry for a file func CreateFile(name string, fileBytes []byte, size int64) (File, error) { file := File{ Name: name, Size: size, } bl2hash := blake2b.Sum256(fileBytes) file.Blake2 = hex.EncodeToString(bl2hash[:]) fileExists, err := FileAlreadyExists(file.Blake2) 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 }