2024-09-10 22:37:01 +05:00

170 lines
3.2 KiB
Go

package media
import (
"context"
"donat-widget/internal/model"
"errors"
"fmt"
"github.com/georgysavva/scany/v2/pgxscan"
"github.com/jackc/pgx/v5"
"log/slog"
)
func New(
db model.Db,
storage model.Storage,
) *RepoMedia {
return &RepoMedia{db, storage}
}
type RepoMedia struct {
db model.Db
storage model.Storage
}
func (repoMedia *RepoMedia) SetMediaFile(
file model.UploadFile,
filename string,
size int64,
collection string,
) (model.FileID, error) {
fileData, err := repoMedia.storage.Upload(
file,
filename,
size,
collection,
)
if err != nil {
slog.Error("repoMedia.storage.Upload: " + err.Error())
return "", err
}
fileID := fileData.FileID
return model.FileID(fileID), nil
}
func (repoMedia *RepoMedia) GetMediaFile(
fileID model.FileID,
) (model.DownloadFile, error) {
file, err := repoMedia.storage.Download(fileID)
if err != nil {
slog.Error("repoMedia.storage.Download: " + err.Error())
return nil, err
}
return file, err
}
func (repoMedia *RepoMedia) UpdateMediaFile(
ctx context.Context,
widgetID model.WidgetID,
file model.UploadFile,
fileID model.FileID,
filename string,
size int64,
collection string,
mediaType model.MediaType,
) error {
err := repoMedia.storage.Update(
file,
fileID,
filename,
size,
collection,
)
if err != nil {
slog.Error("repoMedia.storage.Update: " + err.Error())
return err
}
mediaType = mediaType + "_url"
query := fmt.Sprintf(`
UPDATE widgets
SET %s = (@%s)
WHERE id = (@id)
`, mediaType, mediaType)
args := pgx.NamedArgs{
string(mediaType): model.MediaUrl(fileID),
"id": widgetID,
}
_, err = repoMedia.db.Query(ctx, query, args)
if err != nil {
slog.Error("repoMedia.db.Query: " + err.Error())
return err
}
return nil
}
func (repoMedia *RepoMedia) SetMediaUrl(
ctx context.Context,
widgetID model.WidgetID,
mediaUrl model.MediaUrl,
mediaType model.MediaType,
) error {
mediaType = mediaType + "_url"
query := fmt.Sprintf(`
UPDATE widgets
SET %s = (@%s)
WHERE id = (@id)
`, mediaType, mediaType)
args := pgx.NamedArgs{
string(mediaType): mediaUrl,
"id": widgetID,
}
_, err := repoMedia.db.Query(ctx, query, args)
if err != nil {
slog.Error("repoMedia.db.Query: " + err.Error())
return err
}
return nil
}
func (repoMedia *RepoMedia) GetMediaUrl(
ctx context.Context,
widgetID model.WidgetID,
mediaType model.MediaType,
) (model.MediaUrl, error) {
mediaType = mediaType + "_url"
query := fmt.Sprintf(`
SELECT %s
FROM widgets
WHERE id = (@id)
`, mediaType)
args := pgx.NamedArgs{
"id": widgetID,
}
var widgets []*model.Widget
rows, err := repoMedia.db.Query(ctx, query, args)
if err != nil {
slog.Error("repoMedia.db.Query: " + err.Error())
return "", err
}
err = pgxscan.ScanAll(&widgets, rows)
if err != nil {
slog.Error("repoMedia.pgxscan.ScanAll: " + err.Error())
return "", err
}
if len(widgets) == 0 {
slog.Error("Widget does not exist")
return "", errors.New("widget does not exist")
}
widget := widgets[0]
var mediaUrl model.MediaUrl
if mediaType == "background_url" {
mediaUrl = widget.BackgroundUrl
} else if mediaType == "image_url" {
mediaUrl = widget.ImageUrl
} else if mediaType == "audio_url" {
mediaUrl = widget.AudioUrl
}
return mediaUrl, nil
}