public async Task <IActionResult> CreateOrUpdateAssignment( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = AssignmentsRoutePath)] HttpRequest request, [Table(AssignmentsTableName)] CloudTable assignmentsTable) { string result = await request.ReadAsStringAsync(); AssignmentDto assignmentDto = JsonConvert.DeserializeObject <AssignmentDto>(result); AssignmentEntity assignmentEntity = _mapper.Map <AssignmentEntity>(assignmentDto); assignmentEntity.ETag = "*"; TableOperation insertOrMergeAssignment = TableOperation.InsertOrMerge(assignmentEntity); TableResult insertOrMergeResult = await assignmentsTable.ExecuteAsync(insertOrMergeAssignment); if (insertOrMergeResult.HttpStatusCode < 200 || insertOrMergeResult.HttpStatusCode >= 300) { _logger.LogError($"Could not save assignment {assignmentEntity.ToAssignmentId()}. Error code: {insertOrMergeResult.HttpStatusCode}."); return(new InternalServerErrorResult()); } _logger.LogInformation($"Saved assignment {assignmentEntity.ToAssignmentId()}."); string assignmentUrl = $"{request.Scheme}://{request.Host}/api/{AssignmentsRoutePath}/{assignmentEntity.ToAssignmentId()}"; AssignmentDto savedAssignmentDto = _mapper.Map <AssignmentDto>(assignmentEntity); return(new CreatedResult(assignmentUrl, savedAssignmentDto)); }
public async Task <IActionResult> CreateOrUpdateAssignment( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = AssignmentsRoutePath)] HttpRequest req, [Table(AssignmentsTableName)] CloudTable assignmentsTable, [User] UsersClient usersClient) { string result = await req.ReadAsStringAsync(); AssignmentDto assignmentDto = JsonConvert.DeserializeObject <AssignmentDto>(result); AssignmentEntity assignmentEntity = _mapper.Map <AssignmentEntity>(assignmentDto); assignmentEntity.ETag = "*"; #if !DEBUG //While debugging, authorization header is empty when this API gets called from either Lti1 API or LtiAdvantage API // So to enable seamless debugging, putting this code in #if !DEBUG block bool isSystemCallOrUserWithValidEmail = req.Headers.TryGetUserEmails(out List <string> userEmails); if (!isSystemCallOrUserWithValidEmail) { _logger.LogError("Could not get user email."); return(new BadRequestErrorMessageResult("Could not get user email.")); } if (userEmails.Count > 0) { _logger.LogInformation($"Getting user information for '{string.Join(';', userEmails)}'."); User[] allUsers = await usersClient.GetAllUsers(assignmentDto.Id); User user = allUsers.FirstOrDefault(member => userEmails.Any(userEmail => (member.Email ?? String.Empty).Equals(userEmail))); if (user == null || !user.Role.Equals("teacher")) { return(new UnauthorizedResult()); } } #endif ValidationContext context = new ValidationContext(assignmentDto, null, null); if (!Validator.TryValidateObject(assignmentDto, context, new List <ValidationResult>(), true)) { _logger.LogError("One or more enteries are incorrect. The length of provided assignment name / course name / assignment description is too long."); return(new BadRequestErrorMessageResult("One or more enteries are incorrect. The length of provided assignment name / course name / assignment description is too long.")); } TableOperation insertOrMergeAssignment = TableOperation.InsertOrMerge(assignmentEntity); TableResult insertOrMergeResult = await assignmentsTable.ExecuteAsync(insertOrMergeAssignment); if (insertOrMergeResult.HttpStatusCode < 200 || insertOrMergeResult.HttpStatusCode >= 300) { _logger.LogError($"Could not save assignment {assignmentEntity.ToAssignmentId()}. Error code: {insertOrMergeResult.HttpStatusCode}."); return(new InternalServerErrorResult()); } _logger.LogInformation($"Saved assignment {assignmentEntity.ToAssignmentId()}."); string assignmentUrl = $"{req.Scheme}://{req.Host}/api/{AssignmentsRoutePath}/{assignmentEntity.ToAssignmentId()}"; AssignmentDto savedAssignmentDto = _mapper.Map <AssignmentDto>(assignmentEntity); return(new CreatedResult(assignmentUrl, savedAssignmentDto)); }
public async Task <IActionResult> CreateOrUpdateAssignment( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = AssignmentsRoutePath)] HttpRequest req, [Table(AssignmentsTableName)] CloudTable assignmentsTable, [User] UsersClient usersClient) { string result = await req.ReadAsStringAsync(); AssignmentDto assignmentDto = JsonConvert.DeserializeObject <AssignmentDto>(result); AssignmentEntity assignmentEntity = _mapper.Map <AssignmentEntity>(assignmentDto); assignmentEntity.ETag = "*"; bool isSystemCallOrUserWithValidEmail = req.Headers.TryGetUserEmails(out List <string> userEmails); if (!isSystemCallOrUserWithValidEmail) { _logger.LogError("Could not get user email."); return(new BadRequestErrorMessageResult("Could not get user email.")); } _logger.LogInformation($"Getting user information for '{string.Join(';', userEmails)}'."); if (userEmails.Count > 0) { User[] allUsers = await usersClient.GetAllUsers(assignmentDto.Id); User user = allUsers.FirstOrDefault(member => userEmails.Any(userEmail => (member.Email ?? String.Empty).Equals(userEmail))); if (user == null || !user.Role.Equals("teacher")) { return(new UnauthorizedResult()); } } TableOperation insertOrMergeAssignment = TableOperation.InsertOrMerge(assignmentEntity); TableResult insertOrMergeResult = await assignmentsTable.ExecuteAsync(insertOrMergeAssignment); if (insertOrMergeResult.HttpStatusCode < 200 || insertOrMergeResult.HttpStatusCode >= 300) { _logger.LogError($"Could not save assignment {assignmentEntity.ToAssignmentId()}. Error code: {insertOrMergeResult.HttpStatusCode}."); return(new InternalServerErrorResult()); } _logger.LogInformation($"Saved assignment {assignmentEntity.ToAssignmentId()}."); string assignmentUrl = $"{req.Scheme}://{req.Host}/api/{AssignmentsRoutePath}/{assignmentEntity.ToAssignmentId()}"; AssignmentDto savedAssignmentDto = _mapper.Map <AssignmentDto>(assignmentEntity); return(new CreatedResult(assignmentUrl, savedAssignmentDto)); }