treasurer/internal/service/callback/callback.go

121 lines
3.2 KiB
Go
Raw Normal View History

2023-06-13 13:22:51 +00:00
package callback
import (
"context"
2025-06-12 08:59:43 +00:00
"gitea.pena/PenaSide/treasurer/internal/client"
"gitea.pena/PenaSide/treasurer/internal/repository"
2023-06-13 13:22:51 +00:00
"sync"
2024-12-16 13:47:40 +00:00
"gitea.pena/PenaSide/treasurer/internal/errors"
"gitea.pena/PenaSide/treasurer/internal/models"
2025-06-12 08:59:43 +00:00
"go.uber.org/zap"
2023-06-13 13:22:51 +00:00
)
type Deps struct {
Logger *zap.Logger
2025-06-12 08:59:43 +00:00
CallbackClient *client.CallbackClient
PaymentRepository *repository.PaymentRepository
2023-06-13 13:22:51 +00:00
}
type Service struct {
logger *zap.Logger
2025-06-12 08:59:43 +00:00
callbackClient *client.CallbackClient
paymentRepository *repository.PaymentRepository
2023-06-13 13:22:51 +00:00
}
func New(deps Deps) (*Service, errors.Error) {
if deps.Logger == nil {
return nil, errors.NewWithMessage("logger is nil on <NewCallbackService>", errors.ErrInvalidArgs)
}
if deps.CallbackClient == nil {
return nil, errors.NewWithMessage("CallbackClient is nil on <NewCallbackService>", errors.ErrInvalidArgs)
}
if deps.PaymentRepository == nil {
return nil, errors.NewWithMessage("PaymentRepository is nil on <NewCallbackService>", errors.ErrInvalidArgs)
}
return &Service{
logger: deps.Logger,
callbackClient: deps.CallbackClient,
paymentRepository: deps.PaymentRepository,
}, nil
}
2025-06-11 15:39:39 +00:00
func (s *Service) OnSuccess(ctx context.Context, event *models.Event) errors.Error {
2023-06-13 13:22:51 +00:00
waitGroup := sync.WaitGroup{}
mutex := sync.Mutex{}
executeErrors := make([]error, 0)
for _, callbackURL := range event.Payment.CallbackHostGRPC {
waitGroup.Add(1)
go func(url string) {
defer waitGroup.Done()
2025-06-11 15:39:39 +00:00
if err := s.callbackClient.SendOnSuccess(ctx, url, event); err != nil {
s.logger.Error("failid to send callback on <OnSuccess> of <CallbackService>")
2023-06-13 13:22:51 +00:00
mutex.Lock()
executeErrors = append(executeErrors, err)
mutex.Unlock()
return
}
2025-06-11 15:39:39 +00:00
if _, err := s.paymentRepository.SetPaymentComplete(ctx, event.Payment.PaymentID); err != nil {
s.logger.Error("failid to set payment complete on <OnSuccess> of <CallbackService>")
2023-06-13 13:22:51 +00:00
mutex.Lock()
executeErrors = append(executeErrors, err)
mutex.Unlock()
return
}
}(callbackURL)
}
waitGroup.Wait()
if len(executeErrors) >= len(event.Payment.CallbackHostGRPC) {
2025-06-11 15:39:39 +00:00
s.logger.Error("failid to success payment on <OnSuccess> of <CallbackService>", zap.Errors("errors", executeErrors))
2023-06-13 13:22:51 +00:00
return errors.NewWithMessage("failed to success payment: all operations failed", errors.ErrInternalError)
}
return nil
}
2025-06-11 15:39:39 +00:00
func (s *Service) OnFailure(ctx context.Context, event *models.Event) errors.Error {
2023-06-13 13:22:51 +00:00
waitGroup := sync.WaitGroup{}
mutex := sync.Mutex{}
executeErrors := make([]error, 0)
for _, callbackURL := range event.Payment.CallbackHostGRPC {
waitGroup.Add(1)
go func(url string) {
defer waitGroup.Done()
2025-06-11 15:39:39 +00:00
if err := s.callbackClient.SendOnFailure(ctx, url, event); err != nil {
s.logger.Error("failid to send callback on <OnFailure> of <CallbackService>")
2023-06-13 13:22:51 +00:00
mutex.Lock()
executeErrors = append(executeErrors, err)
mutex.Unlock()
return
}
}(callbackURL)
}
waitGroup.Wait()
if len(executeErrors) >= len(event.Payment.CallbackHostGRPC) {
2025-06-11 15:39:39 +00:00
s.logger.Error("failid to success payment on <OnFailure> of <CallbackService>", zap.Errors("errors", executeErrors))
2023-06-13 13:22:51 +00:00
return errors.NewWithMessage("failed to success payment: all operations failed", errors.ErrInternalError)
}
return nil
}