87 lines
1.6 KiB
Go
87 lines
1.6 KiB
Go
package file
|
|
|
|
import (
|
|
"context"
|
|
"donat-widget/internal/model"
|
|
"donat-widget/internal/model/sql"
|
|
"fmt"
|
|
"github.com/georgysavva/scany/v2/pgxscan"
|
|
"github.com/google/uuid"
|
|
"github.com/jackc/pgx/v5"
|
|
"mime/multipart"
|
|
)
|
|
|
|
func New(
|
|
db model.Db,
|
|
storage model.Storage,
|
|
) *RepoFile {
|
|
return &RepoFile{
|
|
db: db,
|
|
storage: storage,
|
|
}
|
|
}
|
|
|
|
type RepoFile struct {
|
|
db model.Db
|
|
storage model.Storage
|
|
}
|
|
|
|
func (fileRepo *RepoFile) AddNew(
|
|
ctx context.Context,
|
|
streamerID int,
|
|
file multipart.FileHeader,
|
|
extension, fileType string,
|
|
) (string, error) {
|
|
fileName, err := fileRepo.storage.Upload(&file, streamerID)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
args := pgx.NamedArgs{
|
|
"streamer_id": streamerID,
|
|
"file_name": fileName,
|
|
"file_type": fileType,
|
|
"extension": extension,
|
|
}
|
|
|
|
fileIDRaw, err := fileRepo.db.Insert(ctx, sql.AddNewFile, args)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
fileIDBytes, ok := fileIDRaw.([16]uint8)
|
|
if !ok {
|
|
return "", fmt.Errorf("unexpected fileID type: %T", fileIDRaw)
|
|
}
|
|
fileID := uuid.UUID(fileIDBytes).String()
|
|
|
|
return fileID, nil
|
|
}
|
|
|
|
func (fileRepo *RepoFile) CheckFileExists(
|
|
ctx context.Context,
|
|
streamerID int,
|
|
fileName, extension, fileType string,
|
|
) (bool, error) {
|
|
args := pgx.NamedArgs{
|
|
"streamer_id": streamerID,
|
|
"file_name": fileName,
|
|
"file_type": fileType,
|
|
"extension": extension,
|
|
}
|
|
|
|
rows, err := fileRepo.db.Select(ctx, sql.GetFileExists, args)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
var fileId [][16]uint8
|
|
err = pgxscan.ScanOne(fileId, rows)
|
|
if err != nil {
|
|
return false, nil
|
|
}
|
|
|
|
return true, nil
|
|
|
|
}
|