56 lines
1.7 KiB
Go
56 lines
1.7 KiB
Go
package service
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"errors"
|
||
|
|
|
||
|
|
"github.com/google/uuid"
|
||
|
|
|
||
|
|
"apskel-pos-be/internal/appcontext"
|
||
|
|
"apskel-pos-be/internal/constants"
|
||
|
|
"apskel-pos-be/internal/contract"
|
||
|
|
"apskel-pos-be/internal/processor"
|
||
|
|
"apskel-pos-be/internal/repository"
|
||
|
|
)
|
||
|
|
|
||
|
|
// PointPaymentService serves what the cashier needs before taking EnakPoint
|
||
|
|
// (docs/prd-point-coin.md F9).
|
||
|
|
type PointPaymentService interface {
|
||
|
|
Preview(ctx context.Context, apctx *appcontext.ContextInfo, orderID uuid.UUID) *contract.Response
|
||
|
|
}
|
||
|
|
|
||
|
|
type PointPaymentServiceImpl struct {
|
||
|
|
payments *processor.PointPaymentProcessor
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewPointPaymentService(payments *processor.PointPaymentProcessor) *PointPaymentServiceImpl {
|
||
|
|
return &PointPaymentServiceImpl{payments: payments}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *PointPaymentServiceImpl) Preview(ctx context.Context, apctx *appcontext.ContextInfo, orderID uuid.UUID) *contract.Response {
|
||
|
|
preview, err := s.payments.Preview(ctx, apctx.OrganizationID, orderID)
|
||
|
|
if err != nil {
|
||
|
|
return PointPaymentErrorResponse(err)
|
||
|
|
}
|
||
|
|
return contract.BuildSuccessResponse(preview)
|
||
|
|
}
|
||
|
|
|
||
|
|
// PointPaymentErrorResponse answers a refused EnakPoint payment as a bad request, PIN
|
||
|
|
// problems with their own codes, and anything else as a server error.
|
||
|
|
func PointPaymentErrorResponse(err error) *contract.Response {
|
||
|
|
var pinErr *processor.PinError
|
||
|
|
if errors.As(err, &pinErr) {
|
||
|
|
return PinErrorResponse(err)
|
||
|
|
}
|
||
|
|
code := constants.InternalServerErrorCode
|
||
|
|
switch {
|
||
|
|
case errors.Is(err, repository.ErrPointPaymentOrderNotFound):
|
||
|
|
code = constants.NotFoundErrorCode
|
||
|
|
case errors.Is(err, processor.ErrPointPaymentRejected):
|
||
|
|
code = constants.ValidationErrorCode
|
||
|
|
}
|
||
|
|
return contract.BuildErrorResponse([]*contract.ResponseError{
|
||
|
|
contract.NewResponseError(code, constants.WalletServiceEntity, err.Error()),
|
||
|
|
})
|
||
|
|
}
|