package widget import ( "context" "donat-widget/internal/model" "donat-widget/internal/model/sql" "errors" "github.com/georgysavva/scany/v2/pgxscan" "github.com/jackc/pgx/v5" "log/slog" ) func New( db model.Db, storage model.Storage, ) *RepoWidget { return &RepoWidget{ db: db, storage: storage, } } type RepoWidget struct { db model.Db storage model.Storage } func (widgetRepo *RepoWidget) CreateWidget( ctx context.Context, streamerID model.StreamerID, templateID model.TemplateID, duration model.Duration, minAmount model.DonatAmount, ) (model.WidgetID, error) { args := pgx.NamedArgs{ "streamer_id": streamerID, "template_id": templateID, "duration": duration, "min_amount": minAmount, } widgetID, err := widgetRepo.db.Insert(ctx, sql.CreateWidget, args) if err != nil { slog.Error(err.Error()) return 0, err } return model.WidgetID(widgetID), nil } func (widgetRepo *RepoWidget) GetWidgetByStreamerID( ctx context.Context, streamerID model.StreamerID, ) ([]*model.Widget, error) { args := pgx.NamedArgs{"streamer_id": streamerID} rows, err := widgetRepo.db.Select(ctx, sql.GetWidgetByStreamerID, args) if err != nil { slog.Error(err.Error()) return nil, err } var widgets []*model.Widget err = pgxscan.ScanAll(&widgets, rows) if err != nil { slog.Error(err.Error()) return nil, err } return widgets, nil } func (widgetRepo *RepoWidget) GetWidgetByID( ctx context.Context, widgetID model.WidgetID, ) ([]*model.Widget, error) { args := pgx.NamedArgs{"id": widgetID} rows, err := widgetRepo.db.Select(ctx, sql.GetWidgetByID, args) if err != nil { slog.Error(err.Error()) return nil, err } var widgets []*model.Widget err = pgxscan.ScanAll(&widgets, rows) if err != nil { slog.Error(err.Error()) return nil, err } return widgets, nil } func (widgetRepo *RepoWidget) GetAllWidget( ctx context.Context, streamerID model.StreamerID, ) ([]*model.Widget, error) { args := pgx.NamedArgs{ "streamer_id": streamerID, } rows, err := widgetRepo.db.Select(ctx, sql.GetAllWidget, args) if err != nil { slog.Error(err.Error()) return nil, err } var widgets []*model.Widget err = pgxscan.ScanAll(&widgets, rows) if err != nil { slog.Error(err.Error()) return nil, err } return widgets, nil } func (widgetRepo *RepoWidget) SetMediaFile( file model.UploadFile, filename string, size int64, collection string, ) (model.FileID, error) { fileID, err := widgetRepo.storage.Upload(file, filename, size, collection) if err != nil { slog.Error(err.Error()) return "", err } return fileID, nil } func (widgetRepo *RepoWidget) GetMediaFile( fileID model.FileID, ) (model.DownloadFile, error) { file, err := widgetRepo.storage.Download(fileID) if err != nil { slog.Error(err.Error()) return nil, err } return file, err } func (widgetRepo *RepoWidget) UpdateMediaFile( ctx context.Context, widgetID model.WidgetID, file model.UploadFile, fileID model.FileID, filename string, size int64, collection string, mediaType model.MediaType, ) error { err := widgetRepo.storage.Update(file, fileID, filename, size, collection) if err != nil { slog.Error(err.Error()) return err } mediaType = mediaType + "_url" args := pgx.NamedArgs{ string(mediaType): model.MediaUrl(fileID), "id": widgetID, } err = widgetRepo.db.Update(ctx, sql.UpdateMediaUrl(mediaType), args) if err != nil { slog.Error(err.Error()) return err } return nil } func (widgetRepo *RepoWidget) SetMediaUrl( ctx context.Context, widgetID model.WidgetID, mediaUrl model.MediaUrl, mediaType model.MediaType, ) error { mediaType = mediaType + "_url" args := pgx.NamedArgs{ string(mediaType): mediaUrl, "id": widgetID, } err := widgetRepo.db.Update(ctx, sql.UpdateMediaUrl(mediaType), args) if err != nil { slog.Error(err.Error()) return err } return nil } func (widgetRepo *RepoWidget) GetMediaUrl( ctx context.Context, widgetID model.WidgetID, mediaType model.MediaType, ) (model.MediaUrl, error) { mediaType = mediaType + "_url" args := pgx.NamedArgs{ "id": widgetID, } rows, err := widgetRepo.db.Select(ctx, sql.GetMediaUrl(mediaType), args) if err != nil { slog.Error(err.Error()) return "", err } var widgets []*model.Widget err = pgxscan.ScanAll(&widgets, rows) if err != nil { slog.Error(err.Error()) return "", err } if len(widgets) == 0 { slog.Error("Widget does not exist") return "", errors.New("widget does not exist") } widget := widgets[0] mediaUrl := widget.GetMediaUrl(mediaType) return mediaUrl, nil }