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 java.util.List;
036import javax.enterprise.context.Dependent;
037import javax.inject.Inject;
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    @Inject
060    ForumControl forumControl;
061
062    @Inject
063    IconControl iconControl;
064
065    
066    /** Creates a new instance of EditForumGroupCommand */
067    public EditForumGroupCommand() {
068        super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
069    }
070    
071    @Override
072    public EditForumGroupResult getResult() {
073        return ForumResultFactory.getEditForumGroupResult();
074    }
075
076    @Override
077    public ForumGroupEdit getEdit() {
078        return ForumEditFactory.getForumGroupEdit();
079    }
080
081    @Override
082    public ForumGroup getEntity(EditForumGroupResult result) {
083        ForumGroup forumGroup;
084        var forumGroupName = spec.getForumGroupName();
085
086        if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
087            forumGroup = forumControl.getForumGroupByName(forumGroupName);
088        } else { // EditMode.UPDATE
089            forumGroup = forumControl.getForumGroupByNameForUpdate(forumGroupName);
090        }
091
092        if(forumGroup == null) {
093            addExecutionError(ExecutionErrors.UnknownForumGroupName.name(), forumGroupName);
094        }
095
096        return forumGroup;
097    }
098
099    @Override
100    public ForumGroup getLockEntity(ForumGroup forumGroup) {
101        return forumGroup;
102    }
103
104    @Override
105    public void fillInResult(EditForumGroupResult result, ForumGroup forumGroup) {
106        result.setForumGroup(forumControl.getForumGroupTransfer(getUserVisit(), forumGroup));
107    }
108
109    @Override
110    public void doLock(ForumGroupEdit edit, ForumGroup forumGroup) {
111        var forumGroupDescription = forumControl.getForumGroupDescription(forumGroup, getPreferredLanguage());
112        var forumGroupDetail = forumGroup.getLastDetail();
113
114        icon = forumGroupDetail.getIcon();
115
116        edit.setForumGroupName(forumGroupDetail.getForumGroupName());
117        edit.setIconName(icon == null? null: icon.getLastDetail().getIconName());
118        edit.setSortOrder(forumGroupDetail.getSortOrder().toString());
119
120        if(forumGroupDescription != null) {
121            edit.setDescription(forumGroupDescription.getDescription());
122        }
123    }
124
125    Icon icon = null;
126
127    @Override
128    public void canUpdate(ForumGroup forumGroup) {
129        var forumGroupName = edit.getForumGroupName();
130        var duplicateForumGroup = forumControl.getForumGroupByName(forumGroupName);
131
132        if(duplicateForumGroup == null || forumGroup.equals(duplicateForumGroup)) {
133            var iconName = edit.getIconName();
134
135            icon = iconName == null? null: iconControl.getIconByName(iconName);
136
137            if(iconName != null && icon == null) {
138                addExecutionError(ExecutionErrors.UnknownIconName.name(), iconName);
139            }
140        } else {
141            addExecutionError(ExecutionErrors.DuplicateForumGroupName.name(), forumGroupName);
142        }
143    }
144
145    @Override
146    public void doUpdate(ForumGroup forumGroup) {
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}