90 lines
1.7 KiB
Go

package file
import (
"context"
"donat-widget/internal/model"
"donat-widget/internal/model/sql"
"fmt"
"github.com/google/uuid"
"github.com/jackc/pgx/v5"
"mime/multipart"
"strconv"
)
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) GetByID(
ctx context.Context,
fileID string,
) ([]byte, string, error) {
args := pgx.NamedArgs{
"id": fileID,
}
row, err := fileRepo.db.SelectOne(ctx, sql.FileById, args)
if err != nil {
return nil, "", fmt.Errorf("error retrieving file info: %v", err)
}
if row == nil {
return nil, "", fmt.Errorf("file %s not found", fileID)
}
var fileName string
var streamerID int
var fileType string
err = row.Scan(&fileName, &streamerID, &fileType)
fileContent, err := fileRepo.storage.Download(fileName, strconv.Itoa(streamerID))
if err != nil {
return nil, "", fmt.Errorf("error downloading file: %v", err)
}
return fileContent, fileType, nil
}