public async Task <IActionResult> CreateProjectMember(int projectId, NewProjectMemberDto newProjectMember) { _logger.LogRequest("Creating member in project {projectId}. Request body: {@newProjectMember}", projectId, newProjectMember); try { if (projectId != newProjectMember.ProjectId) { _logger.LogWarning("Project Id doesn't match"); return(BadRequest("Project Id doesn't match.")); } var(newProjectMemberId, newUserId) = (0, 0); if (newProjectMember.UserId > 0) { newProjectMemberId = await _projectMemberService.AddProjectMember(newProjectMember.ProjectId, newProjectMember.UserId, newProjectMember.ProjectMemberRoleId); } else { (newProjectMemberId, newUserId) = await _projectMemberService.AddProjectMember(newProjectMember.ProjectId, newProjectMember.Email, newProjectMember.FirstName, newProjectMember.LastName, newProjectMember.ExternalAccountIds, newProjectMember.ProjectMemberRoleId, _configuration[ConfigurationKey.WebUrl]); } var projectMember = await _projectMemberService.GetProjectMemberById(newProjectMemberId); var result = _mapper.Map <ProjectMemberDto>(projectMember); _logger.LogResponse("Members in project {projectId} created. Response body: {@results}", projectId, result); return(CreatedAtRoute("GetProjectMemberById", new { projectId = newProjectMember.ProjectId, memberId = newProjectMemberId }, result)); } catch (UserNotFoundException userEx) { _logger.LogWarning(userEx, "User not found"); return(BadRequest(userEx.Message)); } catch (UserCreationFailedException userCreateEx) { _logger.LogWarning(userCreateEx, "User creation failed"); return(BadRequest(userCreateEx.Message)); } catch (DuplicateUserEmailException dupUserEx) { _logger.LogWarning(dupUserEx, "Duplicate user email"); return(BadRequest(dupUserEx.Message)); } catch (ProjectNotFoundException projEx) { _logger.LogWarning(projEx, "Project not found"); return(BadRequest(projEx.Message)); } }