Beispiel #1
0
        public async Task <IReadOnlyCollection <Location> > CreateLocationsContactPersonForPartnerAsync(Partner partner)
        {
            var customerProfileCreateActions =
                new List <Task <(PartnerContactErrorCodes ErrorCode, Location Location)> >();

            if (await _locationRepository.AreExternalIdsNotUniqueAsync(partner.Id,
                                                                       partner.Locations.Select(l => l.ExternalId)))
            {
                throw new LocationExternalIdNotUniqueException("Not all locations external ids are unique.");
            }

            // We don't want 3 created by on the request side of things so we are setting it here
            partner.Locations.ForEach(location =>
            {
                location.Id        = Guid.NewGuid();
                location.CreatedBy = partner.CreatedBy;
                _log.Info("Location creating", context: $"location: {location.ToJson()}");

                customerProfileCreateActions.Add(CreatePartnerContact(location));
            });

            var createResult = await Task.WhenAll(customerProfileCreateActions);

            if (createResult.Any(r => r.ErrorCode != PartnerContactErrorCodes.None))
            {
                var exception =
                    new LocationContactRegistrationFailedException("Creating the contact person data failed.");
                _log.Error(exception, context: createResult);
                throw exception;
            }

            return(createResult.Select(l => l.Location).ToList());
        }
Beispiel #2
0
        public async Task <IReadOnlyCollection <Location> > UpdateRangeAsync(Partner partner,
                                                                             IReadOnlyCollection <Location> locations,
                                                                             IReadOnlyCollection <Location> existingLocations)
        {
            var deletedLocations = existingLocations
                                   .Where(o => locations.All(l => l.Id != o.Id))
                                   .ToList();
            var createdLocations = new List <Location>();
            var updatedLocations = new List <Location>();

            if (await _locationRepository.AreExternalIdsNotUniqueAsync(partner.Id, locations.Select(l => l.ExternalId)))
            {
                throw new LocationExternalIdNotUniqueException("Not all locations external identifiers are unique.");
            }

            foreach (var location in locations)
            {
                if (location.Id == Guid.Empty || existingLocations.All(o => o.Id != location.Id))
                {
                    createdLocations.Add(location);
                }
                else
                {
                    updatedLocations.Add(location);
                }
            }

            var repositoryActions            = new List <Task>();
            var customerProfileUpdateActions =
                new List <Task <(PartnerContactErrorCodes ErrorCode, Location Location)> >();
            var customerProfileCreateActions =
                new List <Task <(PartnerContactErrorCodes ErrorCode, Location Location)> >();

            // TODO: Add transaction
            if (deletedLocations.Any())
            {
                deletedLocations.ForEach(location =>
                {
                    _log.Info("Location deleting", context: $"location: {location.ToJson()}");

                    repositoryActions.Add(_customerProfileClient.PartnerContact.DeleteAsync(location.Id.ToString()));
                });
            }

            if (updatedLocations.Any())
            {
                updatedLocations.ForEach(location =>
                {
                    var existingLocation = existingLocations.First(p => p.Id == location.Id);
                    location.CreatedBy   = existingLocation.CreatedBy;
                    location.CreatedAt   = existingLocation.CreatedAt;

                    _log.Info("Location updating", context: $"location: {location.ToJson()}");

                    customerProfileUpdateActions.Add(UpdatePartnerContact(location));
                });
            }

            if (createdLocations.Any())
            {
                createdLocations.ForEach(location =>
                {
                    location.Id        = Guid.NewGuid();
                    location.CreatedBy = partner.CreatedBy;

                    _log.Info("Location creating", context: $"location: {location.ToJson()}");

                    customerProfileCreateActions.Add(CreatePartnerContact(location));
                });
            }

            var updateResult = await Task.WhenAll(customerProfileUpdateActions);

            if (updateResult.Any(r => r.Item1 != PartnerContactErrorCodes.None))
            {
                var exception = new LocationContactUpdateFailedException("Updating the contact person data failed.");
                _log.Error(exception, context: updateResult);
                throw exception;
            }

            var createResult = await Task.WhenAll(customerProfileCreateActions);

            if (createResult.Any(r => r.Item1 != PartnerContactErrorCodes.None))
            {
                var exception =
                    new LocationContactRegistrationFailedException("Creating the Contact person data failed.");
                _log.Error(exception, context: createResult);
                throw exception;
            }

            await Task.WhenAll(repositoryActions);

            var processedLocations = new List <Location>();

            processedLocations.AddRange(updateResult.Select(r => r.Location));
            processedLocations.AddRange(createResult.Select(r => r.Location));

            return(processedLocations);
        }