StoreEventObserver.java

package com.fulfilment.application.monolith.stores;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.event.TransactionPhase;
import jakarta.inject.Inject;
import org.jboss.logging.Logger;

@ApplicationScoped
public class StoreEventObserver {

  private static final Logger LOGGER = Logger.getLogger(StoreEventObserver.class.getName());

  @Inject LegacyStoreManagerGateway legacyStoreManagerGateway;

  public void onStoreChanged(@Observes(during = TransactionPhase.AFTER_SUCCESS) StoreChangedEvent event) {
    try {
      switch (event.type()) {
        case CREATED -> legacyStoreManagerGateway.createStoreOnLegacySystem(event.store());
        case UPDATED -> legacyStoreManagerGateway.updateStoreOnLegacySystem(event.store());
        case DELETED -> LOGGER.infof("Store '%s' deleted — no legacy notification required", event.store().name);
      }
    } catch (Exception e) {
      // Log but do not rethrow — transaction is already committed at this point
      LOGGER.errorf("Failed to notify legacy system after store %s: %s", event.type(), e.getMessage());
    }
  }
}