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.form.CreateForumMessageAttachmentForm;
020import com.echothree.model.control.core.common.EntityAttributeTypes;
021import com.echothree.model.control.forum.server.control.ForumControl;
022import com.echothree.model.data.forum.server.entity.ForumMessageAttachment;
023import com.echothree.model.data.user.common.pk.UserVisitPK;
024import com.echothree.util.common.command.BaseResult;
025import com.echothree.util.common.message.ExecutionErrors;
026import com.echothree.util.common.validation.FieldDefinition;
027import com.echothree.util.common.validation.FieldType;
028import com.echothree.util.server.control.BaseSimpleCommand;
029import java.util.List;
030import javax.enterprise.context.Dependent;
031import javax.inject.Inject;
032
033@Dependent
034public class CreateForumMessageAttachmentCommand
035        extends BaseSimpleCommand<CreateForumMessageAttachmentForm> {
036    
037    private final static List<FieldDefinition> FORM_FIELD_DEFINITIONS;
038    
039    static {
040        FORM_FIELD_DEFINITIONS = List.of(
041                new FieldDefinition("ForumMessageName", FieldType.ENTITY_NAME, true, null, null),
042                new FieldDefinition("ForumMessageAttachmentSequence", FieldType.UNSIGNED_INTEGER, false, null, null),
043                new FieldDefinition("MimeTypeName", FieldType.MIME_TYPE, true, null, null),
044                new FieldDefinition("Clob", FieldType.STRING, false, 1L, null),
045                new FieldDefinition("String", FieldType.STRING, false, 1L, 512L)
046        );
047    }
048
049    @Inject
050    ForumControl forumControl;
051
052    
053    /** Creates a new instance of CreateForumMessageAttachmentCommand */
054    public CreateForumMessageAttachmentCommand() {
055        super(null, FORM_FIELD_DEFINITIONS, false);
056    }
057    
058    @Override
059    protected BaseResult execute() {
060        var forumMessageName = form.getForumMessageName();
061        var forumMessage = forumControl.getForumMessageByNameForUpdate(forumMessageName);
062
063        if(forumMessage != null) {
064            var mimeTypeName = form.getMimeTypeName();
065            var mimeType = mimeTypeControl.getMimeTypeByName(mimeTypeName);
066
067            if(mimeType != null) {
068                var entityAttributeTypeName = mimeType.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
069                var blob = form.getBlob();
070                var clob = form.getClob();
071
072                if(entityAttributeTypeName.equals(EntityAttributeTypes.BLOB.name()) && blob == null) {
073                    addExecutionError(ExecutionErrors.MissingBlob.name());
074                } else {
075                    if(entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name()) && clob == null) {
076                        addExecutionError(ExecutionErrors.MissingClob.name());
077                    }
078                }
079
080                if(!hasExecutionErrors()) {
081                    var partyPK = getPartyPK();
082                    var strForumMessageAttachmentSequence = form.getForumMessageAttachmentSequence();
083                    var forumMessageAttachmentSequence = strForumMessageAttachmentSequence == null ? null : Integer.valueOf(strForumMessageAttachmentSequence);
084                    ForumMessageAttachment forumMessageAttachment;
085                    var forumMessageStatus = forumControl.getOrCreateForumMessageStatusForUpdate(forumMessage);
086
087                    if(forumMessageAttachmentSequence == null) {
088                        forumMessageAttachmentSequence = forumMessageStatus.getForumMessageAttachmentSequence() + 1;
089                        forumMessageStatus.setForumMessageAttachmentSequence(forumMessageAttachmentSequence);
090                    } else {
091                        forumMessageAttachment = forumControl.getForumMessageAttachmentBySequence(forumMessage, forumMessageAttachmentSequence);
092
093                        if(forumMessageAttachment == null) {
094                            // If the forumMessageAttachmentSequence is > the last one that was recorded in the OrderStatus, jump the
095                            // one in OrderStatus forward - it should always record the greatest forumMessageAttachmentSequence used.
096                            if(forumMessageAttachmentSequence > forumMessageStatus.getForumMessageAttachmentSequence()) {
097                                forumMessageStatus.setForumMessageAttachmentSequence(forumMessageAttachmentSequence);
098                            }
099                        } else {
100                            addExecutionError(ExecutionErrors.DuplicateForumMessageAttachmentSequence.name(), forumMessageName, forumMessageAttachmentSequence.toString());
101                        }
102                    }
103
104                    forumMessageAttachment = forumControl.createForumMessageAttachment(forumMessage, forumMessageAttachmentSequence, mimeType, partyPK);
105
106                    if(entityAttributeTypeName.equals(EntityAttributeTypes.BLOB.name())) {
107                        forumControl.createForumMessageBlobAttachment(forumMessageAttachment, blob, partyPK);
108                    } else {
109                        if(entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name())) {
110                            forumControl.createForumMessageClobAttachment(forumMessageAttachment, clob, partyPK);
111                        }
112                    }
113                }
114            } else {
115                addExecutionError(ExecutionErrors.UnknownMimeTypeName.name(), mimeTypeName);
116            }
117        } else {
118            addExecutionError(ExecutionErrors.UnknownForumMessageName.name(), forumMessageName);
119        }
120        
121        return null;
122    }
123    
124}