public async Task CreateReport(ReportContract contract, string userId) { var task = await _repository.GetTask(contract.TaskId); var group = await _repository.GetGroup(task.GroupId); if (group.Members.All(m => m.UserId != userId || !m.IsActive)) { throw new UserNotFoundException(); } var project = group.Projects.FirstOrDefault(p => p.Id == contract.ProjectId); if (project is null) { throw new ProjectsNotFoundException(contract.Id); } if (!project.MembersIds.Contains(userId)) { throw new UserNotFoundException(); } if (task.Reports.Any(r => r.UserId == userId)) { throw new UserAlreadyJoinedException(); } var report = _reportModelMapper.Map(contract, userId); await _repository.AddReport(report); }