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.control.user.party.server.command;
018
019import com.echothree.control.user.party.common.form.GetPartyApplicationEditorUseForm;
020import com.echothree.control.user.party.common.result.PartyResultFactory;
021import com.echothree.model.control.core.common.EventTypes;
022import com.echothree.model.control.core.server.control.ApplicationControl;
023import com.echothree.model.control.core.server.logic.ApplicationLogic;
024import com.echothree.model.control.party.common.PartyTypes;
025import com.echothree.model.control.party.server.control.PartyApplicationEditorUseControl;
026import com.echothree.model.control.party.server.logic.PartyLogic;
027import com.echothree.model.control.security.common.SecurityRoleGroups;
028import com.echothree.model.control.security.common.SecurityRoles;
029import com.echothree.model.data.party.server.entity.PartyApplicationEditorUse;
030import com.echothree.util.common.command.BaseResult;
031import com.echothree.util.common.message.ExecutionErrors;
032import com.echothree.util.common.validation.FieldDefinition;
033import com.echothree.util.common.validation.FieldType;
034import com.echothree.util.server.control.BaseSingleEntityCommand;
035import com.echothree.util.server.control.CommandSecurityDefinition;
036import com.echothree.util.server.control.PartyTypeDefinition;
037import com.echothree.util.server.control.SecurityRoleDefinition;
038import java.util.List;
039import javax.enterprise.context.Dependent;
040import javax.inject.Inject;
041
042@Dependent
043public class GetPartyApplicationEditorUseCommand
044        extends BaseSingleEntityCommand<PartyApplicationEditorUse, GetPartyApplicationEditorUseForm> {
045    
046    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
047    private final static List<FieldDefinition> FORM_FIELD_DEFINITIONS;
048    
049    static {
050        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(List.of(
051                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
052                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), List.of(
053                        new SecurityRoleDefinition(SecurityRoleGroups.PartyApplicationEditorUse.name(), SecurityRoles.Review.name())
054                ))
055        ));
056        
057        FORM_FIELD_DEFINITIONS = List.of(
058                new FieldDefinition("PartyName", FieldType.ENTITY_NAME, false, null, null),
059                new FieldDefinition("ApplicationName", FieldType.ENTITY_NAME, true, null, null),
060                new FieldDefinition("ApplicationEditorUseName", FieldType.ENTITY_NAME, true, null, null)
061        );
062    }
063
064    @Inject
065    ApplicationControl applicationControl;
066
067    @Inject
068    PartyApplicationEditorUseControl partyApplicationEditorUseControl;
069
070    @Inject
071    ApplicationLogic applicationLogic;
072
073    @Inject
074    PartyLogic partyLogic;
075
076    /** Creates a new instance of GetPartyApplicationEditorUseCommand */
077    public GetPartyApplicationEditorUseCommand() {
078        super(COMMAND_SECURITY_DEFINITION, FORM_FIELD_DEFINITIONS, true);
079    }
080    
081    @Override
082    protected PartyApplicationEditorUse getEntity() {
083        PartyApplicationEditorUse partyApplicationEditorUse = null;
084        var partyName = form.getPartyName();
085        var party = partyName == null ? getParty() : partyLogic.getPartyByName(this, partyName);
086        
087        if(!hasExecutionErrors()) {
088            var applicationName = form.getApplicationName();
089            var application = applicationLogic.getApplicationByName(this, applicationName);
090            
091            if(!hasExecutionErrors()) {
092                var applicationEditorUseName = form.getApplicationEditorUseName();
093                var applicationEditorUse = applicationLogic.getApplicationEditorUseByName(this, application, applicationEditorUseName);
094                
095                if(!hasExecutionErrors()) {
096                    var partyPK = getPartyPK();
097
098                    partyApplicationEditorUse = partyApplicationEditorUseControl.getPartyApplicationEditorUse(party, applicationEditorUse);
099
100                    if(partyApplicationEditorUse == null && partyName == null) {
101                        partyApplicationEditorUse = partyApplicationEditorUseControl.createPartyApplicationEditorUse(party, applicationEditorUse, null, null, null, partyPK);
102                    }
103                    
104                    if(partyApplicationEditorUse != null) {
105                        sendEvent(partyApplicationEditorUse.getPrimaryKey(), EventTypes.READ, null, null, partyPK);
106                    } else {
107                        addExecutionError(ExecutionErrors.UnknownPartyApplicationEditorUse.name(), partyName, applicationName, applicationEditorUseName);
108                    }
109                }
110            }
111        }
112
113        return partyApplicationEditorUse;
114    }
115
116    @Override
117    protected BaseResult getResult(PartyApplicationEditorUse partyApplicationEditorUse) {
118        var result = PartyResultFactory.getGetPartyApplicationEditorUseResult();
119
120        if(partyApplicationEditorUse != null) {
121            var userVisit = getUserVisit();
122            var partyApplicationEditorUseTransfer = partyApplicationEditorUseControl.getPartyApplicationEditorUseTransfer(userVisit, partyApplicationEditorUse);
123
124            // Fill in a few defaults in the TO if the Party is requesting this for themselves.
125            if(form.getPartyName() == null) {
126                var applicationEditorUse = partyApplicationEditorUse.getLastDetail().getApplicationEditorUse();
127                var applicationEditorUseDetail = applicationEditorUse.getLastDetail();
128                var application = applicationEditorUseDetail.getApplication();
129                var preferredHeight = partyApplicationEditorUseTransfer.getPreferredHeight();
130                var preferredWidth = partyApplicationEditorUseTransfer.getPreferredWidth();
131
132                if(partyApplicationEditorUseTransfer.getApplicationEditor() == null) {
133                    var applicationEditor = applicationEditorUseDetail.getDefaultApplicationEditor();
134
135                    if(applicationEditor == null) {
136                        applicationEditor = applicationControl.getDefaultApplicationEditor(application);
137
138                        if(applicationEditor == null) {
139                            addExecutionError(ExecutionErrors.UnknownDefaultApplicationEditor.name(), form.getApplicationName());
140                        }
141                    }
142
143                    if(!hasExecutionErrors()) {
144                        partyApplicationEditorUseTransfer.setApplicationEditor(applicationControl.getApplicationEditorTransfer(userVisit, applicationEditor));
145                    }
146                }
147
148                if(preferredHeight == null || preferredWidth == null) {
149                    if(preferredHeight == null) {
150                        preferredHeight = applicationEditorUseDetail.getDefaultHeight();
151                    }
152
153                    if(preferredWidth == null) {
154                        preferredWidth = applicationEditorUseDetail.getDefaultWidth();
155                    }
156
157                    if(preferredHeight == null || preferredWidth == null) {
158                        var editor = partyApplicationEditorUseTransfer.getApplicationEditor().getEditor();
159
160                        if(preferredHeight == null) {
161                            preferredHeight = editor.getDefaultHeight();
162                        }
163
164                        if(preferredWidth == null) {
165                            preferredWidth = editor.getDefaultWidth();
166                        }
167                    }
168
169                    partyApplicationEditorUseTransfer.setPreferredHeight(preferredHeight);
170                    partyApplicationEditorUseTransfer.setPreferredWidth(preferredWidth);
171                }
172            }
173
174            result.setPartyApplicationEditorUse(partyApplicationEditorUseTransfer);
175        }
176        
177        return result;
178    }
179    
180}