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