Files
sendico/api/edge/bff/internal/server/paymentapiimp/get.go

53 lines
2.2 KiB
Go

package paymentapiimp
import (
"net/http"
"strings"
"github.com/tech/sendico/pkg/api/http/response"
"github.com/tech/sendico/pkg/merrors"
"github.com/tech/sendico/pkg/model"
"github.com/tech/sendico/pkg/mutil/mzap"
orchestrationv2 "github.com/tech/sendico/pkg/proto/payments/orchestration/v2"
"github.com/tech/sendico/server/interface/api/sresponse"
"go.mongodb.org/mongo-driver/v2/bson"
"go.uber.org/zap"
)
func (a *PaymentAPI) getPayment(r *http.Request, account *model.Account, token *sresponse.TokenData) http.HandlerFunc {
paymentRef := strings.TrimSpace(a.pph.GetID(r))
if paymentRef == "" {
return response.BadReference(a.logger, a.Name(), a.pph.Name(), a.pph.GetID(r), merrors.InvalidArgument("payment reference is required"))
}
resp, err := a.execution.GetPayment(r.Context(), &orchestrationv2.GetPaymentRequest{
PaymentRef: paymentRef,
})
if err != nil {
a.logger.Warn("Failed to fetch payment", zap.Error(err), zap.String("payment_ref", paymentRef))
return grpcErrorResponse(a.logger, a.Name(), err)
}
if resp == nil || resp.GetPayment() == nil {
return response.Auto(a.logger, a.Name(), merrors.NoData("payment not found"))
}
orgRefRaw := strings.TrimSpace(resp.GetOrganizationRef())
orgRef, err := bson.ObjectIDFromHex(orgRefRaw)
if err != nil {
a.logger.Warn("Payment lookup returned invalid organization reference", zap.Error(err), zap.String("organization_ref", orgRefRaw), zap.String("payment_ref", paymentRef))
return response.Internal(a.logger, a.Name(), merrors.DataConflict("payment lookup returned invalid organization reference"))
}
allowed, err := a.enf.Enforce(r.Context(), a.permissionRef, account.ID, orgRef, bson.NilObjectID, model.ActionRead)
if err != nil {
a.logger.Warn("Failed to check payment access permissions", zap.Error(err), mzap.ObjRef("organization_ref", orgRef), zap.String("payment_ref", paymentRef))
return response.Auto(a.logger, a.Name(), err)
}
if !allowed {
a.logger.Debug("Payment access denied, hiding existence", mzap.ObjRef("organization_ref", orgRef), zap.String("payment_ref", paymentRef))
return response.NotFound(a.logger, a.Name(), "payment not found")
}
return sresponse.PaymentResponse(a.logger, resp.GetPayment(), token)
}