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.util.server.control;
018
019import com.echothree.model.control.core.common.EntityAttributeTypes;
020import com.echothree.model.control.core.common.MimeTypes;
021import com.echothree.model.data.core.server.entity.MimeType;
022import com.echothree.model.data.core.server.entity.MimeTypeDetail;
023import com.echothree.model.data.user.common.pk.UserVisitPK;
024import com.echothree.util.common.message.ExecutionErrors;
025import com.echothree.util.common.validation.FieldDefinition;
026import com.echothree.util.common.form.BaseForm;
027import com.echothree.util.common.form.ValidationResult;
028import com.echothree.util.server.validation.Validator;
029import java.util.List;
030
031public abstract class BaseSimpleCommand<F extends BaseForm>
032        extends BaseCommand {
033
034    protected F form;
035    private List<FieldDefinition> formFieldDefinitions;
036    boolean allowLimits;
037
038    private void init(F form, List<FieldDefinition> formFieldDefinitions, boolean allowLimits) {
039        this.form = form;
040        this.formFieldDefinitions = formFieldDefinitions;
041        this.allowLimits = allowLimits;
042    }
043
044    @Override
045    protected void setupSession() {
046        super.setupSession();
047
048        if(form != null) {
049            session.setOptions(form.getOptions());
050            session.setTransferProperties(form.getTransferProperties());
051
052            if(allowLimits) {
053                session.setLimits(form.getLimits());
054            }
055        }
056    }
057
058    protected BaseSimpleCommand(UserVisitPK userVisitPK, F form, CommandSecurityDefinition commandSecurityDefinition,
059            List<FieldDefinition> formFieldDefinitions, boolean allowLimits) {
060        super(userVisitPK, commandSecurityDefinition);
061        
062        init(form, formFieldDefinitions, allowLimits);
063    }
064    
065    protected BaseSimpleCommand(UserVisitPK userVisitPK, CommandSecurityDefinition commandSecurityDefinition, boolean allowLimits) {
066        super(userVisitPK, commandSecurityDefinition);
067        
068        init(null, null, allowLimits);
069    }
070
071    protected F getForm() {
072        return form;
073    }
074
075    protected List<FieldDefinition> getFormFieldDefinitions() {
076        return formFieldDefinitions;
077    }
078
079    protected void setupValidator(Validator validator) {
080        // Nothing.
081    }
082
083    protected ValidationResult validate(Validator validator) {
084        return validator.validate(form, getFormFieldDefinitions());
085    }
086    
087    protected void setupPreferredClobMimeType() {
088        String preferredClobMimeTypeName = form.getPreferredClobMimeTypeName();
089        
090        if(preferredClobMimeTypeName != null) {
091            var coreControl = getCoreControl();
092            MimeType preferredClobMimeType = coreControl.getMimeTypeByName(preferredClobMimeTypeName);
093
094            if(preferredClobMimeType == null) {
095                addExecutionError(ExecutionErrors.UnknownPreferredClobMimeTypeName.name(), preferredClobMimeTypeName);
096            } else {
097                MimeTypeDetail preferredClobMimeTypeDetail = preferredClobMimeType.getLastDetail();
098                String entityAttributeTypeName = preferredClobMimeTypeDetail.getEntityAttributeType().getEntityAttributeTypeName();
099                
100                // Must be a CLOB and for now the preferred MIME type must be HTML.
101                if(!entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name())
102                        || !preferredClobMimeTypeDetail.getMimeTypeName().equals(MimeTypes.TEXT_HTML.mimeTypeName())) {
103                    addExecutionError(ExecutionErrors.InvalidPreferredClobMimeType.name(), preferredClobMimeTypeName, entityAttributeTypeName);
104                } else {
105                    session.setPreferredClobMimeType(preferredClobMimeType);
106                }
107            }
108        }
109    }
110    
111    @Override
112    protected ValidationResult validate() {
113        ValidationResult validationResult = null;
114        
115        if(getFormFieldDefinitions() != null) {
116            Validator validator = new Validator(this);
117            
118            setupValidator(validator);
119            validationResult = validate(validator);
120        }
121        
122        return validationResult;
123    }
124
125
126    // Perform security and validation for GraphQL queries.
127    public boolean canQueryByGraphQl() {
128        initSession();
129
130        var securityResult = security();
131        boolean canQuery = false;
132
133        if(securityResult == null || !securityResult.getHasMessages()) {
134            var validationResult = validate();
135
136            if((validationResult == null || !validationResult.getHasErrors())) {
137                canQuery = true;
138            }
139        }
140
141        return canQuery;
142    }
143}