ArchiveWarehouseUseCase.java

package com.fulfilment.application.monolith.warehouses.domain.usecases;

import com.fulfilment.application.monolith.warehouses.domain.models.Warehouse;
import com.fulfilment.application.monolith.warehouses.domain.ports.ArchiveWarehouseOperation;
import com.fulfilment.application.monolith.warehouses.domain.ports.WarehouseStore;
import jakarta.enterprise.context.ApplicationScoped;
import com.fulfilment.application.monolith.exception.HttpStatus;
import jakarta.ws.rs.WebApplicationException;
import java.time.LocalDateTime;
import org.jboss.logging.Logger;

@ApplicationScoped
public class ArchiveWarehouseUseCase implements ArchiveWarehouseOperation {

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

  private final WarehouseStore warehouseStore;

  public ArchiveWarehouseUseCase(WarehouseStore warehouseStore) {
    this.warehouseStore = warehouseStore;
  }

  @Override
  public void archive(Warehouse warehouse) {
    LOGGER.debugf("Attempting to archive warehouse '%s'", warehouse.businessUnitCode);

    // Guard: warehouse must not already be archived
    if (warehouse.archivedAt != null) {
      LOGGER.warnf("Warehouse '%s' is already archived at %s",
          warehouse.businessUnitCode, warehouse.archivedAt);
      throw new WebApplicationException(
          "Warehouse '" + warehouse.businessUnitCode + "' is already archived.", HttpStatus.UNPROCESSABLE_ENTITY);
    }

    // Soft delete — set archivedAt timestamp, do NOT physically delete the record
    warehouse.archivedAt = LocalDateTime.now();
    warehouseStore.update(warehouse);

    LOGGER.infof("Warehouse '%s' archived successfully at %s",
        warehouse.businessUnitCode, warehouse.archivedAt);
  }
}