001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 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.form.CreateBlogEntryForm;
020import com.echothree.control.user.forum.common.result.CreateBlogEntryResult;
021import com.echothree.control.user.forum.common.result.ForumResultFactory;
022import com.echothree.model.control.forum.common.ForumConstants;
023import com.echothree.model.control.forum.server.control.ForumControl;
024import com.echothree.model.control.forum.server.logic.ForumLogic;
025import com.echothree.model.control.icon.common.IconConstants;
026import com.echothree.model.control.icon.server.control.IconControl;
027import com.echothree.model.control.party.server.control.PartyControl;
028import com.echothree.model.control.user.server.control.UserControl;
029import com.echothree.model.data.core.server.entity.MimeType;
030import com.echothree.model.data.forum.server.entity.Forum;
031import com.echothree.model.data.forum.server.entity.ForumMessage;
032import com.echothree.model.data.forum.server.entity.ForumMessagePart;
033import com.echothree.model.data.forum.server.entity.ForumMessagePartType;
034import com.echothree.model.data.forum.server.entity.ForumMessageType;
035import com.echothree.model.data.forum.server.entity.ForumMimeType;
036import com.echothree.model.data.forum.server.entity.ForumRoleType;
037import com.echothree.model.data.forum.server.entity.ForumThread;
038import com.echothree.model.data.icon.server.entity.Icon;
039import com.echothree.model.data.icon.server.entity.IconUsage;
040import com.echothree.model.data.icon.server.entity.IconUsageType;
041import com.echothree.model.data.party.server.entity.Language;
042import com.echothree.model.data.party.server.entity.Party;
043import com.echothree.model.data.user.common.pk.UserVisitPK;
044import com.echothree.model.data.user.server.entity.UserLogin;
045import com.echothree.util.common.message.ExecutionErrors;
046import com.echothree.util.common.validation.FieldDefinition;
047import com.echothree.util.common.validation.FieldType;
048import com.echothree.util.common.command.BaseResult;
049import com.echothree.util.common.persistence.BasePK;
050import com.echothree.util.server.control.BaseSimpleCommand;
051import com.echothree.util.server.persistence.Session;
052import java.util.Arrays;
053import java.util.Collections;
054import java.util.List;
055
056public class CreateBlogEntryCommand
057        extends BaseSimpleCommand<CreateBlogEntryForm> {
058    
059    private final static List<FieldDefinition> FORM_FIELD_DEFINITIONS;
060    
061    static {
062        FORM_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
063                new FieldDefinition("Username", FieldType.STRING, false, 1L, 80L),
064                new FieldDefinition("ForumName", FieldType.ENTITY_NAME, true, null, null),
065                new FieldDefinition("LanguageIsoName", FieldType.ENTITY_NAME, false, null, null),
066                new FieldDefinition("ForumThreadIconName", FieldType.ENTITY_NAME, false, null, null),
067                new FieldDefinition("PostedTime", FieldType.DATE_TIME, false, null, null),
068                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
069                new FieldDefinition("ForumMessageIconName", FieldType.ENTITY_NAME, false, null, null),
070                new FieldDefinition("Title", FieldType.STRING, true, 1L, 512L),
071                new FieldDefinition("FeedSummaryMimeTypeName", FieldType.MIME_TYPE, false, null, null),
072                new FieldDefinition("FeedSummary", FieldType.STRING, false, null, null),
073                new FieldDefinition("SummaryMimeTypeName", FieldType.MIME_TYPE, false, null, null),
074                new FieldDefinition("Summary", FieldType.STRING, false, null, null),
075                new FieldDefinition("ContentMimeTypeName", FieldType.MIME_TYPE, true, null, null),
076                new FieldDefinition("Content", FieldType.STRING, true, null, null)
077                ));
078    }
079    
080    /** Creates a new instance of CreateBlogEntryCommand */
081    public CreateBlogEntryCommand(UserVisitPK userVisitPK, CreateBlogEntryForm form) {
082        super(userVisitPK, form, null, FORM_FIELD_DEFINITIONS, false);
083    }
084    
085    @Override
086    protected BaseResult execute() {
087        var userControl = Session.getModelController(UserControl.class);
088        CreateBlogEntryResult result = ForumResultFactory.getCreateBlogEntryResult();
089        String username = form.getUsername();
090        UserLogin userLogin = username == null ? null : userControl.getUserLoginByUsername(username);
091        
092        if(username == null || userLogin != null) {
093            var forumControl = Session.getModelController(ForumControl.class);
094            String forumName = form.getForumName();
095            Forum forum = forumControl.getForumByName(forumName);
096
097            if(forum != null) {
098                String forumTypeName = forum.getLastDetail().getForumType().getForumTypeName();
099
100                if(forumTypeName.equals(ForumConstants.ForumType_BLOG)) {
101                    Party party = userLogin == null ? getParty() : userLogin.getParty();
102                    ForumRoleType forumRoleType = ForumLogic.getInstance().getForumRoleTypeByName(this, ForumConstants.ForumRoleType_AUTHOR);
103
104                    if(!hasExecutionErrors()) {
105                        if(ForumLogic.getInstance().isForumRoleTypePermitted(this, forum, party, forumRoleType)) {
106                            var partyControl = Session.getModelController(PartyControl.class);
107                            String languageIsoName = form.getLanguageIsoName();
108                            Language language = languageIsoName == null? getPreferredLanguage(): partyControl.getLanguageByIsoName(languageIsoName);
109
110                            if(language != null) {
111                                var iconControl = Session.getModelController(IconControl.class);
112                                String forumThreadIconName = form.getForumThreadIconName();
113                                Icon forumThreadIcon = iconControl.getIconByName(forumThreadIconName);
114
115                                if(forumThreadIconName == null || forumThreadIcon != null) {
116                                    if(forumThreadIcon != null) {
117                                        IconUsageType iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_THREAD);
118                                        IconUsage iconUsage = iconControl.getIconUsage(iconUsageType, forumThreadIcon);
119
120                                        if(iconUsage == null) {
121                                            addExecutionError(ExecutionErrors.UnknownIconUsage.name());
122                                        }
123                                    }
124
125                                    if(!hasExecutionErrors()) {
126                                        String forumMessageIconName = form.getForumMessageIconName();
127                                        Icon forumMessageIcon = iconControl.getIconByName(forumMessageIconName);
128
129                                        if(forumMessageIconName == null || forumMessageIcon != null) {
130                                            if(forumMessageIcon != null) {
131                                                IconUsageType iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_MESSAGE);
132                                                IconUsage iconUsage = iconControl.getIconUsage(iconUsageType, forumMessageIcon);
133
134                                                if(iconUsage == null) {
135                                                    addExecutionError(ExecutionErrors.UnknownIconUsage.name());
136                                                }
137                                            }
138
139                                            if(!hasExecutionErrors()) {
140                                                String feedSummaryMimeTypeName = form.getFeedSummaryMimeTypeName();
141                                                String feedSummary = form.getFeedSummary();
142                                                int feedSummaryParameterCount = (feedSummaryMimeTypeName == null ? 0 : 1) + (feedSummary == null ? 0 : 1);
143
144                                                if(feedSummaryParameterCount == 0 || feedSummaryParameterCount == 2) {
145                                                    var coreControl = getCoreControl();
146                                                    MimeType feedSummaryMimeType = feedSummaryMimeTypeName == null? null: coreControl.getMimeTypeByName(feedSummaryMimeTypeName);
147
148                                                    if(feedSummaryMimeTypeName == null || feedSummaryMimeType != null) {
149                                                        ForumMimeType forumMimeType = feedSummaryMimeType == null? null: forumControl.getForumMimeType(forum, feedSummaryMimeType);
150
151                                                        if(feedSummaryMimeType == null || forumMimeType != null) {
152                                                            String summaryMimeTypeName = form.getSummaryMimeTypeName();
153                                                            String summary = form.getSummary();
154                                                            int summaryParameterCount = (summaryMimeTypeName == null ? 0 : 1) + (summary == null ? 0 : 1);
155
156                                                            if(summaryParameterCount == 0 || summaryParameterCount == 2) {
157                                                                MimeType summaryMimeType = summaryMimeTypeName == null? null: coreControl.getMimeTypeByName(summaryMimeTypeName);
158
159                                                                if(summaryMimeTypeName == null || summaryMimeType != null) {
160                                                                    forumMimeType = summaryMimeType == null? null: forumControl.getForumMimeType(forum, summaryMimeType);
161
162                                                                    if(summaryMimeType == null || forumMimeType != null) {
163                                                                        String contentMimeTypeName = form.getContentMimeTypeName();
164                                                                        MimeType contentMimeType = contentMimeTypeName == null? null: coreControl.getMimeTypeByName(contentMimeTypeName);
165
166                                                                        if(contentMimeType != null) {
167                                                                            forumMimeType = forumControl.getForumMimeType(forum, contentMimeType);
168
169                                                                            if(forumMimeType != null) {
170                                                                                String title = form.getTitle();
171                                                                                String rawPostedTime = form.getPostedTime();
172                                                                                Long postedTime = rawPostedTime == null? session.START_TIME_LONG: Long.valueOf(rawPostedTime);
173                                                                                var sortOrder = Integer.valueOf(form.getSortOrder());
174                                                                                String content = form.getContent();
175                                                                                BasePK createdBy = getPartyPK();
176
177                                                                                ForumThread forumThread = forumControl.createForumThread(forum, forumThreadIcon, postedTime, sortOrder, createdBy);
178                                                                                forumControl.createForumForumThread(forum, forumThread, Boolean.TRUE, 1, createdBy);
179                                                                                ForumMessageType forumMessageType = forumControl.getForumMessageTypeByName(ForumConstants.ForumMessageType_BLOG_ENTRY);
180                                                                                ForumMessage forumMessage = forumControl.createForumMessage(forumThread, forumMessageType, null, forumMessageIcon, postedTime, createdBy);
181                                                                                forumControl.createForumMessageRole(forumMessage, forumRoleType, party, createdBy);
182
183                                                                                ForumMessagePartType forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE);
184                                                                                ForumMessagePart forumMessagePart = forumControl.createForumMessagePart(forumMessage, forumMessagePartType, language, null, createdBy);
185                                                                                forumControl.createForumStringMessagePart(forumMessagePart, title, createdBy);
186
187                                                                                if(feedSummary != null) {
188                                                                                    forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_FEED_SUMMARY);
189                                                                                    forumMessagePart = forumControl.createForumMessagePart(forumMessage, forumMessagePartType, language, feedSummaryMimeType, createdBy);
190                                                                                    forumControl.createForumClobMessagePart(forumMessagePart, feedSummary, createdBy);
191                                                                                }
192
193                                                                                if(summary != null) {
194                                                                                    forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_SUMMARY);
195                                                                                    forumMessagePart = forumControl.createForumMessagePart(forumMessage, forumMessagePartType, language, summaryMimeType, createdBy);
196                                                                                    forumControl.createForumClobMessagePart(forumMessagePart, summary, createdBy);
197                                                                                }
198
199                                                                                forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT);
200                                                                                forumMessagePart = forumControl.createForumMessagePart(forumMessage, forumMessagePartType, language, contentMimeType, createdBy);
201                                                                                forumControl.createForumClobMessagePart(forumMessagePart, content, createdBy);
202
203                                                                                result.setForumThreadName(forumThread.getLastDetail().getForumThreadName());
204                                                                                result.setForumMessageName(forumMessage.getLastDetail().getForumMessageName());
205                                                                                result.setEntityRef(forumMessage.getPrimaryKey().getEntityRef());
206                                                                            } else {
207                                                                                addExecutionError(ExecutionErrors.UnknownForumMimeType.name());
208                                                                            }
209                                                                        } else {
210                                                                            addExecutionError(ExecutionErrors.UnknownContentMimeTypeName.name(), contentMimeTypeName);
211                                                                        }
212                                                                    } else {
213                                                                        addExecutionError(ExecutionErrors.UnknownForumMimeType.name());
214                                                                    }
215                                                                } else {
216                                                                    addExecutionError(ExecutionErrors.UnknownSummaryMimeTypeName.name(), summaryMimeTypeName);
217                                                                }
218                                                            } else {
219                                                                addExecutionError(ExecutionErrors.InvalidParameterCount.name());
220                                                            }
221                                                        } else {
222                                                            addExecutionError(ExecutionErrors.UnknownForumMimeType.name());
223                                                        }
224                                                    } else {
225                                                        addExecutionError(ExecutionErrors.UnknownFeedSummaryMimeTypeName.name(), feedSummaryMimeTypeName);
226                                                    }
227                                                } else {
228                                                    addExecutionError(ExecutionErrors.InvalidParameterCount.name());
229                                                }
230                                            }
231                                        } else {
232                                            addExecutionError(ExecutionErrors.UnknownForumMessageIconName.name(), forumMessageIconName);
233                                        }
234                                    }
235                                } else {
236                                    addExecutionError(ExecutionErrors.UnknownForumThreadIconName.name(), forumThreadIconName);
237                                }
238                            } else {
239                                addExecutionError(ExecutionErrors.UnknownLanguageIsoName.name(), languageIsoName);
240                            }
241                        }
242                    }
243                } else {
244                    addExecutionError(ExecutionErrors.InvalidForumType.name(), forumTypeName);
245                }
246            } else {
247                addExecutionError(ExecutionErrors.UnknownForumName.name(), forumName);
248            }
249        } else {
250            addExecutionError(ExecutionErrors.UnknownUsername.name(), username);
251        }
252        
253        return result;
254    }
255    
256}