예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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));
        }
예제 #4
0
        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));
        }