Skip to content

Instantly share code, notes, and snippets.

@gbzarelli
Last active May 26, 2024 11:41
Show Gist options
  • Save gbzarelli/3977ced1adfc1dcb4afc01552a925aa5 to your computer and use it in GitHub Desktop.
Save gbzarelli/3977ced1adfc1dcb4afc01552a925aa5 to your computer and use it in GitHub Desktop.
@AllArgsConstructor
public class ReshippingOrderUseCase {
private final OrderRepository orderRepository;
private final CustomerRepository customerRepository;
private final OrderRepository orderRepository;
private final ShippingProviderClient shippingProviderClient;
private final LogisticClient logisticsClient;
// Dependência entre use cases:
private final ShippingOrderUseCase shippingOrderUseCase;
public Shippment reshipOrder(final Long orderId, final Long customerId) {
final Order order = orderRepository.findById(orderId);
final Customer customer = customerRepository.findById(customerId);
final ShippingType shippingType = logisticsClient.getReshippingType(order);
//Regras de negócio:
if(!order.isAvailableToReshipment()){
throw new OrderNotAvailableToReshipment(order.shippmentStatus());
}
//Reutilização de regras de negócios em outro caso de uso:
final Order orderReshipped = shippingOrderUseCase.ship(order, shippingType);
orderRepository.save(orderReshipped);
logisticsClient.updateOrderProvider(orderReshipped, shippingProvider);
return Shippment.from(orderShipped);
}
}
@AllArgsConstructor
public class ShippingOrderUseCase {
private final OrderRepository orderRepository;
private final CustomerRepository customerRepository;
private final OrderRepository orderRepository;
private final NotificationService notificationService;
private final ShippingProviderClient shippingProviderClient;
public Shippment shipOrder(final Long orderId, final Long customerId) {
final Order order = orderRepository.findById(orderId);
final Customer customer = customerRepository.findById(customerId);
Order orderShipped = ship(order, ShippingType.STANDARD)
orderRepository.save(orderShipped);
return Shippment.from(orderShipped);
}
//Regras de negócio específicas; Expostas para manter disponível para reutilização:
public Order ship(final Order order, final ShippingType shippingType) {
ShippingProvider shippingProvider = shippingProviderClient.getAvailableProvider(shippingType);
final Order orderShipped = order.setOrderShipped(shippingProvider);
if(orderShipped.isExpressShippment()){
shippingProviderClient.notifyExpress(orderShipped);
}
notificationService.notifyCustomer(orderShipped);
return orderShipped;
}
}
@AllArgsConstructor
public class ReshippingOrderUseCase {
private final OrderRepository orderRepository;
private final CustomerRepository customerRepository;
private final OrderRepository orderRepository;
private final ShippingProviderClient shippingProviderClient;
private final LogisticClient logisticsClient;
private final ShipmentSenderService shipmentSender;
public Shippment reshipOrder(final Long orderId, final Long customerId) {
final Order order = orderRepository.findById(orderId);
final Customer customer = customerRepository.findById(customerId);
final ShippingType shippingType = logisticsClient.getReshippingType(order);
final Order orderReshipped = shipmentSender.reship(order, shippingType);
orderRepository.save(orderReshipped);
logisticsClient.updateOrderProvider(orderReshipped, shippingProvider);
return Shippment.from(orderShipped);
}
}
@AllArgsConstructor
public class ShipmentSenderService {
private final NotificationService notificationService;
private final ShippingProviderClient shippingProviderClient;
public Order reship(final Order order, final ShippingType shippingType) {
if(order.isAvailableToReshipment()){
return ship(order, shippingType);
}else{
throw new OrderNotAvailableToReshipment(order.shippmentStatus());
}
}
public Order ship(final Order order, final ShippingType shippingType) {
ShippingProvider shippingProvider = shippingProviderClient.getAvailableProvider(shippingType);
final Order orderShipped = order.setOrderShipped(shippingProvider);
if(orderShipped.isExpressShippment()){
shippingProviderClient.notifyExpress(orderShipped);
}
notificationService.notifyCustomer(orderShipped);
return orderShipped;
}
}
@AllArgsConstructor
public class ShippingOrderUseCase {
private final OrderRepository orderRepository;
private final CustomerRepository customerRepository;
private final OrderRepository orderRepository;
private final ShipmentSenderService shipmentSender;
public Shippment shipOrder(final Long orderId, final Long customerId) {
final Order order = orderRepository.findById(orderId);
final Customer customer = customerRepository.findById(customerId);
final Order orderShipped = shipmentSender.ship(order, ShippingType.STANDARD);
orderRepository.save(orderShipped);
return Shippment.from(orderShipped);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment