public async Task <DTO.AddressOutput> UpdateEntityAsync(long id, DTO.AddressInput address, string userName,
                                                                string normalizedUserName)
        {
            try
            {
                await TransactionHandler.BeginTransactionAsync();

                var foundAddress = await CheckAccessRightsAndGetAddressAsync(id, userName, normalizedUserName);

                var(city, country, state) = await InsertOrGetAddressRelationsAsync(address);

                foundAddress.City       = city;
                foundAddress.Country    = country;
                foundAddress.State      = state;
                foundAddress.DoorNumber = address.DoorNumber;
                foundAddress.Street     = address.Street;
                await AddressRepository.UpdateEntityAsync(foundAddress);

                await TransactionHandler.CommitTransactionAsync();

                return(Mapper.Map <DTO.AddressOutput>(foundAddress));
            }
            catch
            {
                await TransactionHandler.RollbackTransactionAsync();

                throw;
            }
            finally
            {
                await TransactionHandler.DisposeTransactionAsync();
            }
        }
        public async Task <IActionResult> PostAddressAsync([FromBody] DTO.AddressInput address)
        {
            var userName           = User.FindFirst("userName")?.Value;
            var normalizedUserName = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;

            var insertedAddress = await AddressManager.InsertEntityAsync(address, userName, normalizedUserName);

            return(Ok(new DTO.SuccessResponse <DTO.AddressOutput>
            {
                Success = true,
                Content = insertedAddress
            }));
        }
        private async Task <(DAO.City, DAO.Country, DAO.State)> InsertOrGetAddressRelationsAsync(
            DTO.AddressInput entity)
        {
            var convertedCity = Mapper.Map <DAO.City>(entity.City);
            var managedCity   = await CityRepository.InsertOrGetEntityAsync(convertedCity);

            var convertedCountry = Mapper.Map <DAO.Country>(entity.Country);
            var managedCountry   = await CountryRepository.InsertOrGetEntityAsync(convertedCountry);

            var convertedState = Mapper.Map <DAO.State>(entity.State);
            var managedState   = await StateRepository.InsertOrGetEntityAsync(convertedState);

            return(managedCity, managedCountry, managedState);
        }
        public async Task <DTO.AddressOutput> InsertEntityAsync(DTO.AddressInput entity, string userName,
                                                                string normalizedUserName)
        {
            try
            {
                await TransactionHandler.BeginTransactionAsync();

                var person = new DAO.Person
                {
                    UserName           = userName,
                    NormalizedUserName = normalizedUserName
                };
                var managedPerson = await PersonRepository.InsertOrGetEntityAsync(person);

                var(city, country, state) = await InsertOrGetAddressRelationsAsync(entity);

                var address = new DAO.Address
                {
                    Person     = managedPerson,
                    City       = city,
                    Country    = country,
                    State      = state,
                    DoorNumber = entity.DoorNumber,
                    Street     = entity.Street
                };
                var managedAddress = await AddressRepository.InsertEntityAsync(address);

                await TransactionHandler.CommitTransactionAsync();

                return(Mapper.Map <DTO.AddressOutput>(managedAddress));
            }
            catch
            {
                await TransactionHandler.RollbackTransactionAsync();

                throw;
            }
            finally
            {
                await TransactionHandler.DisposeTransactionAsync();
            }
        }