public async Task AddPhotosAsync(Guid remarkId, string userId, params File[] photos) { if (photos == null || !photos.Any()) { throw new ServiceException(OperationCodes.NoFiles, $"There are no photos to be added to the remark with id: '{remarkId}'."); } var user = await _userRepository.GetOrFailAsync(userId); Logger.Debug($"Adding {photos.Count()} photos to remark with id: '{remarkId}'."); var remark = await _remarkRepository.GetOrFailAsync(remarkId); if (remark.Photos.GroupBy(x => x.Size).Count() + photos.Count() > _settings.PhotosLimit) { throw new ServiceException(OperationCodes.TooManyFiles, $"There are too many photos ({photos.Count()}) to be added to the remark with id: '{remarkId}'."); } var tasks = new List <Task>(); foreach (var photo in photos) { var task = UploadImagesWithDifferentSizesAsync(remark, RemarkUser.Create(user), photo); tasks.Add(task); } await Task.WhenAll(tasks); await _remarkRepository.UpdateAsync(remark); Logger.Debug($"Added {photos.Count()} photos to remark with id: '{remarkId}'."); }
public async Task ParticipateAsync(Guid remarkId, string userId, string description) { var remark = await _remarkRepository.GetOrFailAsync(remarkId); var user = await _userRepository.GetOrFailAsync(userId); var encodedDescription = WebUtility.HtmlEncode(description); remark.Participate(user, encodedDescription); await _remarkRepository.UpdateAsync(remark); }
public async Task AddAsync(Guid remarkId, Guid commentId, string userId, string text) { var remark = await _remarkRepository.GetOrFailAsync(remarkId); var user = await _userRepository.GetOrFailAsync(userId); var encodedText = WebUtility.HtmlEncode(text); remark.AddComment(commentId, user, encodedText); await _remarkRepository.UpdateAsync(remark); }
public async Task DeleteStateAsync(Guid remarkId, string userId, Guid stateId) { var user = await _userRepository.GetOrFailAsync(userId); var remark = await _remarkRepository.GetOrFailAsync(remarkId); var state = remark.GetState(stateId); if (state.Value.User.UserId != user.UserId) { throw new ServiceException(OperationCodes.UserNotAllowedToRemoveState, $"User: {userId} is not allowed to remove state: {stateId}"); } remark.RemoveState(stateId); await _remarkRepository.UpdateAsync(remark); }
public async Task HandleAsync(RemarkActionTaken @event) { await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var participant = new Participant { User = new RemarkUser { UserId = @event.UserId, Name = @event.Username }, Description = @event.Description, CreatedAt = @event.CreatedAt }; if (remark.Value.Participants == null) { remark.Value.Participants = new HashSet <Participant>(); } remark.Value.UpdatedAt = DateTime.UtcNow; remark.Value.Participants.Add(participant); remark.Value.ParticipantsCount++; await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .ExecuteAsync(); }
public async Task HandleAsync(PhotosFromRemarkRemoved @event) { await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var remarkDto = await _remarkServiceClient.GetAsync <Remark>(@event.RemarkId); remark.Value.Photos.Clear(); foreach (var photo in remarkDto.Value.Photos) { remark.Value.Photos.Add(photo); } remark.Value.UpdatedAt = DateTime.UtcNow; await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync(); }
public async Task HandleAsync(RemarkRenewed @event) { await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var remarkDto = await _remarkServiceClient.GetAsync <Remark>(@event.RemarkId); remark.Value.UpdatedAt = remarkDto.Value.UpdatedAt; remark.Value.State = remarkDto.Value.State; remark.Value.States = remarkDto.Value.States; remark.Value.Photos = remarkDto.Value.Photos; remark.Value.Resolved = false; await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value, addGeo: true); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync(); }
public async Task HandleAsync(CommentDeletedFromRemark @event) { await _handler .Run(async() => { var remark = await _repository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var comment = remark.Value.Comments.SingleOrDefault(x => x.Id == @event.CommentId); if (comment == null) { return; } comment.History.Clear(); comment.Text = string.Empty; comment.Removed = true; remark.Value.UpdatedAt = DateTime.UtcNow; await _repository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync(); }
public async Task HandleAsync(RemarkCommentVoteDeleted @event) { await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var comment = remark.Value.Comments.SingleOrDefault(x => x.Id == @event.CommentId); if (comment == null) { return; } var vote = comment.Votes.SingleOrDefault(x => x.UserId == @event.UserId); if (vote.Positive) { comment.Rating--; } else { comment.Rating++; } comment.Votes.Remove(vote); await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .ExecuteAsync(); }
public async Task HandleAsync(RemarkVoteDeleted @event) { await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var vote = remark.Value.Votes .SingleOrDefault(x => x.UserId == @event.UserId); if (vote.Positive) { remark.Value.Rating--; remark.Value.PositiveVotesCount--; } else { remark.Value.Rating++; remark.Value.NegativeVotesCount--; } remark.Value.UpdatedAt = DateTime.UtcNow; remark.Value.Votes.Remove(vote); await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .ExecuteAsync(); }
public async Task HandleAsync(FavoriteRemarkDeleted @event) { await _handler .Run(async() => { var user = await _userRepository.GetByIdAsync(@event.UserId); if (user.HasNoValue) { throw new ServiceException(OperationCodes.UserNotFound, $"Favorite remark cannot be deleted because user: {@event.UserId} does not exist"); } user.Value.FavoriteRemarks.Remove(@event.RemarkId); await _userRepository.EditAsync(user.Value); await _userCache.AddAsync(user.Value); var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } remark.Value.UserFavorites.Remove(@event.UserId); await _remarkRepository.UpdateAsync(remark.Value); await _remarkCache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync(); }
public async Task HandleAsync(RemarkEdited @event) => await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var remarkDto = await _remarkServiceClient.GetAsync <Remark>(@event.RemarkId); remark.Value.Group = remarkDto.Value.Group; remark.Value.Category = remarkDto.Value.Category; remark.Value.Description = remarkDto.Value.Description; remark.Value.Location = remarkDto.Value.Location; remark.Value.Tags = remarkDto.Value.Tags; remark.Value.UpdatedAt = remarkDto.Value.UpdatedAt; remark.Value.States = remarkDto.Value.States; remark.Value.State = remarkDto.Value.State; await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync();
public async Task HandleAsync(RemarkAssignedToGroup @event) => await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var remarkDto = await _remarkServiceClient.GetAsync <Remark>(@event.RemarkId); remark.Value.Group = remarkDto.Value.Group; remark.Value.State = remarkDto.Value.State; remark.Value.States = remarkDto.Value.States; remark.Value.Assignee = remarkDto.Value.Assignee; remark.Value.UpdatedAt = remarkDto.Value.UpdatedAt; await _remarkRepository.UpdateAsync(remark.Value); await _groupRemarkRepository.DeleteAllForRemarkAsync(@event.RemarkId); await _cache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync();
public async Task HandleAsync(CommentEditedInRemark @event) { await _handler .Run(async() => { var remark = await _repository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var comment = remark.Value.Comments.SingleOrDefault(x => x.Id == @event.CommentId); if (comment == null) { return; } comment.Text = @event.Text; comment.History.Add(new CommentHistory { Text = comment.Text, CreatedAt = @event.CreatedAt }); remark.Value.UpdatedAt = DateTime.UtcNow; await _repository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync(); }
public async Task HandleAsync(RemarkReported @event) { await _handler .Run(async() => { var report = new Report { Id = Guid.NewGuid(), RemarkId = @event.RemarkId, ResourceId = @event.ResourceId, UserId = @event.UserId, Type = @event.Type, CreatedAt = DateTime.UtcNow }; await _reportRepository.AddAsync(report); var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); switch (@event.Type) { case "activity": remark.Value.States .Single(x => x.Id == @event.ResourceId.Value).ReportsCount++; break; case "comment": remark.Value.Comments .Single(x => x.Id == @event.ResourceId.Value).ReportsCount++; break; case "remark": remark.Value.ReportsCount++; break; } await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync(); }
public async Task HandleAsync(RemarkCommentVoteSubmitted @event) { await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var comment = remark.Value.Comments.SingleOrDefault(x => x.Id == @event.CommentId); if (comment == null) { return; } Vote(comment, @event.UserId, @event.Positive); comment.Votes.Add(new Vote { UserId = @event.UserId, Positive = @event.Positive, CreatedAt = @event.CreatedAt }); await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .ExecuteAsync(); }
public async Task EditAsync(Guid remarkId, string userId, Guid?groupId, string category, string description, Location location) { Logger.Debug($"Editing remark with id: '{remarkId}'."); var remark = await _remarkRepository.GetOrFailAsync(remarkId); var user = await _userRepository.GetOrFailAsync(userId); var state = remark.States.First(); if (groupId != null) { var group = await _groupRepository.GetOrFailAsync(groupId.Value); remark.SetGroup(group); } if (category.NotEmpty()) { var remarkCategory = await _categoryRepository.GetByNameAsync(category); if (remarkCategory.HasNoValue) { throw new ServiceException(OperationCodes.CategoryNotFound, $"Category: '{category}' does not exist!"); } remark.SetCategory(remarkCategory.Value); } if (description.NotEmpty()) { remark.SetDescription(WebUtility.HtmlEncode(description)); } if (location != null) { remark.SetLocation(location); } remark.EditFirstState(); await _remarkRepository.UpdateAsync(remark); }
public async Task HandleAsync(AddPhotosToRemarkRejected @event) => await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); remark.Value.Status = null; await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync();
public async Task HandleAsync(RemarkVoteSubmitted @event) { await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } Vote(remark.Value, @event.UserId, @event.Positive); remark.Value.Votes.Add(new Vote { UserId = @event.UserId, Positive = @event.Positive, CreatedAt = @event.CreatedAt }); remark.Value.UpdatedAt = DateTime.UtcNow; await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .ExecuteAsync(); }
public async Task HandleAsync(CommentAddedToRemark @event) { await _handler .Run(async() => { var remark = await _repository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } remark.Value.UpdatedAt = DateTime.UtcNow; if (remark.Value.Comments == null) { remark.Value.Comments = new List <Comment>(); } remark.Value.Comments.Add(new Comment { Id = @event.CommentId, Text = @event.Text, User = new RemarkUser { UserId = @event.UserId, Name = @event.Username }, CreatedAt = @event.CreatedAt, Votes = new List <Vote>(), History = new List <CommentHistory>() }); await _repository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .OnError((ex, logger) => { logger.Error(ex, $"Error occured while handling {@event.GetType().Name} event"); }) .ExecuteAsync(); }
public async Task HandleAsync(RemarkActionCanceled @event) { await _handler .Run(async() => { var remark = await _remarkRepository.GetByIdAsync(@event.RemarkId); if (remark.HasNoValue) { return; } var participant = remark.Value.Participants.SingleOrDefault(x => x.User.UserId == @event.UserId); if (participant == null) { return; } remark.Value.UpdatedAt = DateTime.UtcNow; remark.Value.Participants.Remove(participant); remark.Value.ParticipantsCount--; await _remarkRepository.UpdateAsync(remark.Value); await _cache.AddAsync(remark.Value); }) .ExecuteAsync(); }