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