53 lines
2.2 KiB
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)
|
|
}
|