예제 #1
0
        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 ActionResult UserReport()
        {
            UsersClient UC      = new UsersClient();
            var         dbusers = UC.GetAllUsers();


            return(View(dbusers));
        }
예제 #3
0
        public async Task <IActionResult> SaveLink(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "assignments/{assignmentId}/links/{linkId}")] HttpRequest req,
            [Table(AssignmentLinksTableName)] IAsyncCollector <AssignmentLinkEntity> linksCollector,
            string assignmentId,
            string linkId,
            [User] UsersClient usersClient)
        {
            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(assignmentId);

                User user = allUsers.FirstOrDefault(member => userEmails.Any(userEmail => (member.Email ?? String.Empty).Equals(userEmail)));
                if (user == null || !user.Role.Equals("teacher"))
                {
                    return(new UnauthorizedResult());
                }
            }

            string linkJson = await req.ReadAsStringAsync();

            AssignmentLinkDto linkDto = JsonConvert.DeserializeObject <AssignmentLinkDto>(linkJson);

            if (linkId != linkDto.Id)
            {
                return(new BadRequestErrorMessageResult("The provided link content doesn't match the path."));
            }

            _logger.LogInformation($"Starting the save process of link with ID [{linkId}] to assignment [{assignmentId}].");

            AssignmentLinkEntity assignmentLinkEntity = _mapper.Map <AssignmentLinkEntity>(linkDto);

            assignmentLinkEntity.PartitionKey = assignmentId;
            assignmentLinkEntity.ETag         = "*";

            await linksCollector.AddAsync(assignmentLinkEntity);

            await linksCollector.FlushAsync();

            AssignmentLinkDto savedLinkDto  = _mapper.Map <AssignmentLinkDto>(assignmentLinkEntity);
            string            assignmentUrl = $"{req.Scheme}://{req.Host}/api/assignments/{assignmentId}/links/{savedLinkDto.Id}";

            return(new CreatedResult(assignmentUrl, savedLinkDto));
        }
예제 #4
0
        public async Task <IActionResult> ClearAssignmentLearnContent(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "assignments/{assignmentId}/learn-content")] HttpRequest req,
            [Table(AssignmentLearnContentTableName)] CloudTable assignmentLearnContentTable,
            string assignmentId,
            [User] UsersClient usersClient)
        {
            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(assignmentId);

                User user = allUsers.FirstOrDefault(member => userEmails.Any(userEmail => (member.Email ?? String.Empty).Equals(userEmail)));
                if (user == null || !user.Role.Equals("teacher"))
                {
                    return(new UnauthorizedResult());
                }
            }

            List <AssignmentLearnContentEntity> assignmentLearnContentEntities = await GetAllAssignmentLearnContentEntities(assignmentLearnContentTable, assignmentId);

            if (assignmentLearnContentEntities.Count == 0)
            {
                return(new NoContentResult());
            }

            _logger.LogInformation($"Removing all assignment learn content from assignment {assignmentId}");

            TableBatchOperation deleteBatchOperations = new TableBatchOperation();

            assignmentLearnContentEntities
            .Select(TableOperation.Delete)
            .ForEach(deleteBatchOperations.Add);

            IList <TableResult> executeBatchResults = await assignmentLearnContentTable.ExecuteBatchAsync(deleteBatchOperations);

            bool errorExists = executeBatchResults.Any(result => result.HttpStatusCode < 200 || result.HttpStatusCode >= 300);

            return(errorExists
                ? (IActionResult) new InternalServerErrorResult()
                : new OkResult());
        }
예제 #5
0
        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));
        }
예제 #6
0
        private async Task <IActionResult> ChangePublishStatus(HttpRequest req, CloudTable table, IAsyncCollector <AssignmentEntity> assignmentEntityCollector, string assignmentId, UsersClient usersClient, PublishStatus newPublishStatus)
        {
            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(assignmentId);

                User user = allUsers.FirstOrDefault(member => userEmails.Any(userEmail => (member.Email ?? String.Empty).Equals(userEmail)));
                if (user == null || !user.Role.Equals("teacher"))
                {
                    return(new UnauthorizedResult());
                }
            }

            AssignmentEntity assignmentEntity = await FetchAssignment(table, assignmentId);

            if (assignmentEntity == null)
            {
                return(new NotFoundResult());
            }

            assignmentEntity.PublishStatus = newPublishStatus.ToString();
            assignmentEntity.ETag          = "*";

            AssignmentDto assignmentDto = _mapper.Map <AssignmentDto>(assignmentEntity);

            ValidationContext context = new ValidationContext(assignmentDto, null, null);

            if (!Validator.TryValidateObject(assignmentDto, context, new List <ValidationResult>(), true))
            {
                _logger.LogError("One or more enteries are incorrect. Incorrect publish status entered.");
                return(new BadRequestErrorMessageResult("The publish status entered is incorrect."));
            }

            await assignmentEntityCollector.AddAsync(assignmentEntity);

            await assignmentEntityCollector.FlushAsync();

            return(new OkResult());
        }
예제 #7
0
        public async Task <IActionResult> RemoveAssignmentLearnContent(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "assignments/{assignmentId}/learn-content/{contentUid}")] HttpRequest req,
            [Table(AssignmentLearnContentTableName)] CloudTable assignmentLearnContentTable,
            [Table(AssignmentLearnContentTableName, "{assignmentId}", "{contentUid}")] AssignmentLearnContentEntity assignmentLearnContentEntityToDelete,
            string assignmentId,
            string contentUid,
            [User] UsersClient usersClient)
        {
            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(assignmentId);

                User user = allUsers.FirstOrDefault(member => userEmails.Any(userEmail => (member.Email ?? String.Empty).Equals(userEmail)));
                if (user == null || !user.Role.Equals("teacher"))
                {
                    return(new UnauthorizedResult());
                }
            }

            if (assignmentLearnContentEntityToDelete == null)
            {
                return(new NoContentResult());
            }

            _logger.LogInformation($"Removing assignment learn content with uid [{contentUid}] from assignment {assignmentId}");

            TableOperation deleteOperation = TableOperation.Delete(assignmentLearnContentEntityToDelete);
            TableResult    deleteResult    = await assignmentLearnContentTable.ExecuteAsync(deleteOperation);

            if (deleteResult.HttpStatusCode < 200 || deleteResult.HttpStatusCode >= 300)
            {
                return(new InternalServerErrorResult());
            }

            return(new OkResult());
        }
예제 #8
0
        public async Task <IActionResult> SaveAssignmentLearnContent(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "assignments/{assignmentId}/learn-content/{contentUid}")] HttpRequest req,
            [Table(AssignmentLearnContentTableName)] IAsyncCollector <AssignmentLearnContentEntity> learnContentCollector,
            string assignmentId,
            string contentUid,
            [User] UsersClient usersClient)
        {
            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(assignmentId);

                User user = allUsers.FirstOrDefault(member => userEmails.Any(userEmail => (member.Email ?? String.Empty).Equals(userEmail)));
                if (user == null || !user.Role.Equals("teacher"))
                {
                    return(new UnauthorizedResult());
                }
            }

            _logger.LogInformation($"Saving assignment learn content with uid [{contentUid}] to assignment {assignmentId}");

            AssignmentLearnContentEntity assignmentLearnContentEntity = new AssignmentLearnContentEntity {
                PartitionKey = assignmentId, RowKey = contentUid, ETag = "*"
            };

            await learnContentCollector.AddAsync(assignmentLearnContentEntity);

            await learnContentCollector.FlushAsync();

            AssignmentLearnContentDto savedLearnContentDto = _mapper.Map <AssignmentLearnContentDto>(assignmentLearnContentEntity);
            string assignmentUrl = $"{req.Scheme}://{req.Host}/api/assignments/{assignmentId}/learn-content/{savedLearnContentDto.ContentUid}";

            return(new CreatedResult(assignmentUrl, savedLearnContentDto));
        }