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.rating.server.command; 018 019import com.echothree.control.user.rating.common.form.CreateRatingForm; 020import com.echothree.control.user.rating.common.result.RatingResultFactory; 021import com.echothree.model.control.core.server.control.EntityInstanceControl; 022import com.echothree.model.control.rating.server.control.RatingControl; 023import com.echothree.model.control.sequence.common.SequenceTypes; 024import com.echothree.model.control.sequence.server.control.SequenceControl; 025import com.echothree.model.control.sequence.server.logic.SequenceGeneratorLogic; 026import com.echothree.model.data.core.server.entity.EntityInstance; 027import com.echothree.model.data.user.common.pk.UserVisitPK; 028import com.echothree.util.common.command.BaseResult; 029import com.echothree.util.common.message.ExecutionErrors; 030import com.echothree.util.common.persistence.BasePK; 031import com.echothree.util.common.validation.FieldDefinition; 032import com.echothree.util.common.validation.FieldType; 033import com.echothree.util.server.control.BaseSimpleCommand; 034import java.util.List; 035import javax.enterprise.context.Dependent; 036import javax.inject.Inject; 037 038@Dependent 039public class CreateRatingCommand 040 extends BaseSimpleCommand<CreateRatingForm> { 041 042 private final static List<FieldDefinition> FORM_FIELD_DEFINITIONS; 043 044 static { 045 FORM_FIELD_DEFINITIONS = List.of( 046 new FieldDefinition("RatedByUsername", FieldType.STRING, false, 1L, 80L), 047 new FieldDefinition("EntityRef", FieldType.ENTITY_REF, true, null, null), 048 new FieldDefinition("RatingTypeName", FieldType.ENTITY_NAME, true, null, null), 049 new FieldDefinition("RatingTypeListItemName", FieldType.ENTITY_NAME, true, null, null) 050 ); 051 } 052 053 @Inject 054 EntityInstanceControl entityInstanceControl; 055 056 @Inject 057 RatingControl ratingControl; 058 059 @Inject 060 SequenceControl sequenceControl; 061 062 @Inject 063 SequenceGeneratorLogic sequenceGeneratorLogic; 064 065 066 /** Creates a new instance of CreateRatingCommand */ 067 public CreateRatingCommand() { 068 super(null, FORM_FIELD_DEFINITIONS, false); 069 } 070 071 @Override 072 protected BaseResult execute() { 073 var result = RatingResultFactory.getCreateRatingResult(); 074 String ratingName = null; 075 var entityRef = form.getEntityRef(); 076 var ratedEntityInstance = entityInstanceControl.getEntityInstanceByEntityRef(entityRef); 077 078 if(ratedEntityInstance != null) { 079 EntityInstance ratedByEntityInstance = null; 080 BasePK createdBy = getPartyPK(); 081 var ratedByUsername = form.getRatedByUsername(); 082 083 if(ratedByUsername != null) { 084 var userLogin = userControl.getUserLoginByUsername(ratedByUsername); 085 086 if(userLogin != null) { 087 ratedByEntityInstance = entityInstanceControl.getEntityInstanceByBasePK(userLogin.getPartyPK()); 088 } else { 089 addExecutionError(ExecutionErrors.UnknownRatedByUsername.name(), ratedByUsername); 090 } 091 } else { 092 ratedByEntityInstance = entityInstanceControl.getEntityInstanceByBasePK(createdBy); 093 } 094 095 if(!hasExecutionErrors()) { 096 var rating = ratingControl.getRating(ratedEntityInstance, ratedByEntityInstance); 097 098 if(rating == null) { 099 var ratingTypeName = form.getRatingTypeName(); 100 var ratingType = ratingControl.getRatingTypeByName(ratedEntityInstance.getEntityType(), 101 ratingTypeName); 102 103 if(ratingType != null) { 104 var ratingTypeListItemName = form.getRatingTypeListItemName(); 105 var ratingTypeListItem = ratingControl.getRatingTypeListItemByName(ratingType, ratingTypeListItemName); 106 107 if(ratingTypeListItem != null) { 108 var ratingSequence = ratingType.getLastDetail().getRatingSequence(); 109 110 if(ratingSequence == null) { 111 ratingSequence = sequenceControl.getDefaultSequenceUsingNames(SequenceTypes.RATING.name()); 112 } 113 114 ratingName = sequenceGeneratorLogic.getNextSequenceValue(ratingSequence); 115 116 ratingControl.createRating(ratingName, ratingTypeListItem, ratedEntityInstance, ratedByEntityInstance, 117 createdBy); 118 } else { 119 addExecutionError(ExecutionErrors.UnknownRatingTypeListItemName.name(), ratingTypeListItemName); 120 } 121 } else { 122 addExecutionError(ExecutionErrors.UnknownRatingTypeName.name(), ratingTypeName); 123 } 124 } else { 125 addExecutionError(ExecutionErrors.DuplicateRating.name()); 126 } 127 } 128 } else { 129 addExecutionError(ExecutionErrors.UnknownEntityRef.name(), entityRef); 130 } 131 132 result.setRatingName(ratingName); 133 134 return result; 135 } 136 137}