001// --------------------------------------------------------------------------------
002// Copyright 2002-2026 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.model.control.payment.server.graphql;
018
019import com.echothree.model.control.graphql.server.graphql.BaseEntityInstanceObject;
020import com.echothree.model.control.graphql.server.graphql.count.Connections;
021import com.echothree.model.control.graphql.server.graphql.count.CountedObjects;
022import com.echothree.model.control.graphql.server.graphql.count.CountingDataConnectionFetcher;
023import com.echothree.model.control.graphql.server.graphql.count.CountingPaginatedData;
024import com.echothree.model.control.graphql.server.util.count.ObjectLimiter;
025import com.echothree.model.control.payment.server.control.PaymentProcessorTransactionCodeControl;
026import com.echothree.model.data.payment.common.PaymentProcessorTransactionCodeConstants;
027import com.echothree.model.data.payment.server.entity.PaymentProcessorTransaction;
028import com.echothree.model.data.payment.server.entity.PaymentProcessorTransactionDetail;
029import com.echothree.util.server.persistence.Session;
030import graphql.annotations.annotationTypes.GraphQLDescription;
031import graphql.annotations.annotationTypes.GraphQLField;
032import graphql.annotations.annotationTypes.GraphQLName;
033import graphql.annotations.annotationTypes.GraphQLNonNull;
034import graphql.annotations.connection.GraphQLConnection;
035import graphql.schema.DataFetchingEnvironment;
036import java.util.ArrayList;
037import java.util.stream.Collectors;
038
039@GraphQLDescription("payment processor transaction object")
040@GraphQLName("PaymentProcessorTransaction")
041public class PaymentProcessorTransactionObject
042        extends BaseEntityInstanceObject {
043    
044    private final PaymentProcessorTransaction paymentProcessorTransaction; // Always Present
045    
046    public PaymentProcessorTransactionObject(PaymentProcessorTransaction paymentProcessorTransaction) {
047        super(paymentProcessorTransaction.getPrimaryKey());
048        
049        this.paymentProcessorTransaction = paymentProcessorTransaction;
050    }
051
052    private PaymentProcessorTransactionDetail paymentProcessorTransactionDetail; // Optional, use getPaymentProcessorTransactionDetail()
053    
054    private PaymentProcessorTransactionDetail getPaymentProcessorTransactionDetail() {
055        if(paymentProcessorTransactionDetail == null) {
056            paymentProcessorTransactionDetail = paymentProcessorTransaction.getLastDetail();
057        }
058        
059        return paymentProcessorTransactionDetail;
060    }
061
062    @GraphQLField
063    @GraphQLDescription("payment processor transaction name")
064    @GraphQLNonNull
065    public String getPaymentProcessorTransactionName() {
066        return getPaymentProcessorTransactionDetail().getPaymentProcessorTransactionName();
067    }
068    
069    @GraphQLField
070    @GraphQLDescription("payment processor")
071    public PaymentProcessorObject getPaymentProcessor(final DataFetchingEnvironment env) {
072        return PaymentSecurityUtils.getHasPaymentProcessorAccess(env) ? new PaymentProcessorObject(getPaymentProcessorTransactionDetail().getPaymentProcessor()) : null;
073    }
074
075    @GraphQLField
076    @GraphQLDescription("payment processor action type")
077    public PaymentProcessorActionTypeObject getPaymentProcessorActionType(final DataFetchingEnvironment env) {
078        return PaymentSecurityUtils.getHasPaymentProcessorActionTypeAccess(env) ? new PaymentProcessorActionTypeObject(getPaymentProcessorTransactionDetail().getPaymentProcessorActionType()) : null;
079    }
080
081    @GraphQLField
082    @GraphQLDescription("payment processor result code")
083    public PaymentProcessorResultCodeObject getPaymentProcessorResultCode(final DataFetchingEnvironment env) {
084        return PaymentSecurityUtils.getHasPaymentProcessorResultCodeAccess(env) ? new PaymentProcessorResultCodeObject(getPaymentProcessorTransactionDetail().getPaymentProcessorResultCode()) : null;
085    }
086
087    @GraphQLField
088    @GraphQLDescription("payment processor transaction codes")
089    @GraphQLNonNull
090    @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class)
091    public CountingPaginatedData<PaymentProcessorTransactionCodeObject> getPaymentProcessorTransactionCodes(final DataFetchingEnvironment env) {
092        if(PaymentSecurityUtils.getHasPaymentProcessorTransactionCodesAccess(env)) {
093            var paymentProcessorTransactionCodeControl = Session.getModelController(PaymentProcessorTransactionCodeControl.class);
094            var paymentProcessorTransaction = getPaymentProcessorTransactionDetail().getPaymentProcessorTransaction();
095            var totalCount = paymentProcessorTransactionCodeControl.countPaymentProcessorTransactionCodesByPaymentProcessorTransaction(paymentProcessorTransaction);
096
097            try(var objectLimiter = new ObjectLimiter(env, PaymentProcessorTransactionCodeConstants.COMPONENT_VENDOR_NAME, PaymentProcessorTransactionCodeConstants.ENTITY_TYPE_NAME, totalCount)) {
098                var entities = paymentProcessorTransactionCodeControl.getPaymentProcessorTransactionCodesByPaymentProcessorTransaction(paymentProcessorTransaction);
099                var paymentProcessorTransactionCodes = entities.stream().map(PaymentProcessorTransactionCodeObject::new).collect(Collectors.toCollection(() -> new ArrayList<>(entities.size())));
100
101                return new CountedObjects<>(objectLimiter, paymentProcessorTransactionCodes);
102            }
103        } else {
104            return Connections.emptyConnection();
105        }
106    }
107
108}