package donat import ( "context" "donat-widget/internal/model" "donat-widget/internal/model/api" "log/slog" ) type ServiceDonat struct { donatRepo model.DonatRepo widgetRepo model.WidgetRepo paymentClient model.PaymentClient } func New( donatRepo model.DonatRepo, widgetRepo model.WidgetRepo, paymentClient model.PaymentClient, ) *ServiceDonat { return &ServiceDonat{ donatRepo: donatRepo, widgetRepo: widgetRepo, paymentClient: paymentClient, } } func (donatService *ServiceDonat) CreateDonat( ctx context.Context, streamerID model.StreamerID, orderID model.OrderID, targetID model.TargetID, amount model.DonatAmount, text string, donatUser string, ) (api.CreatePaymentResponse, error) { widgets, err := donatService.widgetRepo.GetAllWidget(ctx, streamerID) if err != nil { slog.Error(err.Error()) return api.CreatePaymentResponse{}, err } var widgetID model.WidgetID for _, widget := range widgets { if widget.MinAmount <= amount { widgetID = widget.ID } } err = donatService.donatRepo.CreateDonat( ctx, streamerID, widgetID, orderID, targetID, amount, text, donatUser, ) if err != nil { slog.Error(err.Error()) return api.CreatePaymentResponse{}, err } createPaymentResponse, err := donatService.paymentClient.CreatePayment(streamerID, amount, orderID) if err != nil { slog.Error(err.Error()) return api.CreatePaymentResponse{}, err } return createPaymentResponse, nil } func (donatService *ServiceDonat) GetDonatByStreamerID( ctx context.Context, streamerID model.StreamerID, ) ([]*model.Donat, error) { donats, err := donatService.donatRepo.GetDonatByStreamerID(ctx, streamerID) if err != nil { slog.Error(err.Error()) return nil, err } return donats, nil } func (donatService *ServiceDonat) GetDonatByOrderID( ctx context.Context, orderID model.OrderID, ) (*model.Donat, error) { donat, err := donatService.donatRepo.GetDonatByOrderID(ctx, orderID) if err != nil { slog.Error(err.Error()) return nil, err } return donat, nil } func (donatService *ServiceDonat) MarkDonatPaid( ctx context.Context, orderID model.OrderID, ) error { err := donatService.donatRepo.MarkDonatPaid( ctx, orderID, ) if err != nil { slog.Error(err.Error()) return err } return nil } func (donatService *ServiceDonat) MarkDonatView( ctx context.Context, donatID model.DonatID, ) error { err := donatService.donatRepo.MarkDonatView( ctx, donatID, ) if err != nil { slog.Error("donatService.donatRepo.MarkDonatView: " + err.Error()) return err } return nil }