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, ) (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, } 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, err := widgetRepo.db.SelectOne(ctx, sql.GetWidgetByName, args) if err != nil { slog.Error(err.Error()) return false, err } if row == nil { return false, nil } return true, 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 } 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 } 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, ) 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 } 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 { args := pgx.NamedArgs{ "widget_id": widgetID, "streamer_id": accountID, } row, err := widgetRepo.db.SelectOne(ctx, sql.GetWidgetById, args) if err != nil { slog.Error(err.Error()) return err } if row == nil { return errors.New("Widget not exists!") } return nil } // //func (widgetRepo *RepoWidget) GetWidgetByID( // ctx context.Context, // widgetID model.WidgetID, //) ([]*model.GetWidgetDb, 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.GetWidgetDb // 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.GetWidgetDb, 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.GetWidgetDb // 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.GetWidgetDb // err = pgxscan.ScanAll(&widgets, rows) // if err != nil { // slog.Error(err.Error()) // return "", err // } // // if len(widgets) == 0 { // slog.Error("GetWidgetDb does not exist") // return "", errors.New("widget does not exist") // } // // widget := widgets[0] // mediaUrl := widget.GetMediaUrl(mediaType) // // return mediaUrl, nil //}