Пример #1
0
        public async Task <Guid> Create(ServiceRequest request)
        {
            var Service = ServiceAggregate.CreateFromRequest(request);

            await _repo.Add(Service);

            return(Service.Id);
        }
        public async Task Handle(AddServiceCommand message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            ServiceAggregateOccurrence occurrence = null;

            if (message.Occurrence != null)
            {
                occurrence = new ServiceAggregateOccurrence
                {
                    Id        = Guid.NewGuid().ToString(),
                    Days      = message.Occurrence.Days,
                    StartDate = message.Occurrence.StartDate,
                    EndDate   = message.Occurrence.EndDate,
                    StartTime = message.Occurrence.StartTime,
                    EndTime   = message.Occurrence.EndTime
                };
            }

            var service = new ServiceAggregate
            {
                Id               = message.Id,
                Name             = message.Name,
                Description      = message.Description,
                PartialImagesUrl = message.Images,
                Price            = message.Price,
                Tags             = message.Tags,
                ShopId           = message.ShopId,
                CreateDateTime   = message.CreateDateTime,
                UpdateDateTime   = message.UpdateDateTime,
                TotalScore       = 0,
                AverageScore     = 0,
                Occurrence       = occurrence
            };

            if (!await _serviceRepository.Add(service))
            {
                return;
            }

            _eventPublisher.Publish(new ServiceAddedEvent
            {
                Id             = message.Id,
                Name           = message.Name,
                Description    = message.Description,
                Price          = message.Price,
                ShopId         = message.ShopId,
                CreateDateTime = message.CreateDateTime,
                UpdateDateTime = message.UpdateDateTime,
                CommonId       = message.CommonId
            });
        }
Пример #3
0
        public void ServiceAggregate_ShouldBeDeleted()
        {
            //Arrange
            var request = AggregatesRequestBuilder.CreateRandomServiceRequest();
            var service = ServiceAggregate.CreateFromRequest(request);

            //Act
            service.MarkAsDeleted();

            //Assert
            service.IsDeleted.Should().BeTrue();
        }
Пример #4
0
        public void ServiceAggregate_CreateRandomFromRequest()
        {
            //Arrange
            var request = AggregatesRequestBuilder.CreateRandomServiceRequest();

            //Act
            var service = ServiceAggregate.CreateFromRequest(request);

            // Assert
            service.Name.Should().Be(request.Name);
            service.IsDeleted.Should().BeFalse();
        }
Пример #5
0
        public void ServiceAggregate_UpdateRandomFromRequest()
        {
            //Arrange
            var createRequest = AggregatesRequestBuilder.CreateRandomServiceRequest();
            var service       = ServiceAggregate.CreateFromRequest(createRequest);
            var updateRequest = AggregatesRequestBuilder.CreateRandomServiceRequest();

            //Act
            service.UpdateFromRequest(updateRequest);

            // Assert
            service.Name.Should().Be(updateRequest.Name);
        }
Пример #6
0
        public void Enrich(IHalResponseBuilder halResponseBuilder, ServiceAggregate service)
        {
            if (halResponseBuilder == null)
            {
                throw new ArgumentNullException(nameof(halResponseBuilder));
            }

            if (service == null)
            {
                throw new ArgumentNullException(nameof(service));
            }

            halResponseBuilder.AddEmbedded(e => e.AddObject(_responseBuilder.GetService(service),
                                                            (l) =>
            {
                l.AddOtherItem("shop", new Dtos.Link("/" + Constants.RouteNames.Shops + "/" + service.ShopId)).AddSelf(Constants.RouteNames.Services + "/" + service.Id);
            }));
        }
Пример #7
0
        public static Service ToModel(this ServiceAggregate aggregate)
        {
            if (aggregate == null)
            {
                throw new ArgumentNullException(nameof(aggregate));
            }

            return(new Service
            {
                Id = aggregate.Id,
                Name = aggregate.Name,
                Description = aggregate.Description,
                Price = aggregate.Price,
                ShopId = aggregate.ShopId,
                UpdateDateTime = aggregate.UpdateDateTime,
                TotalScore = aggregate.TotalScore,
                AverageScore = aggregate.AverageScore,
                CreateDateTime = aggregate.CreateDateTime
            });
        }
Пример #8
0
        public async Task <AddCommentValidationResult> Validate(AddServiceCommentCommand command)
        {
            if (command == null)
            {
                throw new ArgumentNullException(nameof(command));
            }

            var validationResult = Validate(command.ServiceId, command.Content, command.Score, Constants.DtoNames.Comment.ServiceId);

            if (!validationResult.IsValid)
            {
                return(validationResult);
            }

            ServiceAggregate service = null;

            // Check shop exists && 1 comment.
            if (!string.IsNullOrWhiteSpace(command.ServiceId))
            {
                service = await _serviceRepository.Get(command.ServiceId);

                if (service == null)
                {
                    return(new AddCommentValidationResult(ErrorDescriptions.TheServiceDoesntExist));
                }

                var comments = await _serviceRepository.Search(new SearchServiceCommentParameter
                {
                    ServiceId = service.Id,
                    Subject   = command.Subject
                });

                if (comments.TotalResults > 0)
                {
                    return(new AddCommentValidationResult(ErrorDescriptions.TheCommentAlreadyExists));
                }
            }

            return(new AddCommentValidationResult());
        }
Пример #9
0
        public async Task <bool> Add(ServiceAggregate serviceAggregate)
        {
            if (serviceAggregate == null)
            {
                throw new ArgumentNullException(nameof(serviceAggregate));
            }

            using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false))
            {
                try
                {
                    var record = serviceAggregate.ToModel();
                    var tags   = new List <Models.ServiceTag>();
                    if (serviceAggregate.Tags != null && serviceAggregate.Tags.Any()) // Add tags
                    {
                        var tagNames      = serviceAggregate.Tags;
                        var connectedTags = _context.Tags.Where(t => tagNames.Any(tn => t.Name == tn));
                        foreach (var connectedTag in connectedTags)
                        {
                            tags.Add(new Models.ServiceTag
                            {
                                Id        = Guid.NewGuid().ToString(),
                                TagName   = connectedTag.Name,
                                ServiceId = serviceAggregate.Id
                            });
                        }

                        var connectedTagNames = (await connectedTags.Select(t => t.Name).ToListAsync().ConfigureAwait(false));
                        foreach (var notExistingTagName in tagNames.Where(tn => !connectedTagNames.Contains(tn)))
                        {
                            var newTag = new Models.Tag
                            {
                                Name        = notExistingTagName,
                                Description = notExistingTagName
                            };
                            _context.Tags.Add(newTag);
                            tags.Add(new Models.ServiceTag
                            {
                                Id        = Guid.NewGuid().ToString(),
                                TagName   = notExistingTagName,
                                ServiceId = serviceAggregate.Id,
                                Tag       = newTag
                            });
                        }
                    }

                    if (serviceAggregate.PartialImagesUrl != null && serviceAggregate.PartialImagesUrl.Any()) // Add images
                    {
                        record.Images = serviceAggregate.PartialImagesUrl.Select(i =>
                                                                                 new Models.ServiceImage
                        {
                            Id          = Guid.NewGuid().ToString(),
                            PartialPath = i
                        }
                                                                                 ).ToList();
                    }

                    if (serviceAggregate.Occurrence != null) // Add occurrence.
                    {
                        var days = new List <Models.ServiceOccurrenceDay>();
                        if (serviceAggregate.Occurrence.Days != null)
                        {
                            days = serviceAggregate.Occurrence.Days.Select(d => new Models.ServiceOccurrenceDay
                            {
                                Id    = Guid.NewGuid().ToString(),
                                DayId = ((int)d).ToString()
                            }).ToList();
                        }
                        record.Occurrence = new Models.ServiceOccurrence
                        {
                            Id        = serviceAggregate.Occurrence.Id,
                            StartDate = serviceAggregate.Occurrence.StartDate,
                            EndDate   = serviceAggregate.Occurrence.EndDate,
                            StartTime = serviceAggregate.Occurrence.StartTime,
                            EndTime   = serviceAggregate.Occurrence.EndTime,
                            Days      = days
                        };
                    }

                    record.Tags = tags;
                    _context.Services.Add(record);
                    await _context.SaveChangesAsync().ConfigureAwait(false);

                    transaction.Commit();
                    return(true);
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    return(false);
                }
            }
        }
Пример #10
0
        public async Task <bool> Update(ServiceAggregate serviceAggregate)
        {
            if (serviceAggregate == null)
            {
                throw new ArgumentNullException(nameof(serviceAggregate));
            }

            using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false))
            {
                try
                {
                    var record = await _context.Services.Include(s => s.Comments).FirstOrDefaultAsync(s => s.Id == serviceAggregate.Id).ConfigureAwait(false);

                    if (record == null)
                    {
                        transaction.Rollback();
                        return(false);
                    }

                    record.AverageScore   = serviceAggregate.AverageScore;
                    record.Description    = serviceAggregate.Description;
                    record.Name           = serviceAggregate.Name;
                    record.Price          = serviceAggregate.Price;
                    record.ShopId         = serviceAggregate.ShopId;
                    record.TotalScore     = serviceAggregate.TotalScore;
                    record.UpdateDateTime = serviceAggregate.UpdateDateTime;
                    var comments   = serviceAggregate.Comments == null ? new List <ServiceComment>() : serviceAggregate.Comments;
                    var commentIds = comments.Select(c => c.Id);
                    if (record.Comments != null) // Update the comments.
                    {
                        var commentsToUpdate   = record.Comments.Where(c => commentIds.Contains(c.Id));
                        var commentsToRemove   = record.Comments.Where(c => !commentIds.Contains(c.Id));
                        var existingCommentIds = record.Comments.Select(c => c.Id);
                        var commentsToAdd      = comments.Where(c => !existingCommentIds.Contains(c.Id));
                        foreach (var commentToUpdate in commentsToUpdate)
                        {
                            var comment = comments.First(c => c.Id == commentToUpdate.Id);
                            commentToUpdate.Score          = comment.Score;
                            commentToUpdate.Subject        = comment.Subject;
                            commentToUpdate.UpdateDateTime = comment.UpdateDateTime;
                            commentToUpdate.Content        = comment.Content;
                        }

                        foreach (var commentToRemove in commentsToRemove)
                        {
                            _context.Comments.Remove(commentToRemove);
                        }

                        foreach (var commentToAdd in commentsToAdd)
                        {
                            var rec = new Models.Comment
                            {
                                Id             = commentToAdd.Id,
                                Content        = commentToAdd.Content,
                                Score          = commentToAdd.Score,
                                CreateDateTime = commentToAdd.CreateDateTime,
                                ServiceId      = serviceAggregate.Id,
                                UpdateDateTime = commentToAdd.UpdateDateTime,
                                Subject        = commentToAdd.Subject
                            };
                            _context.Comments.Add(rec);
                        }
                    }

                    var tags = new List <Models.ServiceTag>();
                    if (serviceAggregate.Tags != null && serviceAggregate.Tags.Any()) // Update the tags.
                    {
                        var tagNames      = serviceAggregate.Tags;
                        var connectedTags = _context.Tags.Where(t => tagNames.Any(tn => t.Name == tn));
                        foreach (var connectedTag in connectedTags)
                        {
                            tags.Add(new Models.ServiceTag
                            {
                                Id        = Guid.NewGuid().ToString(),
                                TagName   = connectedTag.Name,
                                ServiceId = serviceAggregate.Id
                            });
                        }

                        var connectedTagNames = (await connectedTags.Select(t => t.Name).ToListAsync().ConfigureAwait(false));
                        foreach (var notExistingTagName in tagNames.Where(tn => !connectedTagNames.Contains(tn)))
                        {
                            var newTag = new Models.Tag
                            {
                                Name        = notExistingTagName,
                                Description = notExistingTagName
                            };
                            _context.Tags.Add(newTag);
                            tags.Add(new Models.ServiceTag
                            {
                                Id        = Guid.NewGuid().ToString(),
                                TagName   = notExistingTagName,
                                ServiceId = serviceAggregate.Id,
                                Tag       = newTag
                            });
                        }
                    }

                    if (serviceAggregate.PartialImagesUrl != null && serviceAggregate.PartialImagesUrl.Any()) // Update the images.
                    {
                        record.Images = serviceAggregate.PartialImagesUrl.Select(i =>
                                                                                 new Models.ServiceImage
                        {
                            Id          = Guid.NewGuid().ToString(),
                            PartialPath = i
                        }
                                                                                 ).ToList();
                    }

                    if (serviceAggregate.Occurrence != null) // Update the occurrence.
                    {
                        var days = new List <Models.ServiceOccurrenceDay>();
                        if (serviceAggregate.Occurrence.Days != null)
                        {
                            days = serviceAggregate.Occurrence.Days.Select(d => new Models.ServiceOccurrenceDay
                            {
                                Id    = Guid.NewGuid().ToString(),
                                DayId = ((int)d).ToString()
                            }).ToList();
                        }
                        record.Occurrence = new Models.ServiceOccurrence
                        {
                            Id        = serviceAggregate.Occurrence.Id,
                            StartDate = serviceAggregate.Occurrence.StartDate,
                            EndDate   = serviceAggregate.Occurrence.EndDate,
                            StartTime = serviceAggregate.Occurrence.StartTime,
                            EndTime   = serviceAggregate.Occurrence.EndTime,
                            Days      = days
                        };
                    }

                    record.Tags = tags;
                    await _context.SaveChangesAsync().ConfigureAwait(false);

                    transaction.Commit();
                    return(true);
                }
                catch
                {
                    transaction.Rollback();
                    return(false);
                }
            }
        }
Пример #11
0
 public async Task Update(ServiceAggregate item)
 {
     _context.Services.Update(item);
     await _context.SaveChangesAsync();
 }
Пример #12
0
        public async Task Add(ServiceAggregate item)
        {
            await _context.Services.AddAsync(item);

            await _context.SaveChangesAsync();
        }
Пример #13
0
 protected void GivenAServiceAggregate()
 {
     _aggregate = new ServiceAggregate <IInstrumentService>(
         new IInstrumentService[] { new Service1(), new Service2(), new Service2() });
 }