170 lines
3.2 KiB
Go
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
|
|
}
|