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.ForumEdit;
020import com.echothree.control.user.forum.common.edit.ForumEditFactory;
021import com.echothree.control.user.forum.common.form.EditForumForm;
022import com.echothree.control.user.forum.common.result.EditForumResult;
023import com.echothree.control.user.forum.common.result.ForumResultFactory;
024import com.echothree.control.user.forum.common.spec.ForumSpec;
025import com.echothree.model.control.forum.server.control.ForumControl;
026import com.echothree.model.control.icon.server.control.IconControl;
027import com.echothree.model.control.sequence.common.SequenceTypes;
028import com.echothree.model.control.sequence.server.control.SequenceControl;
029import com.echothree.model.data.forum.server.entity.Forum;
030import com.echothree.model.data.icon.server.entity.Icon;
031import com.echothree.model.data.sequence.server.entity.Sequence;
032import com.echothree.model.data.user.common.pk.UserVisitPK;
033import com.echothree.util.common.message.ExecutionErrors;
034import com.echothree.util.common.validation.FieldDefinition;
035import com.echothree.util.common.validation.FieldType;
036import com.echothree.util.common.command.EditMode;
037import com.echothree.util.server.control.BaseAbstractEditCommand;
038import com.echothree.util.server.persistence.Session;
039import java.util.List;
040import javax.enterprise.context.Dependent;
041
042@Dependent
043public class EditForumCommand
044        extends BaseAbstractEditCommand<ForumSpec, ForumEdit, EditForumResult, Forum, Forum> {
045    
046    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
047    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
048    
049    static {
050        SPEC_FIELD_DEFINITIONS = List.of(
051                new FieldDefinition("ForumName", FieldType.ENTITY_NAME, true, null, null)
052                );
053        
054        EDIT_FIELD_DEFINITIONS = List.of(
055                new FieldDefinition("ForumName", FieldType.ENTITY_NAME, true, null, null),
056                new FieldDefinition("IconName", FieldType.ENTITY_NAME, false, null, null),
057                new FieldDefinition("ForumThreadSequenceName", FieldType.ENTITY_NAME, false, null, null),
058                new FieldDefinition("ForumMessageSequenceName", FieldType.ENTITY_NAME, false, null, null),
059                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
060                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L)
061                );
062    }
063    
064    /** Creates a new instance of EditForumCommand */
065    public EditForumCommand() {
066        super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
067    }
068    
069    @Override
070    public EditForumResult getResult() {
071        return ForumResultFactory.getEditForumResult();
072    }
073
074    @Override
075    public ForumEdit getEdit() {
076        return ForumEditFactory.getForumEdit();
077    }
078
079    @Override
080    public Forum getEntity(EditForumResult result) {
081        var forumControl = Session.getModelController(ForumControl.class);
082        Forum forum;
083        var forumName = spec.getForumName();
084
085        if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
086            forum = forumControl.getForumByName(forumName);
087        } else { // EditMode.UPDATE
088            forum = forumControl.getForumByNameForUpdate(forumName);
089        }
090
091        if(forum == null) {
092            addExecutionError(ExecutionErrors.UnknownForumName.name(), forumName);
093        }
094
095        return forum;
096    }
097
098    @Override
099    public Forum getLockEntity(Forum forum) {
100        return forum;
101    }
102
103    @Override
104    public void fillInResult(EditForumResult result, Forum forum) {
105        var forumControl = Session.getModelController(ForumControl.class);
106
107        result.setForum(forumControl.getForumTransfer(getUserVisit(), forum));
108    }
109
110    @Override
111    public void doLock(ForumEdit edit, Forum forum) {
112        var forumControl = Session.getModelController(ForumControl.class);
113        var forumDescription = forumControl.getForumDescription(forum, getPreferredLanguage());
114        var forumDetail = forum.getLastDetail();
115
116        icon = forumDetail.getIcon();
117        forumMessageSequence = forumDetail.getForumMessageSequence();
118        forumThreadSequence = forumDetail.getForumThreadSequence();
119
120        edit.setForumName(forumDetail.getForumName());
121        edit.setIconName(icon == null? null: icon.getLastDetail().getIconName());
122        edit.setForumThreadSequenceName(forumThreadSequence == null? null: forumThreadSequence.getLastDetail().getSequenceName());
123        edit.setForumMessageSequenceName(forumMessageSequence == null? null: forumMessageSequence.getLastDetail().getSequenceName());
124        edit.setSortOrder(forumDetail.getSortOrder().toString());
125
126        if(forumDescription != null) {
127            edit.setDescription(forumDescription.getDescription());
128        }
129    }
130
131    Icon icon = null;
132    Sequence forumThreadSequence = null;
133    Sequence forumMessageSequence = null;
134
135    @Override
136    public void canUpdate(Forum forum) {
137        var forumControl = Session.getModelController(ForumControl.class);
138        var forumName = edit.getForumName();
139        var duplicateForum = forumControl.getForumByName(forumName);
140
141        if(duplicateForum == null || forum.equals(duplicateForum)) {
142            var iconControl = Session.getModelController(IconControl.class);
143            var iconName = edit.getIconName();
144
145            icon = iconName == null? null: iconControl.getIconByName(iconName);
146
147            if(iconName == null || icon != null) {
148                SequenceControl sequenceControl = null;
149                var forumThreadSequenceName = edit.getForumThreadSequenceName();
150                var forumMessageSequenceName = edit.getForumMessageSequenceName();
151
152                if(forumThreadSequenceName != null || forumMessageSequenceName != null) {
153                    sequenceControl = Session.getModelController(SequenceControl.class);
154
155                    if(forumThreadSequenceName != null) {
156                        var sequenceType = sequenceControl.getSequenceTypeByName(SequenceTypes.FORUM_THREAD.name());
157                        forumThreadSequence = sequenceControl.getSequenceByName(sequenceType, forumThreadSequenceName);
158                    }
159                }
160
161                if(forumThreadSequenceName == null || forumThreadSequence != null) {
162
163                    if(forumMessageSequenceName != null) {
164                        var sequenceType = sequenceControl.getSequenceTypeByName(SequenceTypes.FORUM_MESSAGE.name());
165                        forumMessageSequence = sequenceControl.getSequenceByName(sequenceType, forumMessageSequenceName);
166                    }
167
168                    if(forumMessageSequenceName != null && forumMessageSequence == null) {
169                        addExecutionError(ExecutionErrors.UnknownForumMessageSequenceName.name(), forumMessageSequenceName);
170                    }
171                } else {
172                    addExecutionError(ExecutionErrors.UnknownForumThreadSequenceName.name(), forumThreadSequenceName);
173                }
174            } else {
175                addExecutionError(ExecutionErrors.UnknownIconName.name(), iconName);
176            }
177        } else {
178            addExecutionError(ExecutionErrors.DuplicateForumName.name(), forumName);
179        }
180    }
181
182    @Override
183    public void doUpdate(Forum forum) {
184        var forumControl = Session.getModelController(ForumControl.class);
185        var partyPK = getPartyPK();
186        var forumDetailValue = forumControl.getForumDetailValueForUpdate(forum);
187        var forumDescription = forumControl.getForumDescriptionForUpdate(forum, getPreferredLanguage());
188        var description = edit.getDescription();
189
190        forumDetailValue.setForumName(edit.getForumName());
191        forumDetailValue.setIconPK(icon == null? null: icon.getPrimaryKey());
192        forumDetailValue.setForumThreadSequencePK(forumThreadSequence == null? null: forumThreadSequence.getPrimaryKey());
193        forumDetailValue.setForumMessageSequencePK(forumMessageSequence == null? null: forumMessageSequence.getPrimaryKey());
194        forumDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
195
196        forumControl.updateForumFromValue(forumDetailValue, partyPK);
197
198        if(forumDescription == null && description != null) {
199            forumControl.createForumDescription(forum, getPreferredLanguage(), description, partyPK);
200        } else if(forumDescription != null && description == null) {
201            forumControl.deleteForumDescription(forumDescription, partyPK);
202        } else if(forumDescription != null && description != null) {
203            var forumDescriptionValue = forumControl.getForumDescriptionValue(forumDescription);
204
205            forumDescriptionValue.setDescription(description);
206            forumControl.updateForumDescriptionFromValue(forumDescriptionValue, partyPK);
207        }
208    }
209    
210}