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 }