001// --------------------------------------------------------------------------------
002// Copyright 2002-2025 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.BlogCommentEdit;
020import com.echothree.control.user.forum.common.edit.ForumEditFactory;
021import com.echothree.control.user.forum.common.form.EditBlogCommentForm;
022import com.echothree.control.user.forum.common.result.EditBlogCommentResult;
023import com.echothree.control.user.forum.common.result.ForumResultFactory;
024import com.echothree.control.user.forum.common.spec.ForumMessageSpec;
025import com.echothree.model.control.core.server.control.MimeTypeControl;
026import com.echothree.model.control.forum.common.ForumConstants;
027import com.echothree.model.control.forum.server.control.ForumControl;
028import com.echothree.model.control.icon.common.IconConstants;
029import com.echothree.model.control.icon.server.control.IconControl;
030import com.echothree.model.data.core.server.entity.MimeType;
031import com.echothree.model.data.forum.server.entity.ForumMessage;
032import com.echothree.model.data.icon.server.entity.Icon;
033import com.echothree.model.data.user.common.pk.UserVisitPK;
034import com.echothree.util.common.command.EditMode;
035import com.echothree.util.common.message.ExecutionErrors;
036import com.echothree.util.common.validation.FieldDefinition;
037import com.echothree.util.common.validation.FieldType;
038import com.echothree.util.server.control.BaseAbstractEditCommand;
039import com.echothree.util.server.persistence.Session;
040import com.echothree.util.server.string.DateUtils;
041import java.util.Arrays;
042import java.util.Collections;
043import java.util.List;
044import javax.enterprise.context.RequestScoped;
045
046@RequestScoped
047public class EditBlogCommentCommand
048        extends BaseAbstractEditCommand<ForumMessageSpec, BlogCommentEdit, EditBlogCommentResult, ForumMessage, ForumMessage> {
049    
050    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
051    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
052    
053    static {
054        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
055                new FieldDefinition("ForumMessageName", FieldType.ENTITY_NAME, true, null, null)
056                ));
057        
058        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
059                new FieldDefinition("PostedTime", FieldType.DATE_TIME, true, null, null),
060                new FieldDefinition("ForumMessageIconName", FieldType.ENTITY_NAME, false, null, null),
061                new FieldDefinition("Title", FieldType.STRING, true, 1L, 512L),
062                new FieldDefinition("ContentMimeTypeName", FieldType.MIME_TYPE, true, null, null),
063                new FieldDefinition("Content", FieldType.STRING, true, null, null)
064                ));
065    }
066    
067    /** Creates a new instance of EditBlogCommentCommand */
068    public EditBlogCommentCommand() {
069        super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
070    }
071    
072    @Override
073    public EditBlogCommentResult getResult() {
074        return ForumResultFactory.getEditBlogCommentResult();
075    }
076
077    @Override
078    public BlogCommentEdit getEdit() {
079        return ForumEditFactory.getBlogCommentEdit();
080    }
081
082    @Override
083    public ForumMessage getEntity(EditBlogCommentResult result) {
084        var forumControl = Session.getModelController(ForumControl.class);
085        ForumMessage forumMessage;
086        var forumMessageName = spec.getForumMessageName();
087
088        if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
089            forumMessage = forumControl.getForumMessageByName(forumMessageName);
090        } else { // EditMode.UPDATE
091            forumMessage = forumControl.getForumMessageByNameForUpdate(forumMessageName);
092        }
093
094        if(forumMessage == null) {
095            addExecutionError(ExecutionErrors.UnknownForumMessageName.name(), forumMessageName);
096        }
097
098        return forumMessage;
099    }
100
101    @Override
102    public ForumMessage getLockEntity(ForumMessage forumMessage) {
103        return forumMessage;
104    }
105
106    @Override
107    public void fillInResult(EditBlogCommentResult result, ForumMessage forumMessage) {
108        var forumControl = Session.getModelController(ForumControl.class);
109
110        result.setForumMessage(forumControl.getForumMessageTransfer(getUserVisit(), forumMessage));
111    }
112
113    @Override
114    public void doLock(BlogCommentEdit edit, ForumMessage forumMessage) {
115        var forumControl = Session.getModelController(ForumControl.class);
116        var forumMessageDetail = forumMessage.getLastDetail();
117
118        forumMessageIcon = forumMessageDetail.getIcon();
119
120        edit.setForumMessageIconName(forumMessageIcon == null? null: forumMessageIcon.getLastDetail().getIconName());
121        edit.setPostedTime(DateUtils.getInstance().formatTypicalDateTime(getUserVisit(), getPreferredDateTimeFormat(), forumMessageDetail.getPostedTime()));
122
123        var forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE);
124        var preferredLanguage = getPreferredLanguage();
125        var forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
126        if(forumMessagePart != null) {
127            var forumStringMessagePart = forumControl.getForumStringMessagePart(forumMessagePart);
128
129            edit.setTitle(forumStringMessagePart.getString());
130        }
131
132        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT);
133        forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
134        if(forumMessagePart != null) {
135            var forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart);
136
137            edit.setContentMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName());
138            edit.setContent(forumClobMessagePart.getClob());
139        }
140    }
141
142    Icon forumMessageIcon = null;
143    MimeType contentMimeType = null;
144
145    @Override
146    public void canUpdate(ForumMessage forumMessage) {
147        var forumControl = Session.getModelController(ForumControl.class);
148        var forumMessageDetail = forumMessage.getLastDetail();
149
150        if(forumMessageDetail.getForumMessageType().getForumMessageTypeName().equals(ForumConstants.ForumMessageType_BLOG_COMMENT)) {
151            var iconControl = Session.getModelController(IconControl.class);
152            var forumMessageIconName = edit.getForumMessageIconName();
153
154            forumMessageIcon = forumMessageIconName == null? null: iconControl.getIconByName(forumMessageIconName);
155
156            if(forumMessageIconName == null || forumMessageIcon != null) {
157                if(forumMessageIcon != null) {
158                    var iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_MESSAGE);
159                    var iconUsage = iconControl.getIconUsage(iconUsageType, forumMessageIcon);
160
161                    if(iconUsage == null) {
162                        addExecutionError(ExecutionErrors.UnknownIconUsage.name());
163                    }
164                }
165
166                if(!hasExecutionErrors()) {
167                    var mimeTypeControl = Session.getModelController(MimeTypeControl.class);
168                    var contentMimeTypeName = edit.getContentMimeTypeName();
169
170                    contentMimeType = contentMimeTypeName == null? null: mimeTypeControl.getMimeTypeByName(contentMimeTypeName);
171
172                    if(contentMimeType != null) {
173                        var forum = forumControl.getDefaultForumForumThread(forumMessageDetail.getForumThread()).getForum();
174                        var forumMimeType = forumControl.getForumMimeType(forum, contentMimeType);
175
176                        if(forumMimeType == null) {
177                            addExecutionError(ExecutionErrors.UnknownForumMimeType.name());
178                        }
179                    } else {
180                        addExecutionError(ExecutionErrors.UnknownContentMimeTypeName.name(), contentMimeTypeName);
181                    }
182                }
183            } else {
184                addExecutionError(ExecutionErrors.UnknownIconName.name(), forumMessageIconName);
185            }
186        } else {
187            addExecutionError(ExecutionErrors.InvalidForumMessageType.name());
188        }
189    }
190
191    @Override
192    public void doUpdate(ForumMessage forumMessage) {
193        var forumControl = Session.getModelController(ForumControl.class);
194        var partyPK = getPartyPK();
195        var forumMessageDetailValue = forumControl.getForumMessageDetailValueForUpdate(forumMessage);
196
197        forumMessageDetailValue.setIconPK(forumMessageIcon == null? null: forumMessageIcon.getPrimaryKey());
198        forumMessageDetailValue.setPostedTime(Long.valueOf(edit.getPostedTime()));
199
200        forumControl.updateForumMessageFromValue(forumMessageDetailValue, partyPK);
201
202        var forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE);
203        var preferredLanguage = getPreferredLanguage();
204        var forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
205        if(forumMessagePart != null) {
206            var forumStringMessagePartValue = forumControl.getForumStringMessagePartValueForUpdate(forumMessagePart);
207
208            forumStringMessagePartValue.setString(edit.getTitle());
209
210            forumControl.updateForumStringMessagePartFromValue(forumStringMessagePartValue, partyPK);
211        }
212
213        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT);
214        forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
215        if(forumMessagePart != null) {
216            var forumMessagePartDetailValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart);
217            var forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart);
218
219            forumMessagePartDetailValue.setMimeTypePK(contentMimeType.getPrimaryKey());
220            forumClobMessagePartValue.setClob(edit.getContent());
221
222            forumControl.updateForumMessagePartFromValue(forumMessagePartDetailValue, partyPK);
223            forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK);
224        }
225    }
226    
227}