59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
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
|
|
}
|