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);
}
}