diff --git a/shipping/pom.xml b/shipping/pom.xml index b5f8b691..ae90544c 100755 --- a/shipping/pom.xml +++ b/shipping/pom.xml @@ -66,16 +66,27 @@ io.quarkus quarkus-hibernate-validator + + io.quarkus + quarkus-scheduler + io.quarkus quarkus-junit5 test - io.rest-assured - rest-assured + io.rest-assured + rest-assured + test + + + org.assertj + assertj-core + 3.24.2 test + diff --git a/shipping/src/main/java/org/shipping/api/ShippingResource.java b/shipping/src/main/java/org/shipping/api/ShippingResource.java index e23d4765..bdc03a13 100755 --- a/shipping/src/main/java/org/shipping/api/ShippingResource.java +++ b/shipping/src/main/java/org/shipping/api/ShippingResource.java @@ -51,7 +51,7 @@ public Response createShipment(@Valid ShipmentDTO shipmentDTO) { return Response.status(Status.NOT_FOUND).entity(e.getMessage()).build(); } catch (Exception e) { logger.error("Unexpected error occurred during shipment creation: " + e.getMessage(), e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Error creating shipment").build(); } } @@ -87,6 +87,12 @@ public Response updateShipment(@PathParam("orderId") UUID orderId, @Valid Shipme try { logger.info("Updating shipment for Order ID: " + orderId); + Shipment shipment = shippingService.getShipmentByOrderId(orderId); + if (shipment.getStatus() == DeliveryStatus.DELIVERED) { + logger.error("Cannot update a delivered shipment"); + return Response.status(Response.Status.BAD_REQUEST).entity("Cannot update a delivered shipment").build(); + } + Shipment updatedShipment = shippingService.updateShipment( orderId, shipmentDTO.getDeliveryDate(), @@ -141,7 +147,7 @@ public Response getUserShipmentHistory(@QueryParam("status") DeliveryStatus stat if (shipments.isEmpty()) { logger.warn("No shipments found for user with status: " + status); - return Response.status(Response.Status.NOT_FOUND).entity("No shipments found").build(); + return Response.status(Response.Status.NOT_FOUND).entity("No shipments found for the given status").build(); } return Response.ok(shipments).build(); @@ -162,16 +168,26 @@ public Response deleteShipment(@PathParam("shipmentId") UUID shipmentId) { try { logger.info("Deleting shipment with ID: " + shipmentId); + // Vérification de la livraison + Shipment shipment = shippingService.getShipmentById(shipmentId); + if (shipment == null) { + logger.error("No shipment found with ID: " + shipmentId); + return Response.status(Response.Status.NOT_FOUND).entity("Shipment not found").build(); + } + + // Vérification du statut + if (shipment.getStatus() == DeliveryStatus.DELIVERED) { + logger.error("Cannot delete a delivered shipment"); + return Response.status(Response.Status.BAD_REQUEST).entity("Cannot delete a delivered shipment").build(); + } + shippingService.deleteShipment(shipmentId); logger.info("Shipment deleted successfully with ID: " + shipmentId); return Response.noContent().build(); - } catch (NoResultException e) { - logger.error("NoResultException: " + e.getMessage()); - return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build(); } catch (Exception e) { logger.error("Unexpected error occurred while deleting shipment: " + e.getMessage(), e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Error deleting shipment").build(); } } } diff --git a/shipping/src/main/java/org/shipping/config/EventMappingConfig.java b/shipping/src/main/java/org/shipping/config/EventMappingConfig.java new file mode 100644 index 00000000..068c4329 --- /dev/null +++ b/shipping/src/main/java/org/shipping/config/EventMappingConfig.java @@ -0,0 +1,38 @@ +package org.shipping.config; + +import jakarta.enterprise.context.ApplicationScoped; +import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.config.ConfigProvider; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@ApplicationScoped +public class EventMappingConfig { + + private final Map eventMappings = new HashMap<>(); + + public EventMappingConfig() { + Config config = ConfigProvider.getConfig(); + config.getPropertyNames() + .forEach(property -> { + if (property.startsWith("event.mapping.")) { + String uuidString = property.replace("event.mapping.", ""); + String status = config.getValue(property, String.class); + eventMappings.put(UUID.fromString(uuidString), status); + } + }); + } + + public String getDeliveryStatus(String eventType) { + try { + // Convert the eventType string to UUID + UUID eventTypeUUID = UUID.fromString(eventType); + return eventMappings.get(eventTypeUUID); // Return status if found + } catch (IllegalArgumentException e) { + // Handle invalid UUID format, log or return a default value + return null; + } + } +} diff --git a/shipping/src/main/java/org/shipping/exception/AddressNotFoundException.java b/shipping/src/main/java/org/shipping/exception/AddressNotFoundException.java new file mode 100644 index 00000000..9f9eee4f --- /dev/null +++ b/shipping/src/main/java/org/shipping/exception/AddressNotFoundException.java @@ -0,0 +1,7 @@ +package org.shipping.exception; + +public class AddressNotFoundException extends RuntimeException { + public AddressNotFoundException(String message) { + super(message); + } +} diff --git a/shipping/src/main/java/org/shipping/exception/OrderAlreadyAssociatedException.java b/shipping/src/main/java/org/shipping/exception/OrderAlreadyAssociatedException.java new file mode 100644 index 00000000..30ee0758 --- /dev/null +++ b/shipping/src/main/java/org/shipping/exception/OrderAlreadyAssociatedException.java @@ -0,0 +1,7 @@ +package org.shipping.exception; + +public class OrderAlreadyAssociatedException extends RuntimeException { + public OrderAlreadyAssociatedException(String message) { + super(message); + } +} diff --git a/shipping/src/main/java/org/shipping/messaging/OutboxEventPublisher.java b/shipping/src/main/java/org/shipping/messaging/OutboxEventPublisher.java new file mode 100644 index 00000000..da41ed0f --- /dev/null +++ b/shipping/src/main/java/org/shipping/messaging/OutboxEventPublisher.java @@ -0,0 +1,66 @@ +package org.shipping.messaging; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import org.shipping.config.EventMappingConfig; +import org.shipping.model.OutboxEvent; +import org.shipping.model.DeliveryStatus; +import org.shipping.repository.OutboxRepository; + +import io.quarkus.scheduler.Scheduled; +import org.jboss.logging.Logger; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class OutboxEventPublisher { + + private static final Logger logger = Logger.getLogger(OutboxEventPublisher.class); + + @Inject + OutboxRepository outboxRepository; + + @Inject + DeliveryStatusPublisher deliveryStatusPublisher; + + @Inject + EventMappingConfig eventMappingConfig; + + @Scheduled(every = "60s") + public void processOutbox() { + // Récupération des événements non traités + List events = outboxRepository.find("processed = 'false'").list(); + + for (OutboxEvent event : events) { + try { + // Extraction du type d'événement + String eventType = event.getEventType(); + String statusName = eventMappingConfig.getDeliveryStatus(eventType); + + if (statusName != null) { + // Conversion du statut et publication + DeliveryStatus status = DeliveryStatus.valueOf(statusName); + deliveryStatusPublisher.publishStatus(UUID.fromString(event.getPayload()), status); + + // Journaux pour le débogage + logger.infof("Traitement de l'événement %s avec le type %s", event.getId(), event.getEventType()); + logger.infof("Statut publié : %s", statusName); + + // Marquage de l'événement comme traité + event.setProcessed("true"); + outboxRepository.persist(event); + logger.info("L'événement a été marqué comme traité."); + } else { + // Aucun mappage trouvé + logger.warnf("Aucun mappage trouvé pour le type d'événement : %s", eventType); + } + } catch (Exception e) { + // Gestion des erreurs + logger.errorf("Erreur lors du traitement de l'événement %s : %s", event.getId(), e.getMessage()); + e.printStackTrace(); + } + } + } +} diff --git a/shipping/src/main/java/org/shipping/messaging/Scheduled.java b/shipping/src/main/java/org/shipping/messaging/Scheduled.java new file mode 100644 index 00000000..042f1792 --- /dev/null +++ b/shipping/src/main/java/org/shipping/messaging/Scheduled.java @@ -0,0 +1,5 @@ +package org.shipping.messaging; + +public @interface Scheduled { + +} diff --git a/shipping/src/main/java/org/shipping/model/EventTypeMapper.java b/shipping/src/main/java/org/shipping/model/EventTypeMapper.java new file mode 100644 index 00000000..b7675c4d --- /dev/null +++ b/shipping/src/main/java/org/shipping/model/EventTypeMapper.java @@ -0,0 +1,22 @@ +package org.shipping.model; + +import java.util.HashMap; +import java.util.Map; + +public class EventTypeMapper { + // Dictionnaire pour mappage d'événements + private static final Map eventTypes = new HashMap<>(); + + static { + // Vous pouvez ajouter autant d'événements que vous le souhaitez + eventTypes.put("SHIPPING_CREATED", "shipping.created"); + eventTypes.put("SHIPPING_UPDATED", "shipping.updated"); + eventTypes.put("SHIPPING_DELETED", "shipping.deleted"); + // Vous pouvez ajouter d'autres événements ici + } + + // Récupère le type d'événement en fonction du nom + public static String getEventType(String eventType) { + return eventTypes.getOrDefault(eventType, "unknown.event"); + } +} diff --git a/shipping/src/main/java/org/shipping/model/OutboxEvent.java b/shipping/src/main/java/org/shipping/model/OutboxEvent.java new file mode 100644 index 00000000..508f9bb8 --- /dev/null +++ b/shipping/src/main/java/org/shipping/model/OutboxEvent.java @@ -0,0 +1,68 @@ +package org.shipping.model; + + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import java.util.UUID; + +@Entity +public class OutboxEvent { + + @Id + private UUID id; + private UUID aggregateId; + private String eventType; + private String payload; + private String processed ; + + public OutboxEvent() { + } + + public OutboxEvent(UUID id, UUID aggregateId, String eventType, String payload, String processed) { + this.id = id; + this.aggregateId = aggregateId; + this.eventType = eventType; + this.payload = payload; + this.processed = processed; + } + + public OutboxEvent(UUID aggregateId, String eventType, String payload, String processed) { + this.aggregateId = aggregateId; + this.eventType = eventType; + this.payload = payload; + this.processed = processed; + } + + public UUID getId() { + return id; + } + public void setId(UUID id) { + this.id = id; + } + public UUID getAggregateId() { + return aggregateId; + } + public void setAggregateId(UUID aggregateId) { + this.aggregateId = aggregateId; + } + public String getEventType() { + return eventType; + } + public void setEventType(String eventType) { + this.eventType = eventType; + } + public String getPayload() { + return payload; + } + public void setPayload(String payload) { + this.payload = payload; + } + public String isProcessed() { + return processed; + } + public void setProcessed(String processed) { + this.processed = processed; + } + + +} diff --git a/shipping/src/main/java/org/shipping/model/Shipment.java b/shipping/src/main/java/org/shipping/model/Shipment.java index 467e2fc9..bb398994 100755 --- a/shipping/src/main/java/org/shipping/model/Shipment.java +++ b/shipping/src/main/java/org/shipping/model/Shipment.java @@ -18,34 +18,50 @@ @Entity @Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "orderId" }) }) public class Shipment { + @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID shipmentId; @Column(nullable = false, updatable = false) - private UUID orderId; // Identifiant de la commande associée + private UUID orderId; @Column(nullable = false, updatable = false) - private LocalDateTime createdDate = LocalDateTime.now(); // Date de création + private LocalDateTime createdDate; + + private LocalDateTime deliveryDate; + + @ManyToOne + @JoinColumn(name = "addressId", referencedColumnName = "id") + private Address address; - private LocalDateTime deliveryDate = LocalDateTime.now().plusDays(2); // Date de livraison prévue/effective - @ManyToOne(optional = false) - @JoinColumn(name = "addressId", referencedColumnName = "addressId", nullable = false) - private Address deliveryAddress; // Relation avec l’entité Address + private Address deliveryAddress; + // Ajouter addressId en tant que UUID pour utiliser explicitement la colonne + @Column(name = "addressId", insertable = false, updatable = false) + private UUID addressId; @Enumerated(EnumType.STRING) @Column(nullable = false) - private DeliveryStatus status = DeliveryStatus.PENDING; // Statut de la livraison + private DeliveryStatus status; // Constructeur sans paramètres public Shipment() { + this.createdDate = LocalDateTime.now(); + this.deliveryDate = LocalDateTime.now().plusDays(2); + this.status = DeliveryStatus.PENDING; } + + // Constructeur avec paramètres - public Shipment(UUID orderId, Address deliveryAddress) { + public Shipment(UUID orderId, Address deliveryAddress, LocalDateTime createdDate, LocalDateTime deliveryDate) { this.orderId = orderId; this.deliveryAddress = deliveryAddress; + this.addressId = deliveryAddress.getAddressId(); // Assurez-vous de récupérer l'ID de l'adresse + this.createdDate = createdDate != null ? createdDate : LocalDateTime.now(); + this.deliveryDate = deliveryDate != null ? deliveryDate : LocalDateTime.now().plusDays(2); + this.status = DeliveryStatus.PENDING; } // Getters et setters @@ -75,6 +91,11 @@ public Address getDeliveryAddress() { public void setDeliveryAddress(Address deliveryAddress) { this.deliveryAddress = deliveryAddress; + this.addressId = deliveryAddress.getAddressId(); // Mettez à jour l'ID de l'adresse + } + + public UUID getAddressId() { + return addressId; } public DeliveryStatus getStatus() { diff --git a/shipping/src/main/java/org/shipping/repository/OutboxRepository.java b/shipping/src/main/java/org/shipping/repository/OutboxRepository.java new file mode 100644 index 00000000..3951e32d --- /dev/null +++ b/shipping/src/main/java/org/shipping/repository/OutboxRepository.java @@ -0,0 +1,10 @@ +package org.shipping.repository; + +import io.quarkus.hibernate.orm.panache.PanacheRepository; +import jakarta.enterprise.context.ApplicationScoped; + +import org.shipping.model.OutboxEvent; + +@ApplicationScoped +public class OutboxRepository implements PanacheRepository { +} diff --git a/shipping/src/main/java/org/shipping/repository/ShipmentRepository.java b/shipping/src/main/java/org/shipping/repository/ShipmentRepository.java index 48b80eda..5603f22e 100755 --- a/shipping/src/main/java/org/shipping/repository/ShipmentRepository.java +++ b/shipping/src/main/java/org/shipping/repository/ShipmentRepository.java @@ -1,11 +1,11 @@ package org.shipping.repository; -import org.shipping.model.Shipment; - import io.quarkus.hibernate.orm.panache.PanacheRepository; import jakarta.enterprise.context.ApplicationScoped; +import org.shipping.model.Shipment; + @ApplicationScoped public class ShipmentRepository implements PanacheRepository { - + // Now this repository has the persist method } diff --git a/shipping/src/main/java/org/shipping/service/ShippingService.java b/shipping/src/main/java/org/shipping/service/ShippingService.java index 8ed9503c..c5bb9676 100755 --- a/shipping/src/main/java/org/shipping/service/ShippingService.java +++ b/shipping/src/main/java/org/shipping/service/ShippingService.java @@ -4,13 +4,17 @@ import jakarta.inject.Inject; import jakarta.persistence.NoResultException; import jakarta.transaction.Transactional; - import org.jboss.logging.Logger; +import org.shipping.exception.AddressNotFoundException; +import org.shipping.exception.OrderAlreadyAssociatedException; import org.shipping.messaging.DeliveryStatusPublisher; import org.shipping.model.Address; import org.shipping.model.DeliveryStatus; +import org.shipping.model.EventTypeMapper; import org.shipping.model.Shipment; +import org.shipping.model.OutboxEvent; import org.shipping.repository.ShipmentRepository; +import org.shipping.repository.OutboxRepository; import java.time.LocalDateTime; import java.util.List; @@ -31,6 +35,9 @@ public class ShippingService { @Inject DeliveryStatusPublisher statusPublisher; + @Inject + OutboxRepository outboxRepository; + private static final Logger logger = Logger.getLogger(ShippingService.class); // Créer une nouvelle livraison @@ -43,72 +50,90 @@ public Shipment createShipment(UUID orderId, UUID addressId) { Address address = addressService.getAddressById(addressId); if (address == null) { logger.error("Address not found for ID: " + addressId); - throw new NoResultException("Address not found for ID: " + addressId); + throw new AddressNotFoundException("Address not found for ID: " + addressId); } - + // Vérification si la commande est déjà associée à une livraison Shipment shipment = shipmentRepository.find("orderId", orderId).firstResult(); if (shipment != null) { - throw new IllegalStateException("This order is already associated to a shipment."); + logger.error("Order already associated with shipment: " + orderId); + throw new OrderAlreadyAssociatedException("This order is already associated to a shipment."); } // Créer et persister la livraison - Shipment newShipment = new Shipment(orderId, address); + Shipment newShipment = new Shipment(orderId, address, null, null); shipmentRepository.persist(newShipment); - statusPublisher.publishStatus(orderId, DeliveryStatus.PENDING); // Publier le statut de la livraison + + // Créer un événement et l'enregistrer dans la table outbox + OutboxEvent outboxEvent = new OutboxEvent( + UUID.randomUUID(), // ID unique pour l'événement + newShipment.getShipmentId(), // ID de l'expédition comme AggregateId + EventTypeMapper.getEventType("SHIPPING_CREATED"), // Type d'événement générique (string) + "{\"orderId\":\"" + orderId + "\", \"addressId\":\"" + addressId + "\"}", // Payload en format JSON + "false" // Indicateur de traitement de l'événement + ); + outboxRepository.persist(outboxEvent); + + // Publier le statut de la livraison + statusPublisher.publishStatus(orderId, DeliveryStatus.PENDING); logger.info("Shipment created successfully: " + newShipment.getShipmentId()); return newShipment; - } catch (NoResultException e) { - // Adresse non trouvée - logger.error("NoResultException: " + e.getMessage()); + } catch (AddressNotFoundException e) { + logger.error("Address not found: " + e.getMessage()); throw e; - } catch (IllegalStateException e) { - // Commande déjà associée à une livraison - logger.error("Order Already exists: " + e.getMessage()); + } catch (OrderAlreadyAssociatedException e) { + logger.error("Order already associated with shipment: " + e.getMessage()); throw e; } catch (Exception e) { - // Autres exceptions possibles logger.error("Unexpected error occurred while creating shipment: " + e.getMessage(), e); throw new RuntimeException("An unexpected error occurred while creating shipment.", e); } } - // Obtenir une livraison par OrderId + // Récupérer une livraison par orderId public Shipment getShipmentByOrderId(UUID orderId) { - try { - logger.info("Fetching shipment for orderId: " + orderId); + Shipment shipment = shipmentRepository.find("orderId", orderId).firstResult(); + if (shipment == null) { + logger.error("No shipment found for orderId: " + orderId); + throw new NoResultException("No shipment found for orderId: " + orderId); + } + return shipment; + } - // Vérifier si l'orderId est valide - if (orderId == null) { - logger.error("Order ID cannot be null."); - throw new IllegalArgumentException("Order ID cannot be null."); - } + // Ajouter la méthode getShipmentById pour récupérer une livraison par son ID + public Shipment getShipmentById(UUID shipmentId) { + Shipment shipment = shipmentRepository.find("shipmentId", shipmentId).firstResult(); + if (shipment == null) { + logger.error("No shipment found for shipmentId: " + shipmentId); + throw new NoResultException("No shipment found for shipmentId: " + shipmentId); + } + return shipment; + } - // Rechercher la livraison par orderId - Shipment shipment = shipmentRepository.find("orderId", orderId).firstResult(); - if (shipment == null) { - logger.warn("No shipment found for order ID: " + orderId); - throw new NoResultException("No shipment found for order ID: " + orderId); + @Transactional + public void deleteShipment(UUID shipmentId) { + try { + // Find the shipment by ID + Shipment shipment = shipmentRepository.find("shipmentId", shipmentId).firstResult(); + if (shipment != null) { + // Delete the shipment if it exists + shipmentRepository.delete(shipment); + logger.info("Shipment deleted successfully with ID: " + shipmentId); + } else { + logger.warn("Shipment with ID: " + shipmentId + " not found."); } - - return shipment; - - } catch (IllegalArgumentException e) { - // Erreur de validation des arguments - logger.error("IllegalArgumentException: " + e.getMessage()); - throw e; - } catch (NoResultException e) { - // Livraison non trouvée - logger.error("NoResultException: " + e.getMessage()); - throw e; } catch (Exception e) { - // Autres erreurs - logger.error("Unexpected error occurred while retrieving shipment: " + e.getMessage(), e); - throw new RuntimeException("An unexpected error occurred while retrieving shipment.", e); + logger.error("Error occurred while deleting shipment with ID: " + shipmentId, e); + throw new RuntimeException("Error occurred while deleting shipment", e); } } + public List getUserShipmentHistory(DeliveryStatus status) { + // Logique pour récupérer l'historique des livraisons selon le statut + return shipmentRepository.find("status", status).list(); + } + // Mettre à jour le statut d'une livraison @Transactional public Shipment updateShipment(UUID orderId, LocalDateTime deliveryDate, DeliveryStatus status) { @@ -134,79 +159,34 @@ public Shipment updateShipment(UUID orderId, LocalDateTime deliveryDate, Deliver statusPublisher.publishStatus(orderId, status); } shipmentRepository.persist(shipment); + + // Récupérer l'ID de l'adresse associée à l'expédition + UUID addressId = shipment.getDeliveryAddress().getAddressId(); + + // Créer un événement et l'enregistrer dans la table outbox + OutboxEvent outboxEvent = new OutboxEvent( + UUID.randomUUID(), // ID unique pour l'événement + shipment.getShipmentId(), // ID de l'expédition comme AggregateId + EventTypeMapper.getEventType("SHIPPING_UPDATED"), // Type d'événement générique (string) + "{\"orderId\":\"" + orderId + "\", \"addressId\":\"" + addressId + "\"}", // Payload en format JSON + "false" // Indicateur de traitement de l'événement + ); + outboxRepository.persist(outboxEvent); + logger.info("Shipment updated successfully: " + shipment.getShipmentId()); } return shipment; } catch (NoResultException e) { - // Livraison non trouvée logger.error("NoResultException: " + e.getMessage()); throw e; } catch (IllegalArgumentException e) { - // Erreur de validation des données logger.error("IllegalArgumentException: " + e.getMessage()); throw e; } catch (Exception e) { - // Erreur imprévue logger.error("Unexpected error occurred while updating shipment: " + e.getMessage(), e); throw new RuntimeException("An unexpected error occurred while updating the shipment.", e); } } - - // Récupérer les livraisons d'un utilisateur - public List getUserShipmentHistory(DeliveryStatus status) { - try { - // UUID userId = securityService.getCurrentUserId(); - UUID userId = UUID.fromString("faa1b47d-27e3-4106-b42b-2d1e7d1f6e93"); - - logger.info("Fetching shipment history for userId: " + userId + " with status: " + status); - - // Si un statut est spécifié, filtrer les livraisons par utilisateur et statut - if (status != null) { - return shipmentRepository.find("deliveryAddress.userId = ?1 AND status = ?2", userId, status).list(); - } else { - // Sinon, récupérer toutes les livraisons de l'utilisateur - return shipmentRepository.find("deliveryAddress.userId = ?1", userId).list(); - } - } catch (IllegalArgumentException e) { - // Erreur de validation des données - logger.error("IllegalArgumentException: " + e.getMessage()); - throw new IllegalArgumentException("Invalid user ID format: " + e.getMessage()); - } catch (Exception e) { - // Autres erreurs - logger.error("Unexpected error occurred while retrieving user shipment history: " + e.getMessage(), e); - throw new RuntimeException("An unexpected error occurred while retrieving user shipment history.", e); - } - } - - // Supprimer une livraison par ID - @Transactional - public void deleteShipment(UUID shipmentId) { - try { - logger.info("Deleting shipment with shipmentId: " + shipmentId); - - // Rechercher la livraison par ID - Shipment shipment = shipmentRepository.find("shipmentId", shipmentId).firstResult(); - - // Vérifier si la livraison existe - if (shipment != null) { - shipmentRepository.delete(shipment); - logger.info("Shipment deleted successfully: " + shipmentId); - } else { - // Si la livraison n'existe pas, lancer une exception - logger.error("Shipment not found for ID: " + shipmentId); - throw new NoResultException("Shipment with ID " + shipmentId + " not found."); - } - } catch (NoResultException e) { - // Livraison non trouvée - logger.error("NoResultException: " + e.getMessage()); - throw e; - } catch (Exception e) { - // Autres erreurs - logger.error("Unexpected error occurred while deleting shipment: " + e.getMessage(), e); - throw new RuntimeException("An unexpected error occurred while deleting shipment.", e); - } - } - -} \ No newline at end of file +} diff --git a/shipping/src/main/resources/application.properties b/shipping/src/main/resources/application.properties index 75120998..0268094c 100755 --- a/shipping/src/main/resources/application.properties +++ b/shipping/src/main/resources/application.properties @@ -9,7 +9,7 @@ quarkus.datasource.password=azerty quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5442/db_shipping # drop and create the database at startup (use `update` to only update the schema) -quarkus.hibernate-orm.database.generation=update +quarkus.hibernate-orm.database.generation=create %dev.quarkus.hibernate-orm.log.sql=true %dev.quarkus.hibernate-orm.log.format-sql=true %dev.quarkus.hibernate-orm.statistics=true @@ -27,11 +27,19 @@ quarkus.kafka.devservices.enabled=false mp.messaging.incoming.order-paid.connector=smallrye-kafka mp.messaging.incoming.order-paid.topic=order-paid mp.messaging.incoming.order-paid.group.id=shipping-group -mp.messaging.incoming.order-paid.bootstrap.servers=localhost:9093 +mp.messaging.incoming.order-paid.bootstrap.servers=localhost:9092 mp.messaging.incoming.order-paid.value.deserializer=org.shipping.serialization.OrderPaidEventDeserializer # Broker pour publier les statuts des livraisons mp.messaging.outgoing.delivery-status.connector=smallrye-kafka mp.messaging.outgoing.delivery-status.topic=delivery-status mp.messaging.outgoing.delivery-status.value.serializer=org.shipping.serialization.DeliveryStatusEventSerializer -mp.messaging.outgoing.delivery-status.bootstrap.servers=localhost:9093 \ No newline at end of file +mp.messaging.outgoing.delivery-status.bootstrap.servers=localhost:9092 + + +# Mappages pour les DeliveryStatus +event.mapping.123e4567-e89b-12d3-a456-426614174001=PENDING +event.mapping.123e4567-e89b-12d3-a456-426614174002=DELIVERED +event.mapping.123e4567-e89b-12d3-a456-426614174003=IN_PROGRESS +event.mapping.123e4567-e89b-12d3-a456-426614174004=CANCELLED +event.mapping.123e4567-e89b-12d3-a456-426614174005=RETURNED