001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 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.cancellationpolicy.server.graphql;
018
019import com.echothree.model.control.cancellationpolicy.server.control.CancellationPolicyControl;
020import com.echothree.model.control.core.server.graphql.CoreSecurityUtils;
021import com.echothree.model.control.core.server.graphql.MimeTypeObject;
022import com.echothree.model.control.graphql.server.graphql.BaseEntityInstanceObject;
023import com.echothree.model.control.graphql.server.util.BaseGraphQl;
024import com.echothree.model.control.user.server.control.UserControl;
025import com.echothree.model.data.cancellationpolicy.server.entity.CancellationPolicy;
026import com.echothree.model.data.cancellationpolicy.server.entity.CancellationPolicyDetail;
027import com.echothree.model.data.cancellationpolicy.server.entity.CancellationPolicyTranslation;
028import com.echothree.util.server.persistence.Session;
029import graphql.annotations.annotationTypes.GraphQLDescription;
030import graphql.annotations.annotationTypes.GraphQLField;
031import graphql.annotations.annotationTypes.GraphQLName;
032import graphql.annotations.annotationTypes.GraphQLNonNull;
033import graphql.schema.DataFetchingEnvironment;
034
035@GraphQLDescription("cancellation policy object")
036@GraphQLName("CancellationPolicy")
037public class CancellationPolicyObject
038        extends BaseEntityInstanceObject {
039    
040    private final CancellationPolicy cancellationPolicy; // Always Present
041    
042    public CancellationPolicyObject(CancellationPolicy cancellationPolicy) {
043        super(cancellationPolicy.getPrimaryKey());
044        
045        this.cancellationPolicy = cancellationPolicy;
046    }
047
048    private CancellationPolicyDetail cancellationPolicyDetail; // Optional, use getCancellationPolicyDetail()
049
050    private CancellationPolicyDetail getCancellationPolicyDetail() {
051        if(cancellationPolicyDetail == null) {
052            cancellationPolicyDetail = cancellationPolicy.getLastDetail();
053        }
054
055        return cancellationPolicyDetail;
056    }
057
058    private CancellationPolicyTranslation cancellationPolicyTranslation; // Optional, use getCancellationPolicyTranslation()
059
060    private CancellationPolicyTranslation getCancellationPolicyTranslation(final DataFetchingEnvironment env) {
061        if(cancellationPolicyTranslation == null) {
062            var cancellationPolicyControl = Session.getModelController(CancellationPolicyControl.class);
063            var userControl = Session.getModelController(UserControl.class);
064
065            cancellationPolicyTranslation = cancellationPolicyControl.getBestCancellationPolicyTranslation(cancellationPolicy, userControl.getPreferredLanguageFromUserVisit(BaseGraphQl.getUserVisit(env)));
066        }
067
068        return cancellationPolicyTranslation;
069    }
070
071    @GraphQLField
072    @GraphQLDescription("cancellation policy name")
073    @GraphQLNonNull
074    public String getCancellationPolicyName() {
075        return getCancellationPolicyDetail().getCancellationPolicyName();
076    }
077
078    @GraphQLField
079    @GraphQLDescription("cancellation kind")
080    public CancellationKindObject getCancellationKind(final DataFetchingEnvironment env) {
081        return CancellationPolicySecurityUtils.getHasCancellationKindAccess(env) ? new CancellationKindObject(getCancellationPolicyDetail().getCancellationKind()) : null;
082    }
083
084    @GraphQLField
085    @GraphQLDescription("is default")
086    @GraphQLNonNull
087    public boolean getIsDefault() {
088        return getCancellationPolicyDetail().getIsDefault();
089    }
090    
091    @GraphQLField
092    @GraphQLDescription("sort order")
093    @GraphQLNonNull
094    public int getSortOrder() {
095        return getCancellationPolicyDetail().getSortOrder();
096    }
097
098    @GraphQLField
099    @GraphQLDescription("description")
100    @GraphQLNonNull
101    public String getDescription(final DataFetchingEnvironment env) {
102        var cancellationPolicyTranslation = getCancellationPolicyTranslation(env);
103
104        return cancellationPolicyTranslation == null ? null : cancellationPolicyTranslation.getDescription();
105    }
106
107    @GraphQLField
108    @GraphQLDescription("policy mime type")
109    public MimeTypeObject getPolicyMimeType(final DataFetchingEnvironment env) {
110        var cancellationPolicyTranslation = getCancellationPolicyTranslation(env);
111        var policyMimeType = cancellationPolicyTranslation == null ? null : cancellationPolicyTranslation.getPolicyMimeType();
112
113        return policyMimeType == null ? null : (CoreSecurityUtils.getHasMimeTypeAccess(env) ? new MimeTypeObject(policyMimeType) : null);
114    }
115
116    @GraphQLField
117    @GraphQLDescription("policy")
118    @GraphQLNonNull
119    public String getPolicy(final DataFetchingEnvironment env) {
120        var cancellationPolicyTranslation = getCancellationPolicyTranslation(env);
121
122        return cancellationPolicyTranslation == null ? null : cancellationPolicyTranslation.getPolicy();
123    }
124
125}