2025-02-28 10:05:23 +05:00

162 lines
3.1 KiB
Go

package donat
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) *RepoDonat {
return &RepoDonat{
db: db,
}
}
type RepoDonat struct {
db model.Db
}
func (repoDonat *RepoDonat) CreateDonat(
ctx context.Context,
streamerID model.StreamerID,
widgetID model.WidgetID,
orderID model.OrderID,
targetID model.TargetID,
amount model.DonatAmount,
text string,
donatUser string,
) error {
args := pgx.NamedArgs{
"streamer_id": streamerID,
"widget_id": widgetID,
"order_id": orderID,
"target_id": targetID,
"text": text,
"amount": amount,
"donat_user": donatUser,
}
_, err := repoDonat.db.Insert(ctx, sql.CreateDonat, args)
if err != nil {
slog.Error(err.Error())
return err
}
return nil
}
func (repoDonat *RepoDonat) GetDonatByStreamerID(
ctx context.Context,
streamerID model.StreamerID,
) ([]*model.Donat, error) {
args := pgx.NamedArgs{
"streamer_id": streamerID,
"paid": true,
"view": false,
}
rows, err := repoDonat.db.Select(ctx, sql.GetDonatByStreamerID, args)
if err != nil {
slog.Error(err.Error())
return nil, err
}
var donats []*model.Donat
err = pgxscan.ScanAll(&donats, rows)
if err != nil {
slog.Error(err.Error())
return nil, err
}
return donats, nil
}
func (repoDonat *RepoDonat) GetDonatByOrderID(
ctx context.Context,
orderID model.OrderID,
) (*model.Donat, error) {
args := pgx.NamedArgs{
"order_id": orderID,
}
rows, err := repoDonat.db.Select(ctx, sql.GetDonatByOrderID, args)
if err != nil {
slog.Error(err.Error())
return nil, err
}
var donats []*model.Donat
err = pgxscan.ScanAll(&donats, rows)
if err != nil {
slog.Error(err.Error())
return nil, err
}
if len(donats) == 0 {
return nil, errors.New("donat not found")
}
return donats[0], nil
}
func (repoDonat *RepoDonat) MarkDonatView(
ctx context.Context,
donatID model.DonatID,
) error {
args := pgx.NamedArgs{
"id": donatID,
"view": true,
}
err := repoDonat.db.Update(ctx, sql.MarkDonatView, args)
if err != nil {
slog.Error(err.Error())
return err
}
return nil
}
func (repoDonat *RepoDonat) MarkDonatPaid(
ctx context.Context,
orderID model.OrderID,
) error {
args := pgx.NamedArgs{
"order_id": orderID,
"paid": true,
}
err := repoDonat.db.Update(ctx, sql.MarkDonatPaid, args)
if err != nil {
slog.Error(err.Error())
return err
}
return nil
}
func (repoDonat *RepoDonat) GetDonatPage(
ctx context.Context,
streamerID model.StreamerID,
) (model.DonatePage, error) {
args := pgx.NamedArgs{
"streamer_id": streamerID,
}
rows, err := repoDonat.db.Select(ctx, sql.GetDonationPage, args)
if err != nil {
slog.Error(err.Error())
return model.DonatePage{}, err
}
var donatePage []*model.DonatePage
err = pgxscan.ScanAll(&donatePage, rows)
if err != nil {
slog.Error(err.Error())
return model.DonatePage{}, err
}
if len(donatePage) == 0 {
return model.DonatePage{}, errors.New("donat not found")
}
return *donatePage[0], nil
}