108 lines
2.9 KiB
Go
108 lines
2.9 KiB
Go
package turso
|
|
|
|
import (
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
"trankilou.fr/lassistanoque/backend/internal/adapter/database/dberrors"
|
|
"trankilou.fr/lassistanoque/backend/internal/domain"
|
|
"trankilou.fr/lassistanoque/backend/internal/utility"
|
|
)
|
|
|
|
type TursoFileRepository struct {
|
|
DB *sqlx.DB
|
|
}
|
|
|
|
func (fr *TursoFileRepository) FindByID(id string) (*domain.File, error) {
|
|
var file domain.File
|
|
err := fr.DB.Get(&file, "select id, name, content_type, storage_path, storage_filename, date_created, date_updated, _version from files where id=$1", id)
|
|
return &file, err
|
|
}
|
|
|
|
func (fr *TursoFileRepository) Create(file *domain.File) (*domain.File, error) {
|
|
file.ID = utility.GenID()
|
|
file.VersionId = utility.GenID()
|
|
file.DateCreated = time.Now()
|
|
file.DateUpdated = time.Now()
|
|
_, err := fr.DB.NamedExec(
|
|
`insert into files (id, name, content_type, storage_path, storage_filename, date_created, date_updated, _version)
|
|
values (:id, :name, :content_type, :storage_path, :storage_filename, :date_created, :date_updated, :_version)`,
|
|
file)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return file, nil
|
|
}
|
|
|
|
func (fr *TursoFileRepository) Update(file *domain.File) (*domain.File, error) {
|
|
newVersion := utility.GenID()
|
|
file.DateUpdated = time.Now()
|
|
res, err := fr.DB.Exec(
|
|
`update files
|
|
set name=$1,
|
|
content_type=$2,
|
|
storage_path=$3,
|
|
storage_filename=$4,
|
|
date_updated=$5,
|
|
_version=$6
|
|
where id=$7 and _version=$8`,
|
|
file.Name, file.ContentType, file.StoragePath, file.StorageFilename, file.DateUpdated,
|
|
newVersion, file.ID, file.VersionId,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if count, _ := res.RowsAffected(); count == 0 {
|
|
return nil, dberrors.ErrNoRowUpdated
|
|
}
|
|
|
|
file.VersionId = newVersion
|
|
|
|
return file, nil
|
|
}
|
|
|
|
func (fr *TursoFileRepository) Delete(id string) error {
|
|
res, err := fr.DB.Exec("delete from files where id=$1", id)
|
|
if count, _ := res.RowsAffected(); count == 0 {
|
|
return dberrors.ErrNoRowUpdated
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (fr *TursoFileRepository) Upload(reader io.Reader, path string, name string, contentType string, replace bool) (*domain.File, error) {
|
|
|
|
bytes, err := io.ReadAll(reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
file := &domain.File{
|
|
ID: utility.GenID(),
|
|
Name: name,
|
|
StoragePath: path,
|
|
StorageFilename: name,
|
|
ContentType: contentType,
|
|
VersionId: utility.GenID(),
|
|
DateCreated: time.Now(),
|
|
DateUpdated: time.Now(),
|
|
Content: bytes,
|
|
}
|
|
|
|
_, err = fr.DB.NamedExec(
|
|
`insert into files (id, name, content_type, storage_path, storage_filename, date_created, date_updated, _version, content)
|
|
values (:id, :name, :content_type, :storage_path, :storage_filename, :date_created, :date_updated, :_version, :content)`,
|
|
file)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return file, nil
|
|
}
|
|
|
|
func (fr *TursoFileRepository) Download(id string) (*domain.File, error) {
|
|
var file domain.File
|
|
err := fr.DB.Get(&file, "select * from files where id=$1", id)
|
|
return &file, err
|
|
}
|