public async Task <IActionResult> Delete( [FromServices] AddressCrabEditClient editClient, [FromServices] IStreamStore streamStore, [FromServices] LegacyContext context, [FromRoute] string lokaleIdentificator, CancellationToken cancellationToken) { // TODO: Turn this into proper VBR API Validation if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var persistentLocalId = int.Parse(lokaleIdentificator); // todo: should become position from bus.Dispatch var position = await streamStore.ReadHeadPosition(cancellationToken); var addressId = context .CrabIdToPersistentLocalIds .SingleOrDefault(item => item.PersistentLocalId == persistentLocalId); CrabEditResponse deleteResponse = addressId != null ? await editClient.Delete(addressId, cancellationToken) : CrabEditResponse.NothingExecuted; return(AcceptedWithPosition( position, deleteResponse.ExecutionTime)); }
public async Task <IActionResult> AddAddress( [FromServices] ICommandHandlerResolver bus, [FromServices] AddressCrabEditClient editClient, [FromServices] Func <IAddresses> getAddresses, [FromBody] AddAddressRequest request, CancellationToken cancellationToken) { // TODO: Turn this into proper VBR API Validation if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var crabAddAddress = await AddToCrab(editClient, request, cancellationToken); var addressId = crabAddAddress.Result; // todo: add command implementation for BoxNumber var command = new RegisterAddress( addressId, StreetNameId.CreateForPersistentId(request.StreetNameId.AsIdentifier().Map(IdentifierMappings.StreetNameId)), PostalCode.CreateForPersistentId(request.PostalCode.AsIdentifier().Map(IdentifierMappings.PostalCode)), new HouseNumber(request.HouseNumber), new BoxNumber(request.BoxNumber)); var position = await bus.Dispatch( Guid.NewGuid(), command, GetMetadata(), cancellationToken); // Because we don't use the addressId as an identifier, we are stuck with the mess of retrieving our aggregate // and getting the surrogate identifier from it.... PersistentLocalIdentifier var addresses = getAddresses(); var address = await addresses.GetOptionalAsync(addressId, cancellationToken); if (!address.HasValue) { throw new ApiException("Er is een fout opgetreden.", StatusCodes.Status500InternalServerError); } return(CreatedWithPosition( $"/v1/adressen/{address.Value.PersistentLocalId}", position, crabAddAddress.ExecutionTime)); }
public async Task <IActionResult> Correct( [FromServices] AddressCrabEditClient editClient, [FromServices] LegacyContext context, [FromServices] IStreamStore streamStore, [FromRoute] string lokaleIdentificator, [FromBody] CorrectAddressRequest request, CancellationToken cancellationToken) { // TODO: Turn this into proper VBR API Validation if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var persistentLocalId = int.Parse(lokaleIdentificator); // todo: should become position from bus.Dispatch var position = await streamStore.ReadHeadPosition(cancellationToken); var addressId = context .CrabIdToPersistentLocalIds .Single(item => item.PersistentLocalId == persistentLocalId); CrabEditClientResult crabEditResult; if (addressId.HouseNumberId.HasValue) { crabEditResult = await editClient.CorrectHouseNumber(addressId.HouseNumberId.Value, request, cancellationToken); } else if (addressId.SubaddressId.HasValue) { crabEditResult = await editClient.CorrectSubaddress(addressId.SubaddressId.Value, request, cancellationToken); } else { throw new InvalidOperationException(); } return(AcceptedWithPosition( position, crabEditResult.ExecutionTime)); }
private static async Task <CrabEditClientResult <AddressId> > AddToCrab( AddressCrabEditClient editClient, AddAddressRequest request, CancellationToken cancellationToken) { if (request.BoxNumber.IsNullOrWhiteSpace()) { var addHouseNumberResult = await editClient.AddHouseNumberToCrab(request, cancellationToken); return(new CrabEditClientResult <AddressId>( AddressId.CreateFor(addHouseNumberResult.Result), addHouseNumberResult.ExecutionTime)); } var addSubaddressResult = await editClient.AddSubaddressToCrab(request, cancellationToken); return(new CrabEditClientResult <AddressId>( AddressId.CreateFor(addSubaddressResult.Result), addSubaddressResult.ExecutionTime)); }