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.content.server.eventbus;
018
019import com.echothree.model.control.content.server.control.ContentControl;
020import com.echothree.model.control.core.common.EventTypes;
021import com.echothree.model.control.core.server.control.EventControl;
022import com.echothree.model.control.core.server.eventbus.BaseEventSubscriber;
023import com.echothree.model.control.core.server.eventbus.Function5Arity;
024import com.echothree.model.control.core.server.eventbus.SentEvent;
025import com.echothree.model.control.core.server.eventbus.SentEventSubscriber;
026import com.echothree.model.control.inventory.server.control.InventoryControl;
027import com.echothree.model.control.item.server.control.ItemControl;
028import com.echothree.model.control.uom.server.control.UomControl;
029import com.echothree.model.data.content.common.ContentCatalogConstants;
030import com.echothree.model.data.content.common.ContentCategoryConstants;
031import com.echothree.model.data.core.server.entity.EntityInstance;
032import com.echothree.model.data.core.server.entity.Event;
033import com.echothree.model.data.inventory.common.InventoryConditionConstants;
034import com.echothree.model.data.item.common.ItemConstants;
035import com.echothree.model.data.uom.common.UnitOfMeasureTypeConstants;
036import com.echothree.util.server.persistence.PersistenceUtils;
037import com.echothree.util.server.persistence.Session;
038import com.google.common.eventbus.Subscribe;
039
040@SentEventSubscriber
041public class ContentCatalogItemModificationSubscriber
042        extends BaseEventSubscriber {
043
044    @Subscribe
045    public void receiveSentEventForContentCategories(SentEvent se) {
046        decodeEventAndApply(se, touchContentCatalogItemsIfContentCategory);
047    }
048
049    private static final Function5Arity<Event, EntityInstance, EventTypes, String, String>
050            touchContentCatalogItemsIfContentCategory = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> {
051        if(ContentCategoryConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName)
052                && ContentCategoryConstants.ENTITY_TYPE_NAME.equals(entityTypeName)
053                && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) {
054            var eventControl = Session.getModelController(EventControl.class);
055            var contentControl = Session.getModelController(ContentControl.class);
056            var contentCategory = contentControl.getContentCategoryByEntityInstance(entityInstance);
057            var contentCategoryItems = contentControl.getContentCategoryItemsByContentCategory(contentCategory);
058
059            for(var contentCategoryItem : contentCategoryItems) {
060                var contentCatalogItem = contentCategoryItem.getContentCatalogItem();
061
062                eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH,
063                        contentCategory.getPrimaryKey(), eventType,
064                        PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy()));
065            }
066        }
067    };
068
069    @Subscribe
070    public void receiveSentEventForContentCatalogs(SentEvent se) {
071        decodeEventAndApply(se, touchContentCatalogItemsIfContentCatalog);
072    }
073
074    private static final Function5Arity<Event, EntityInstance, EventTypes, String, String>
075            touchContentCatalogItemsIfContentCatalog = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> {
076        if(ContentCatalogConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName)
077                && ContentCatalogConstants.ENTITY_TYPE_NAME.equals(entityTypeName)
078                && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) {
079            var eventControl = Session.getModelController(EventControl.class);
080            var contentControl = Session.getModelController(ContentControl.class);
081            var contentCatalog = contentControl.getContentCatalogByEntityInstance(entityInstance);
082            var contentCatalogItems = contentControl.getContentCatalogItemsByContentCatalog(contentCatalog);
083
084            for(var contentCatalogItem : contentCatalogItems) {
085                eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH,
086                        contentCatalog.getPrimaryKey(), eventType,
087                        PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy()));
088            }
089        }
090    };
091
092    @Subscribe
093    public void receiveSentEventForItems(SentEvent se) {
094        decodeEventAndApply(se, touchContentCatalogItemsIfItem);
095    }
096
097    private static final Function5Arity<Event, EntityInstance, EventTypes, String, String>
098            touchContentCatalogItemsIfItem = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> {
099        if(ItemConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName)
100                && ItemConstants.ENTITY_TYPE_NAME.equals(entityTypeName)
101                && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) {
102            var eventControl = Session.getModelController(EventControl.class);
103            var itemControl = Session.getModelController(ItemControl.class);
104            var contentControl = Session.getModelController(ContentControl.class);
105            var item = itemControl.getItemByEntityInstance(entityInstance);
106            var contentCatalogItems = contentControl.getContentCatalogItemsByItem(item);
107
108            for(var contentCatalogItem : contentCatalogItems) {
109                eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH,
110                        item.getPrimaryKey(), eventType,
111                        PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy()));
112            }
113        }
114    };
115
116    @Subscribe
117    public void receiveSentEventForInventoryConditions(SentEvent se) {
118        decodeEventAndApply(se, touchContentCatalogInventoryConditionsIfInventoryCondition);
119    }
120
121    private static final Function5Arity<Event, EntityInstance, EventTypes, String, String>
122            touchContentCatalogInventoryConditionsIfInventoryCondition = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> {
123        if(InventoryConditionConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName)
124                && InventoryConditionConstants.ENTITY_TYPE_NAME.equals(entityTypeName)
125                && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) {
126            var eventControl = Session.getModelController(EventControl.class);
127            var inventoryControl = Session.getModelController(InventoryControl.class);
128            var contentControl = Session.getModelController(ContentControl.class);
129            var inventoryCondition = inventoryControl.getInventoryConditionByEntityInstance(entityInstance);
130            var contentCatalogItems = contentControl.getContentCatalogItemsByInventoryCondition(inventoryCondition);
131
132            for(var contentCatalogItem : contentCatalogItems) {
133                eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH,
134                        inventoryCondition.getPrimaryKey(), eventType,
135                        PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy()));
136            }
137        }
138    };
139
140    @Subscribe
141    public void receiveSentEventForUnitOfMeasureTypes(SentEvent se) {
142        decodeEventAndApply(se, touchContentCatalogUnitOfMeasureTypesIfUnitOfMeasureType);
143    }
144
145    private static final Function5Arity<Event, EntityInstance, EventTypes, String, String>
146            touchContentCatalogUnitOfMeasureTypesIfUnitOfMeasureType = (event, entityInstance, eventType, componentVendorName, entityTypeName) -> {
147        if(UnitOfMeasureTypeConstants.COMPONENT_VENDOR_NAME.equals(componentVendorName)
148                && UnitOfMeasureTypeConstants.ENTITY_TYPE_NAME.equals(entityTypeName)
149                && (eventType == EventTypes.MODIFY || eventType == EventTypes.TOUCH)) {
150            var eventControl = Session.getModelController(EventControl.class);
151            var uomControl = Session.getModelController(UomControl.class);
152            var contentControl = Session.getModelController(ContentControl.class);
153            var unitOfMeasureType = uomControl.getUnitOfMeasureTypeByEntityInstance(entityInstance);
154            var contentCatalogItems = contentControl.getContentCatalogItemsByUnitOfMeasureType(unitOfMeasureType);
155
156            for(var contentCatalogItem : contentCatalogItems) {
157                eventControl.sendEvent(contentCatalogItem.getPrimaryKey(), EventTypes.TOUCH,
158                        unitOfMeasureType.getPrimaryKey(), eventType,
159                        PersistenceUtils.getInstance().getBasePKFromEntityInstance(event.getCreatedBy()));
160            }
161        }
162    };
163
164}