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.forum.server.command;
018
019import com.echothree.control.user.forum.common.edit.ForumEditFactory;
020import com.echothree.control.user.forum.common.edit.ForumGroupEdit;
021import com.echothree.control.user.forum.common.form.EditForumGroupForm;
022import com.echothree.control.user.forum.common.result.EditForumGroupResult;
023import com.echothree.control.user.forum.common.result.ForumResultFactory;
024import com.echothree.control.user.forum.common.spec.ForumGroupSpec;
025import com.echothree.model.control.forum.server.control.ForumControl;
026import com.echothree.model.control.icon.server.control.IconControl;
027import com.echothree.model.data.forum.server.entity.ForumGroup;
028import com.echothree.model.data.icon.server.entity.Icon;
029import com.echothree.model.data.user.common.pk.UserVisitPK;
030import com.echothree.util.common.message.ExecutionErrors;
031import com.echothree.util.common.validation.FieldDefinition;
032import com.echothree.util.common.validation.FieldType;
033import com.echothree.util.common.command.EditMode;
034import com.echothree.util.server.control.BaseAbstractEditCommand;
035import com.echothree.util.server.persistence.Session;
036import java.util.List;
037import javax.enterprise.context.Dependent;
038
039@Dependent
040public class EditForumGroupCommand
041        extends BaseAbstractEditCommand<ForumGroupSpec, ForumGroupEdit, EditForumGroupResult, ForumGroup, ForumGroup> {
042    
043    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
044    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
045    
046    static {
047        SPEC_FIELD_DEFINITIONS = List.of(
048                new FieldDefinition("ForumGroupName", FieldType.ENTITY_NAME, true, null, null)
049                );
050        
051        EDIT_FIELD_DEFINITIONS = List.of(
052                new FieldDefinition("ForumGroupName", FieldType.ENTITY_NAME, true, null, null),
053                new FieldDefinition("IconName", FieldType.ENTITY_NAME, false, null, null),
054                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
055                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L)
056                );
057    }
058    
059    /** Creates a new instance of EditForumGroupCommand */
060    public EditForumGroupCommand() {
061        super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
062    }
063    
064    @Override
065    public EditForumGroupResult getResult() {
066        return ForumResultFactory.getEditForumGroupResult();
067    }
068
069    @Override
070    public ForumGroupEdit getEdit() {
071        return ForumEditFactory.getForumGroupEdit();
072    }
073
074    @Override
075    public ForumGroup getEntity(EditForumGroupResult result) {
076        var forumControl = Session.getModelController(ForumControl.class);
077        ForumGroup forumGroup;
078        var forumGroupName = spec.getForumGroupName();
079
080        if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
081            forumGroup = forumControl.getForumGroupByName(forumGroupName);
082        } else { // EditMode.UPDATE
083            forumGroup = forumControl.getForumGroupByNameForUpdate(forumGroupName);
084        }
085
086        if(forumGroup == null) {
087            addExecutionError(ExecutionErrors.UnknownForumGroupName.name(), forumGroupName);
088        }
089
090        return forumGroup;
091    }
092
093    @Override
094    public ForumGroup getLockEntity(ForumGroup forumGroup) {
095        return forumGroup;
096    }
097
098    @Override
099    public void fillInResult(EditForumGroupResult result, ForumGroup forumGroup) {
100        var forumControl = Session.getModelController(ForumControl.class);
101
102        result.setForumGroup(forumControl.getForumGroupTransfer(getUserVisit(), forumGroup));
103    }
104
105    @Override
106    public void doLock(ForumGroupEdit edit, ForumGroup forumGroup) {
107        var forumControl = Session.getModelController(ForumControl.class);
108        var forumGroupDescription = forumControl.getForumGroupDescription(forumGroup, getPreferredLanguage());
109        var forumGroupDetail = forumGroup.getLastDetail();
110
111        icon = forumGroupDetail.getIcon();
112
113        edit.setForumGroupName(forumGroupDetail.getForumGroupName());
114        edit.setIconName(icon == null? null: icon.getLastDetail().getIconName());
115        edit.setSortOrder(forumGroupDetail.getSortOrder().toString());
116
117        if(forumGroupDescription != null) {
118            edit.setDescription(forumGroupDescription.getDescription());
119        }
120    }
121
122    Icon icon = null;
123
124    @Override
125    public void canUpdate(ForumGroup forumGroup) {
126        var forumControl = Session.getModelController(ForumControl.class);
127        var forumGroupName = edit.getForumGroupName();
128        var duplicateForumGroup = forumControl.getForumGroupByName(forumGroupName);
129
130        if(duplicateForumGroup == null || forumGroup.equals(duplicateForumGroup)) {
131            var iconControl = Session.getModelController(IconControl.class);
132            var iconName = edit.getIconName();
133
134            icon = iconName == null? null: iconControl.getIconByName(iconName);
135
136            if(iconName != null && icon == null) {
137                addExecutionError(ExecutionErrors.UnknownIconName.name(), iconName);
138            }
139        } else {
140            addExecutionError(ExecutionErrors.DuplicateForumGroupName.name(), forumGroupName);
141        }
142    }
143
144    @Override
145    public void doUpdate(ForumGroup forumGroup) {
146        var forumControl = Session.getModelController(ForumControl.class);
147        var partyPK = getPartyPK();
148        var forumGroupDetailValue = forumControl.getForumGroupDetailValueForUpdate(forumGroup);
149        var forumGroupDescription = forumControl.getForumGroupDescriptionForUpdate(forumGroup, getPreferredLanguage());
150        var description = edit.getDescription();
151
152        forumGroupDetailValue.setForumGroupName(edit.getForumGroupName());
153        forumGroupDetailValue.setIconPK(icon == null? null: icon.getPrimaryKey());
154        forumGroupDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
155
156        forumControl.updateForumGroupFromValue(forumGroupDetailValue, partyPK);
157
158        if(forumGroupDescription == null && description != null) {
159            forumControl.createForumGroupDescription(forumGroup, getPreferredLanguage(), description, partyPK);
160        } else if(forumGroupDescription != null && description == null) {
161            forumControl.deleteForumGroupDescription(forumGroupDescription, partyPK);
162        } else if(forumGroupDescription != null && description != null) {
163            var forumGroupDescriptionValue = forumControl.getForumGroupDescriptionValue(forumGroupDescription);
164
165            forumGroupDescriptionValue.setDescription(description);
166            forumControl.updateForumGroupDescriptionFromValue(forumGroupDescriptionValue, partyPK);
167        }
168    }
169
170}