Skip to content

Instantly share code, notes, and snippets.

@dcomartin
Created March 16, 2022 21:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dcomartin/62760147050427b989796a43dbad42b8 to your computer and use it in GitHub Desktop.
Save dcomartin/62760147050427b989796a43dbad42b8 to your computer and use it in GitHub Desktop.
public class ArriveHandler : IRequestHandler<Arrive>
{
private readonly ShipmentDbContext _dbContext;
private readonly IBus _bus;
public ArriveHandler(ShipmentDbContext dbContext, IBus bus)
{
_dbContext = dbContext;
_bus = bus;
}
public async Task<Unit> Handle(Arrive request, CancellationToken cancellationToken)
{
var allStops = await _dbContext.Stops.Where(x => x.ShipmentId == request.ShipmentId).ToArrayAsync();
var stop = allStops.SingleOrDefault(x => x.StopId == request.StopId);
if (stop == null)
{
throw new InvalidOperationException("Stop does not exist.");
}
if (stop.Status != StopStatus.InTransit)
{
throw new InvalidOperationException("Stop has already arrived.");
}
var previousStopsAreNotDeparted = allStops
.Where(x => x.Scheduled < stop.Scheduled)
.Any(x => x.Status != StopStatus.Departed);
if (previousStopsAreNotDeparted)
{
throw new InvalidOperationException("Previous stops have not departed.");
}
stop.Status = StopStatus.Arrived;
stop.Arrived = request.Arrived;
await _dbContext.SaveChangesAsync();
await _bus.Publish(new Arrived(stop.StopId, stop.Arrived));
return Unit.Value;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment