public async Task CreateDiscussionAsync(Guid userId, string slug, Discussion discussion, CancellationToken cancellationToken) { if (Guid.Empty == userId) { throw new ArgumentOutOfRangeException(nameof(userId)); } if (string.IsNullOrEmpty(slug)) { throw new ArgumentOutOfRangeException(nameof(slug)); } var now = _systemClock.UtcNow.UtcDateTime; var groupId = await _groupCommand.GetGroupIdForSlugAsync(slug, cancellationToken); if (!groupId.HasValue) { _logger.LogError($"Error: CreateDiscussionAsync - Group not found for slug:{0}", slug); throw new KeyNotFoundException("Error: Group not found for slug"); } var userCanPerformAction = await _permissionsService.UserCanPerformActionAsync(userId, groupId.Value, AddDiscussionRole, cancellationToken); if (!userCanPerformAction) { _logger.LogError($"Error: CreateDiscussionAsync - User:{0} does not have access to group:{1}", userId, slug); throw new SecurityException($"Error: User does not have access"); } var entityId = Guid.NewGuid(); var discussionDto = new DiscussionDto { Id = entityId, Title = discussion.Title, Content = discussion.Content, CreatedAtUTC = now, CreatedBy = userId, IsSticky = discussion.IsSticky, IsLocked = false, GroupId = groupId.Value }; var validator = new DiscussionValidator(); var validationResult = await validator.ValidateAsync(discussionDto, cancellationToken); if (validationResult.Errors.Count > 0) { throw new ValidationException(validationResult); } await _discussionCommand.CreateDiscussionAsync(discussionDto, cancellationToken); }
public async Task <Folder> GetFolderAsync(Guid userId, string slug, Guid folderId, CancellationToken cancellationToken) { if (Guid.Empty == userId) { throw new ArgumentOutOfRangeException(nameof(userId)); } if (Guid.Empty == folderId) { throw new ArgumentOutOfRangeException(nameof(userId)); } if (string.IsNullOrEmpty(slug)) { throw new ArgumentOutOfRangeException(nameof(slug)); } var groupId = await _groupCommand.GetGroupIdForSlugAsync(slug, cancellationToken); if (!groupId.HasValue) { _logger.LogError($"Error: UpdateFolderAsync - Group not found for slug:{0}", slug); throw new KeyNotFoundException("Error: Group not found for slug"); } var userCanViewFolder = await _permissionsService.UserCanPerformActionAsync(userId, slug, AddFolderRole, cancellationToken); if (!userCanViewFolder) { _logger.LogError($"Forbidden: GetFolderAsync - User:{0} does not have permission to view folder:{1}", userId, folderId); throw new ForbiddenException("Forbidden: User does not have permission to view this folder"); } var folderDto = await _folderCommand.GetFolderAsync(folderId, cancellationToken); return(new Folder { Name = folderDto.Name, Description = folderDto.Description, RowVersion = folderDto.RowVersion }); }
public async Task <GroupMemberDetails> GetGroupMembershipUserAsync(Guid userId, Guid targetUserId, string slug, CancellationToken cancellationToken) { if (Guid.Empty == userId) { throw new ArgumentOutOfRangeException(nameof(userId)); } if (Guid.Empty == targetUserId) { throw new ArgumentOutOfRangeException(nameof(targetUserId)); } if (string.IsNullOrEmpty(slug)) { throw new ArgumentOutOfRangeException(nameof(slug)); } var userCanPerformAction = await _permissionsService.UserCanPerformActionAsync(userId, slug, EditUserRole, cancellationToken); if (!userCanPerformAction) { _logger.LogError($"Error: GetGroupMembershipUserAsync - User:{0} does not have access to group:{1}", userId, slug); throw new ForbiddenException($"Error: User does not have access"); } var groupId = await _groupCommand.GetGroupIdForSlugAsync(slug, cancellationToken); if (!groupId.HasValue) { _logger.LogError($"Error: GetGroupMembershipUserAsync - Group not found for slug:{0}", slug); throw new KeyNotFoundException("Error: Group not found for slug"); } var groupUserResult = await _groupCommand.GetGroupUserAsync(targetUserId, groupId.Value, cancellationToken); if (groupUserResult is null) { _logger.LogError($"Error: GetGroupMembershipUserAsync - User:{0} not found in group:{1}", targetUserId, slug); throw new KeyNotFoundException("Error: User not found in group"); } var userResult = await _userCommand.GetUserAsync(groupUserResult.MembershipUser, cancellationToken); if (userResult is null) { _logger.LogError($"Error: GetGroupMembershipUserAsync - User:{0} not found in group:{1}", groupUserResult.MembershipUser, slug); throw new KeyNotFoundException("Error: User not found in group"); } var roleResult = await _rolesCommand.GetRoleAsync(groupUserResult.MembershipRole, cancellationToken); if (roleResult is null) { _logger.LogError($"Error: GetGroupMembershipUserAsync - Role:{0} not found in group:{1}", groupUserResult.MembershipRole, slug); throw new KeyNotFoundException("Error: User not found in group"); } var membershipUser = new GroupMemberDetails { Id = userResult.Id, UserName = userResult.UserName, Slug = userResult.Slug, FirstName = userResult.FirstName, LastName = userResult.LastName, Initials = userResult.Initials, Email = userResult.Email, DateJoinedUtc = groupUserResult.ApprovedDateUTCAsString, LastLoginUtc = userResult.LastLoginDateUtc, RoleId = roleResult.Id, Role = roleResult.Name, RowVersion = groupUserResult.RowVersion, Image = userResult.Image }; return(membershipUser); }