276 lines
5.4 KiB
Go

package widget
import (
"context"
"donat-widget/internal/model"
"donat-widget/internal/model/sql"
"errors"
"github.com/georgysavva/scany/v2/pgxscan"
"github.com/google/uuid"
"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 int,
templateID int,
duration int,
minAmount int,
maxAmount int,
image string,
audio string,
name string,
isActive bool,
volumePercent int,
) (model.WidgetID, error) {
args := pgx.NamedArgs{
"streamer_id": streamerID,
"template_id": templateID,
"duration": duration,
"min_amount": minAmount,
"max_amount": maxAmount,
"image": image,
"audio": audio,
"name": name,
"is_active": isActive,
"volume_percent": volumePercent,
}
widgetID, err := widgetRepo.db.Insert(ctx, sql.CreateWidget, args)
if err != nil {
slog.Error(err.Error())
return 0, err
}
return model.WidgetID(widgetID.(int32)), nil
}
func (widgetRepo *RepoWidget) CheckWidgetName(
ctx context.Context,
streamerID int,
name string,
) (bool, error) {
args := pgx.NamedArgs{
"streamer_id": streamerID,
"name": name,
}
row := widgetRepo.db.SelectOne(ctx, sql.GetWidgetByName, args)
var widgetId int
err := row.Scan(&widgetId)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return false, nil
}
slog.Error("failed to check widget name", "error", err.Error())
return false, err
}
return false, nil
}
func (widgetRepo *RepoWidget) GetWidgetsByStreamerID(
ctx context.Context,
streamerID int,
) ([]*model.GetWidgetDb, error) {
args := pgx.NamedArgs{"streamer_id": streamerID}
rows, err := widgetRepo.db.Select(ctx, sql.GetWidgetsByStreamerID, args)
if err != nil {
slog.Error(err.Error())
return nil, err
}
defer rows.Close()
var widgets []*model.GetWidgetDb
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 int,
) (model.GetWidgetDb, error) {
args := pgx.NamedArgs{"widget_id": widgetID}
rows, err := widgetRepo.db.Select(ctx, sql.GetWidgetByID, args)
if err != nil {
slog.Error(err.Error())
return model.GetWidgetDb{}, err
}
defer rows.Close()
var widgets []model.GetWidgetDb
err = pgxscan.ScanAll(&widgets, rows)
if err != nil {
slog.Error(err.Error())
return model.GetWidgetDb{}, err
}
if widgets[0].ID == 0 {
return model.GetWidgetDb{}, errors.New("widget not found")
}
return widgets[0], nil
}
func (widgetRepo *RepoWidget) UpdateWidget(
ctx context.Context,
widgetID int,
duration *int,
minAmount *int,
maxAmount *int,
isActive *bool,
image *uuid.UUID,
audio *uuid.UUID,
name *string,
volumePercent *int,
) error {
args := pgx.NamedArgs{
"id": widgetID,
}
if duration != nil {
args["duration"] = *duration
}
if minAmount != nil {
args["min_amount"] = *minAmount
}
if maxAmount != nil {
args["max_amount"] = *maxAmount
}
if image != nil {
args["image"] = *image
}
if audio != nil {
args["audio"] = *audio
}
if name != nil {
args["name"] = *name
}
if isActive != nil {
args["is_active"] = *isActive
}
if volumePercent != nil {
args["volume_percent"] = *volumePercent
}
err := widgetRepo.db.Update(ctx, sql.UpdateWidget, args)
if err != nil {
slog.Error(err.Error())
return err
}
return nil
}
func (widgetRepo *RepoWidget) CheckExistsWidget(
ctx context.Context,
widgetID int,
accountID int,
) error {
println("account", accountID, "widget", widgetID)
args := pgx.NamedArgs{
"widget_id": widgetID,
"streamer_id": accountID,
}
row := widgetRepo.db.SelectOne(ctx, sql.GetWidgetID, args)
var widgetId int
err := row.Scan(&widgetId)
if err != nil {
slog.Error(err.Error())
return err
}
return nil
}
func (widgetRepo *RepoWidget) DeleteWidget(
ctx context.Context,
widgetID int,
accountID int,
) error {
args := pgx.NamedArgs{
"widget_id": widgetID,
"streamer_id": accountID,
}
err := widgetRepo.db.Exec(ctx, sql.DeleteWidget, args)
if err != nil {
slog.Error(err.Error())
return err
}
return nil
}
func (widgetRepo *RepoWidget) CreateStreamerWidgetPage(
ctx context.Context,
streamerID int,
) error {
args := pgx.NamedArgs{
"streamer_id": streamerID,
}
err := widgetRepo.db.Exec(ctx, sql.CreateStreamerWidgetPage, args)
if err != nil {
slog.Error(err.Error())
return err
}
return nil
}
func (widgetRepo *RepoWidget) GetStreamerWidgetPageId(
ctx context.Context,
streamerID int,
) (uuid.UUID, error) {
args := pgx.NamedArgs{
"streamer_id": streamerID,
}
row := widgetRepo.db.SelectOne(ctx, sql.GetStreamerWidgetPage, args)
var streamerWidgetPageId uuid.UUID
err := row.Scan(&streamerWidgetPageId)
if err != nil {
slog.Error(err.Error())
return uuid.UUID{}, err
}
return streamerWidgetPageId, nil
}
func (widgetRepo *RepoWidget) GetStreamerIdByWidgetPageId(
ctx context.Context,
widgetPageId uuid.UUID,
) (int, error) {
args := pgx.NamedArgs{
"widget_page_id": widgetPageId,
}
row := widgetRepo.db.SelectOne(ctx, sql.GetStreamerIdByWidgetPageId, args)
var streamerID int
err := row.Scan(&streamerID)
if err != nil {
slog.Error(err.Error())
return 0, err
}
return streamerID, nil
}