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.model.control.search.server.logic;
018
019import com.echothree.control.user.search.common.spec.SearchSortOrderUniversalSpec;
020import com.echothree.model.control.core.common.ComponentVendors;
021import com.echothree.model.control.core.common.EntityTypes;
022import com.echothree.model.control.core.common.exception.InvalidParameterCountException;
023import com.echothree.model.control.core.server.logic.EntityInstanceLogic;
024import com.echothree.model.control.search.common.exception.DuplicateSearchSortOrderNameException;
025import com.echothree.model.control.search.common.exception.UnknownDefaultSearchKindException;
026import com.echothree.model.control.search.common.exception.UnknownDefaultSearchSortOrderException;
027import com.echothree.model.control.search.common.exception.UnknownSearchSortOrderNameException;
028import com.echothree.model.control.search.server.control.SearchControl;
029import com.echothree.model.data.party.server.entity.Language;
030import com.echothree.model.data.search.server.entity.SearchKind;
031import com.echothree.model.data.search.server.entity.SearchSortOrder;
032import com.echothree.util.common.message.ExecutionErrors;
033import com.echothree.util.common.persistence.BasePK;
034import com.echothree.util.server.control.BaseLogic;
035import com.echothree.util.server.message.ExecutionErrorAccumulator;
036import com.echothree.util.server.persistence.EntityPermission;
037import com.echothree.util.server.persistence.Session;
038import com.echothree.util.server.validation.ParameterUtils;
039import javax.enterprise.context.ApplicationScoped;
040import javax.enterprise.inject.spi.CDI;
041
042@ApplicationScoped
043public class SearchSortOrderLogic
044        extends BaseLogic {
045
046    protected SearchSortOrderLogic() {
047        super();
048    }
049
050    public static SearchSortOrderLogic getInstance() {
051        return CDI.current().select(SearchSortOrderLogic.class).get();
052    }
053
054    public SearchSortOrder createSearchSortOrder(final ExecutionErrorAccumulator eea, final String searchKindName, final String searchSortOrderName,
055            final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) {
056        var searchKind = SearchKindLogic.getInstance().getSearchKindByName(eea, searchKindName);
057        SearchSortOrder searchSortOrder = null;
058
059        if(eea == null || !eea.hasExecutionErrors()) {
060            searchSortOrder = createSearchSortOrder(eea, searchKind, searchSortOrderName, isDefault, sortOrder, language, description, createdBy);
061        }
062
063        return searchSortOrder;
064    }
065
066    public SearchSortOrder createSearchSortOrder(final ExecutionErrorAccumulator eea, final SearchKind searchKind, final String searchSortOrderName,
067            final Boolean isDefault, final Integer sortOrder, final Language language, final String description, final BasePK createdBy) {
068        var searchControl = Session.getModelController(SearchControl.class);
069        var searchSortOrder = searchControl.getSearchSortOrderByName(searchKind, searchSortOrderName);
070
071        if(searchSortOrder == null) {
072            searchSortOrder = searchControl.createSearchSortOrder(searchKind, searchSortOrderName, isDefault, sortOrder, createdBy);
073
074            if(description != null) {
075                searchControl.createSearchSortOrderDescription(searchSortOrder, language, description, createdBy);
076            }
077        } else {
078            handleExecutionError(DuplicateSearchSortOrderNameException.class, eea, ExecutionErrors.DuplicateSearchSortOrderName.name(), searchSortOrderName);
079        }
080        return searchSortOrder;
081    }
082
083    public SearchSortOrder getSearchSortOrderByName(final ExecutionErrorAccumulator eea, final SearchKind searchKind, final String searchSortOrderName,
084            final EntityPermission entityPermission) {
085        var searchControl = Session.getModelController(SearchControl.class);
086        var searchSortOrder = searchControl.getSearchSortOrderByName(searchKind, searchSortOrderName, entityPermission);
087
088        if(searchSortOrder == null) {
089            handleExecutionError(UnknownSearchSortOrderNameException.class, eea, ExecutionErrors.UnknownSearchSortOrderName.name(),
090                    searchKind.getLastDetail().getSearchKindName(), searchSortOrderName);
091        }
092
093        return searchSortOrder;
094    }
095
096    public SearchSortOrder getSearchSortOrderByName(final ExecutionErrorAccumulator eea, final SearchKind searchKind, final String searchSortOrderName) {
097        return getSearchSortOrderByName(eea, searchKind, searchSortOrderName, EntityPermission.READ_ONLY);
098    }
099
100    public SearchSortOrder getSearchSortOrderByNameForUpdate(final ExecutionErrorAccumulator eea, final SearchKind searchKind, final String searchSortOrderName) {
101        return getSearchSortOrderByName(eea, searchKind, searchSortOrderName, EntityPermission.READ_WRITE);
102    }
103
104    public SearchSortOrder getSearchSortOrderByName(final ExecutionErrorAccumulator eea, final String searchKindName, final String searchSortOrderName,
105            final EntityPermission entityPermission) {
106        var searchKind = SearchKindLogic.getInstance().getSearchKindByName(eea, searchKindName);
107        SearchSortOrder searchSortOrder = null;
108
109        if(!eea.hasExecutionErrors()) {
110            searchSortOrder = getSearchSortOrderByName(eea, searchKind, searchSortOrderName, entityPermission);
111        }
112
113        return searchSortOrder;
114    }
115
116    public SearchSortOrder getSearchSortOrderByName(final ExecutionErrorAccumulator eea, final String searchKindName, final String searchSortOrderName) {
117        return getSearchSortOrderByName(eea, searchKindName, searchSortOrderName, EntityPermission.READ_ONLY);
118    }
119
120    public SearchSortOrder getSearchSortOrderByNameForUpdate(final ExecutionErrorAccumulator eea, final String searchKindName, final String searchSortOrderName) {
121        return getSearchSortOrderByName(eea, searchKindName, searchSortOrderName, EntityPermission.READ_WRITE);
122    }
123
124    public SearchSortOrder getSearchSortOrderByUniversalSpec(final ExecutionErrorAccumulator eea, final SearchSortOrderUniversalSpec universalSpec,
125            final boolean allowDefault, final EntityPermission entityPermission) {
126        var searchControl = Session.getModelController(SearchControl.class);
127        var searchKindName = universalSpec.getSearchKindName();
128        var searchSortOrderName = universalSpec.getSearchSortOrderName();
129        var nameParameterCount= ParameterUtils.getInstance().countNonNullParameters(searchKindName, searchSortOrderName);
130        var possibleEntitySpecs= EntityInstanceLogic.getInstance().countPossibleEntitySpecs(universalSpec);
131        SearchSortOrder searchSortOrder = null;
132
133        if(nameParameterCount < 3 && possibleEntitySpecs == 0) {
134            SearchKind searchKind = null;
135
136            if(searchKindName == null) {
137                if(allowDefault) {
138                    searchKind = searchControl.getDefaultSearchKind();
139
140                    if(searchKind == null) {
141                        handleExecutionError(UnknownDefaultSearchKindException.class, eea, ExecutionErrors.UnknownDefaultSearchKind.name());
142                    }
143                } else {
144                    handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
145                }
146            } else {
147                searchKind = SearchKindLogic.getInstance().getSearchKindByName(eea, searchKindName);
148            }
149
150            if(!eea.hasExecutionErrors()) {
151                if(searchSortOrderName == null) {
152                    if(allowDefault) {
153                        searchSortOrder = searchControl.getDefaultSearchSortOrder(searchKind, entityPermission);
154
155                        if(searchSortOrder == null) {
156                            handleExecutionError(UnknownDefaultSearchSortOrderException.class, eea, ExecutionErrors.UnknownDefaultSearchSortOrder.name());
157                        }
158                    } else {
159                        handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
160                    }
161                } else {
162                    searchSortOrder = getSearchSortOrderByName(eea, searchKind, searchSortOrderName, entityPermission);
163                }
164            }
165        } else if(nameParameterCount == 0 && possibleEntitySpecs == 1) {
166            var entityInstance = EntityInstanceLogic.getInstance().getEntityInstance(eea, universalSpec,
167                    ComponentVendors.ECHO_THREE.name(), EntityTypes.SearchSortOrder.name());
168
169            if(!eea.hasExecutionErrors()) {
170                searchSortOrder = searchControl.getSearchSortOrderByEntityInstance(entityInstance, entityPermission);
171            }
172        } else {
173            handleExecutionError(InvalidParameterCountException.class, eea, ExecutionErrors.InvalidParameterCount.name());
174        }
175
176        return searchSortOrder;
177    }
178
179    public SearchSortOrder getSearchSortOrderByUniversalSpec(final ExecutionErrorAccumulator eea, final SearchSortOrderUniversalSpec universalSpec,
180            boolean allowDefault) {
181        return getSearchSortOrderByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_ONLY);
182    }
183
184    public SearchSortOrder getSearchSortOrderByUniversalSpecForUpdate(final ExecutionErrorAccumulator eea, final SearchSortOrderUniversalSpec universalSpec,
185            boolean allowDefault) {
186        return getSearchSortOrderByUniversalSpec(eea, universalSpec, allowDefault, EntityPermission.READ_WRITE);
187    }
188
189    public void deleteSearchSortOrder(final ExecutionErrorAccumulator eea, final SearchSortOrder searchSortOrder,
190            final BasePK deletedBy) {
191        var searchControl = Session.getModelController(SearchControl.class);
192
193        searchControl.deleteSearchSortOrder(searchSortOrder, deletedBy);
194    }
195}