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 }