Esempio n. 1
0
        public async static Task <List <Course> > GetAllStudentActiveCourses(UserCredential credential)
        {
            var service = new ClassroomService(new BaseClientService.Initializer
            {
                HttpClientInitializer = credential,

                ApplicationName = "UbiGrade"
            });

            CoursesResource.ListRequest request = service.Courses.List();
            // Restricts returned courses to those in one of the specified states
            // The default value is ACTIVE, ARCHIVED, PROVISIONED, DECLINED.
            request.CourseStates = CoursesResource.ListRequest.CourseStatesEnum.ACTIVE;
            // Restricts returned courses to those having a teacher with the specified identifier. The identifier can be one of the following:
            // - the numeric identifier for the user
            // - the email address of the user
            // - the string literal "me", indicating the requesting user
            //request.TeacherId = "me";

            // List courses.
            List <Course>       courses  = new List <Course>();
            ListCoursesResponse response = await request.ExecuteAsync();

            courses.AddRange(response.Courses);
            return(courses);
        }
        public static async Task <TestConnectionMessage> TestAsync(Controller ct, int leaId, string userEmail, ISetupBusiness setupBusiness, CancellationToken cancellationToken)
        {
            var result = await new AuthorizationCodeMvcApp(ct, new AppFlowMetadata(leaId, setupBusiness)).
                         AuthorizeAsync(userEmail, cancellationToken).ConfigureAwait(true);

            if (result.Credential != null)
            {
                var service = new ClassroomService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = result.Credential,
                    ApplicationName       = APPLICATION_NAME
                });


                CoursesResource.ListRequest request = service.Courses.List();
                request.PageSize = 1;
                // List courses.
                try
                {
                    ListCoursesResponse response = request.Execute();

                    if (response != null)
                    {
                        var thisUser = service.UserProfiles.Get(userEmail).Execute();
                        return(new TestConnectionMessage
                        {
                            Connected = true, Message = "Successful Google Classroom connection", UserId = thisUser.Id
                        });
                    }
                    else
                    {
                        return(new TestConnectionMessage
                        {
                            Connected = false, Message = "No Google Classroom response"
                        });
                    }
                }
                catch (Exception ex)
                {
                    return(new TestConnectionMessage
                    {
                        Connected = false, Message = ex.Message
                    });
                }
            }
            else
            {
                return(new TestConnectionMessage
                {
                    Connected = false, Message = "Credential failure for Google Classroom"
                });
            }
        }
Esempio n. 3
0
        public async Task <IActionResult> ListCourses()
        {
            var cred = await _auth.GetCredentialAsync();

            var model = await LoadUserInfoAsync();

            try
            {
                using (var classroomService = new ClassroomService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = cred,
                    ApplicationName = "gc2lti"
                }))
                {
                    // Get the list of the user's courses
                    model.Courses = new List <CourseModel>();

                    var coursesRequest = classroomService.Courses.List();
                    coursesRequest.CourseStates = CoursesResource.ListRequest.CourseStatesEnum.ACTIVE;
                    coursesRequest.TeacherId    = "me";

                    ListCoursesResponse coursesResponse = null;
                    do
                    {
                        if (coursesResponse != null)
                        {
                            coursesRequest.PageToken = coursesResponse.NextPageToken;
                        }

                        coursesResponse =
                            await coursesRequest.ExecuteAsync();

                        if (coursesResponse.Courses != null)
                        {
                            foreach (var course in coursesResponse.Courses)
                            {
                                model.Courses.Add(new CourseModel
                                {
                                    CourseId   = course.Id,
                                    CourseName = course.Name
                                });
                            }
                        }
                    } while (!string.IsNullOrEmpty(coursesResponse.NextPageToken));

                    return(View("Index", model));
                }
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e));
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            UserCredential credential;

            using (var stream =
                       new FileStream("credentials-p4.json", FileMode.Open, FileAccess.Read))
            {
                // The file token.json stores the user's access and refresh tokens, and is created
                // automatically when the authorization flow completes for the first time.
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

            //Servicio

            // Create Classroom API service.
            var service = new ClassroomService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName       = ApplicationName,
            });

            // Define request parameters.
            CoursesResource.ListRequest request = service.Courses.List();
            //request.PageSize = 10;

            // List courses.
            ListCoursesResponse response = request.Execute();

            Console.WriteLine("Courses:");
            if (response.Courses != null && response.Courses.Count > 0)
            {
                foreach (var course in response.Courses)
                {
                    Console.WriteLine("{0} ({1})", course.Name, course.Id);
                    this.DtGVClases.Rows.Add(course.Id, course.Name + " - " + course.Section);
                }
            }
            else
            {
                Console.WriteLine("No courses found.");
            }
            //Console.Read();

            //Fin Servicio
        }
        static void Main(string[] args)
        {
            try
            {
                UserCredential credential;
                // Load client secrets.
                using (var stream =
                           new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
                {
                    /* The file token.json stores the user's access and refresh tokens, and is created
                     * automatically when the authorization flow completes for the first time. */
                    string credPath = "token.json";
                    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.FromStream(stream).Secrets,
                        Scopes,
                        "user",
                        CancellationToken.None,
                        new FileDataStore(credPath, true)).Result;
                    Console.WriteLine("Credential file saved to: " + credPath);
                }

                // Create Classroom API service.
                var service = new ClassroomService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName       = ApplicationName
                });

                // Define request parameters.
                CoursesResource.ListRequest request = service.Courses.List();
                request.PageSize = 10;

                // List courses.
                ListCoursesResponse response = request.Execute();
                Console.WriteLine("Courses:");
                if (response.Courses -= null || response.Courses.Count == 0)
                {
                    Console.WriteLine("No courses found.");
                    return;
                }
                foreach (var course in response.Courses)
                {
                    Console.WriteLine("{0} ({1})", course.Name, course.Id);
                }
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine(e.Message);
            }
        }
Esempio n. 6
0
        private void Run()
        {
            Scopes.AddRange(typeof(ClassroomService.Scope).GetProperties().Select(x => (string)x.GetValue(this, null)));
            Console.WriteLine(Scopes.Aggregate((x, y) => $"{x}, {y}"));
            UserCredential credential;

            using (var stream =
                       new FileStream("credentials.json", FileMode.Open, FileAccess.Read)) {
                // The file token.json stores the user's access and refresh tokens, and is created
                // automatically when the authorization flow completes for the first time.
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

            // Create Classroom API service.
            var service = new ClassroomService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName       = ApplicationName,
            });

            // Define request parameters.
            CoursesResource.ListRequest request = service.Courses.List();
            request.PageSize = 10;

            // List courses.
            ListCoursesResponse response = request.Execute();

            Console.WriteLine("Courses:");
            if (response.Courses != null && response.Courses.Count > 0)
            {
                foreach (var course in response.Courses)
                {
                    Console.WriteLine("{0} ({1})", course.Name, course.Id);
                }
            }
            else
            {
                Console.WriteLine("No courses found.");
            }

            Console.Read();
        }
        static void Main(string[] args)
        {
            UserCredential credential;

            using (var stream =
                       new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
            {
                string credPath = System.Environment.GetFolderPath(
                    System.Environment.SpecialFolder.Personal);
                credPath = Path.Combine(credPath, ".credentials/classroom.googleapis.com-dotnet-quickstart.json");

                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

            // Create Classroom API service.
            var service = new ClassroomService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName       = ApplicationName,
            });

            // Define request parameters.
            CoursesResource.ListRequest request = service.Courses.List();
            request.PageSize = 10;

            // List courses.
            ListCoursesResponse response = request.Execute();

            Console.WriteLine("Courses:");
            if (response.Courses != null && response.Courses.Count > 0)
            {
                foreach (var course in response.Courses)
                {
                    Console.WriteLine("{0} ({1})", course.Name, course.Id);
                }
            }
            else
            {
                Console.WriteLine("No courses found.");
            }
            Console.Read();
        }
Esempio n. 8
0
        public async static Task <List <Course> > GetAllStudentActiveCoursesByAccesstoken(UserCredential credential)
        {
            var service = new ClassroomService(new BaseClientService.Initializer
            {
                HttpClientInitializer = credential,
                ApplicationName       = "UbiGrade"
            });

            CoursesResource.ListRequest request = service.Courses.List();
            request.CourseStates = CoursesResource.ListRequest.CourseStatesEnum.ACTIVE;
            List <Course>       courses  = new List <Course>();
            ListCoursesResponse response = await request.ExecuteAsync();

            courses.AddRange(response.Courses);
            return(courses);
        }
        public List <Course> GetCourses(ClassroomService service)
        {
            CoursesResource.ListRequest request = service.Courses.List();
            request.PageSize = 10;

            ListCoursesResponse response = request.Execute();
            List <Course>       vsCourse = new List <Course>();

            if (response.Courses != null && response.Courses.Count > 0)
            {
                foreach (var course in response.Courses)
                {
                    vsCourse.Add(course);
                }
            }
            return(vsCourse);
        }
Esempio n. 10
0
        public List <VCourse> Initiate()
        {
            UserCredential credential;

            using (var stream =
                       new FileStream("VidhyaSadhan-4cc497c45b73.json", FileMode.Open, FileAccess.Read))
            {
                // The file token.json stores the user's access and refresh tokens, and is created
                // automatically when the authorization flow completes for the first time.
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

            var service = new ClassroomService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName       = ApplicationName,
            });

            CoursesResource.ListRequest request = service.Courses.List();
            request.PageSize = 10;

            // List courses.
            ListCoursesResponse response = request.Execute();
            List <VCourse>      vsCourse = new List <VCourse>();

            if (response.Courses != null && response.Courses.Count > 0)
            {
                foreach (var course in response.Courses)
                {
                    vsCourse.Add((VCourse)course);
                }
            }

            return(vsCourse);
        }
        /// <summary>
        /// Window loaded -- fetch the list of classes associcated with this user
        /// </summary>
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            logger.Log("Starting Assignment Create");

            // Create Classroom API service.
            var service = GoogleClassroomManager.CreateApiService();

            // Define request parameters.
            CoursesResource.ListRequest request = service.Courses.List();
            request.PageSize = 100;

            // List courses.
            ListCoursesResponse response = request.Execute();

            // populate the results
            Courses courses = new Courses();

            this.CoursesDisplay.DataContext = courses.CourseEntries;

            logger.Log("Courses:");
            Wait.Visibility   = Visibility.Hidden;
            Status.Visibility = Visibility.Visible;

            if (response.Courses != null && response.Courses.Count > 0)
            {
                foreach (var course in response.Courses)
                {
                    logger.Log($"{course.Name} ({course.Id}, {course.CourseState}");
                    courses.Add(new Classroom.Course {
                        CourseId = course.Id, CourseName = course.Name
                    });
                }
                Status.Text = "Select a course and press Create";
            }
            else
            {
                Status.Text = logger.Log("No courses found.");
            }
        }
Esempio n. 12
0
        /// <summary>
        /// 1. Collect the courseId
        /// </summary>
        public async Task <IActionResult> Course(CancellationToken cancellationToken, CourseSelectionModel model)
        {
            var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata(ClientId, ClientSecret, _context))
                         .AuthorizeAsync(cancellationToken)
                         .ConfigureAwait(false);

            if (result.Credential == null)
            {
                return(Redirect(result.RedirectUri));
            }
            model.UserId = result.Credential.UserId;

            try
            {
                using (var classroomService = new ClassroomService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = result.Credential,
                    ApplicationName = "gc2lti"
                }))
                {
                    if (!await SaveOfflineToken(cancellationToken, classroomService, result))
                    {
                        return(RedirectToAction("Course", model));
                    }

                    // Get the user's name
                    var profileRequest = classroomService.UserProfiles.Get("me");
                    var profile        = await profileRequest.ExecuteAsync(cancellationToken).ConfigureAwait(false);

                    model.PersonName = profile.Name.FullName;

                    // Get the list of the user's courses
                    var coursesRequest = classroomService.Courses.List();
                    coursesRequest.CourseStates = CoursesResource.ListRequest.CourseStatesEnum.ACTIVE;
                    coursesRequest.TeacherId    = "me";
                    ListCoursesResponse coursesResponse = null;
                    var courses = new List <SelectListItem>();
                    do
                    {
                        if (coursesResponse != null)
                        {
                            coursesRequest.PageToken = coursesResponse.NextPageToken;
                        }

                        coursesResponse =
                            await coursesRequest.ExecuteAsync(cancellationToken).ConfigureAwait(false);

                        if (coursesResponse.Courses != null)
                        {
                            courses.AddRange
                            (
                                coursesResponse.Courses.Select(c => new SelectListItem
                            {
                                Value = c.Id,
                                Text  = c.Name
                            })
                            );
                        }
                    } while (!string.IsNullOrEmpty(coursesResponse.NextPageToken));

                    model.Courses = new SelectList(courses, "Value", "Text");

                    return(View(model));
                }
            }
            catch (GoogleApiException e) when(e.Message.Contains("invalid authentication credentials"))
            {
                // Force a new UserId
                TempData.Remove("user");
                return(RedirectToAction("Course", model));
            }
            catch (TokenResponseException e) when(e.Message.Contains("invalid_grant"))
            {
                // Force a new UserId
                TempData.Remove("user");
                return(RedirectToAction("Course", model));
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e));
            }
        }
        /// <summary>
        /// Display the list of the the user's Google Classroom classes. Scopes
        /// requested: email, profile, and ClassroomService.Scope.ClassroomCoursesReadonly.
        /// </summary>
        public async Task <IActionResult> ListCourses(CancellationToken cancellationToken)
        {
            // If they haven't signed in yet, do that first
            if (!User.Identity.IsAuthenticated)
            {
                return(new ChallengeResult(new AuthenticationProperties
                {
                    RedirectUri = Url.Action("ListCourses")
                }));
            }

            // Simplify the incremental auth experience by providing a login_hint. The user will
            // not be asked to select their account if they have already signed in.
            var loginHint   = GetUserEmail();
            var accessToken = await HttpContext.GetTokenAsync("ClassList", "access_token");

            var expires = await HttpContext.GetTokenAsync("ClassList", "expires_at");

            DateTime.TryParse(expires, out var expiresAt);

            if (accessToken == null || DateTime.Now > expiresAt)
            {
                return(new ChallengeResult("ClassList", new AuthenticationProperties()
                {
                    Parameters =
                    {
                        new KeyValuePair <string, object>("login_hint",             loginHint),
                        new KeyValuePair <string, object>("include_granted_scopes", true)
                    },
                    RedirectUri = Url.Action("ListCourses")
                }));
            }

            var model = new CoursesModel();

            try
            {
                using (var classroomService = new ClassroomService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = GoogleCredential.FromAccessToken(accessToken),
                    ApplicationName = "gc2lti"
                }))
                {
                    // Get the list of the user's courses
                    model.Courses = new List <CourseModel>();

                    var coursesRequest = classroomService.Courses.List();
                    coursesRequest.CourseStates = CoursesResource.ListRequest.CourseStatesEnum.ACTIVE;
                    coursesRequest.TeacherId    = "me";

                    ListCoursesResponse coursesResponse = null;
                    do
                    {
                        if (coursesResponse != null)
                        {
                            coursesRequest.PageToken = coursesResponse.NextPageToken;
                        }

                        coursesResponse =
                            await coursesRequest.ExecuteAsync(cancellationToken).ConfigureAwait(false);

                        if (coursesResponse.Courses != null)
                        {
                            foreach (var course in coursesResponse.Courses)
                            {
                                model.Courses.Add(new CourseModel
                                {
                                    CourseId   = course.Id,
                                    CourseName = course.Name
                                });
                            }
                        }
                    } while (!string.IsNullOrEmpty(coursesResponse.NextPageToken));

                    return(View("Index", model));
                }
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e));
            }
        }
Esempio n. 14
0
        private void PopulateCourses(string customerID, string userKey, bool getStudents, bool getTeachers, bool skipMembersForArchived, BlockingCollection <GoogleCourse> completedCourses, int memberThreads)
        {
            BlockingCollection <GoogleCourse> studentsQueue   = new BlockingCollection <GoogleCourse>();
            BlockingCollection <GoogleCourse> teachersQueue   = new BlockingCollection <GoogleCourse>();
            BlockingCollection <GoogleCourse> incomingCourses = new BlockingCollection <GoogleCourse>();

            List <Task> tasks = new List <Task>();

            if (getStudents)
            {
                Task t = new Task(() => this.ConsumeStudentsQueue(memberThreads, studentsQueue, completedCourses));
                t.Start();
                tasks.Add(t);
            }

            if (getTeachers)
            {
                Task t = new Task(() => this.ConsumeTeachersQueue(memberThreads, teachersQueue, completedCourses));
                t.Start();
                tasks.Add(t);
            }

            Task t1 = new Task(() =>
            {
                using (PoolItem <ClassroomService> connection = this.classroomServicePool.Take(NullValueHandling.Ignore))
                {
                    string token = null;
                    CoursesResource.ListRequest request = new CoursesResource.ListRequest(connection.Item)
                    {
                        //PageSize = 500
                    };

                    request.PrettyPrint = false;

                    do
                    {
                        request.PageToken = token;

                        ListCoursesResponse pageResults = request.ExecuteWithRetry(RetryEvents.Backoff | RetryEvents.Timeout, RetryCount);

                        if (pageResults.Courses == null)
                        {
                            break;
                        }

                        if (pageResults.Courses == null)
                        {
                            break;
                        }

                        foreach (Course item in pageResults.Courses)
                        {
                            GoogleCourse c     = new GoogleCourse(item);
                            c.RequiresStudents = getStudents && getMembersForCourse(c.Course, skipMembersForArchived);
                            c.RequiresTeachers = getTeachers && getMembersForCourse(c.Course, skipMembersForArchived);

                            incomingCourses.Add(c);

                            if (c.RequiresStudents)
                            {
                                studentsQueue.Add(c);
                            }

                            if (c.RequiresTeachers)
                            {
                                teachersQueue.Add(c);
                            }

                            if (!c.RequiresStudents && !c.RequiresTeachers)
                            {
                                completedCourses.Add(c);
                            }
                        }

                        token = pageResults.NextPageToken;
                    } while (token != null);

                    incomingCourses.CompleteAdding();
                    studentsQueue.CompleteAdding();
                    teachersQueue.CompleteAdding();
                }
            });

            t1.Start();
            tasks.Add(t1);
            Task.WhenAll(tasks).ContinueWith((a) => completedCourses.CompleteAdding());
        }
Esempio n. 15
0
        private async Task FillInContextAndResourceInfo(CancellationToken cancellationToken, ClassroomService classroomService,
                                                        LtiRequest ltiRequest)
        {
            // Fill in the context (course) information
            if (AlternateCourseIdForSession != null)
            {
                var coursesRequest = classroomService.Courses.List();
                coursesRequest.CourseStates = CoursesResource.ListRequest.CourseStatesEnum.ACTIVE;
                ListCoursesResponse coursesResponse = null;
                do
                {
                    if (coursesResponse != null)
                    {
                        coursesRequest.PageToken = coursesResponse.NextPageToken;
                    }

                    coursesResponse = await coursesRequest.ExecuteAsync(cancellationToken).ConfigureAwait(false);

                    if (coursesResponse.Courses != null)
                    {
                        foreach (var course in coursesResponse.Courses)
                        {
                            if (Uri.TryCreate(course.AlternateLink, UriKind.Absolute,
                                              out var alternateLink))
                            {
                                var alternateCourseIdFromList =
                                    alternateLink.Segments[alternateLink.Segments.Length - 1];
                                if (alternateCourseIdFromList.Equals(AlternateCourseIdForSession))
                                {
                                    ltiRequest.ContextId    = course.Id;
                                    ltiRequest.ContextTitle = course.Name;
                                    ltiRequest.ContextType  = ContextType.CourseSection;
                                    break;
                                }
                            }
                        }
                    }
                } while (string.IsNullOrEmpty(ltiRequest.ContextId) && !string.IsNullOrEmpty(coursesResponse.NextPageToken));
            }

            // Fill in the resource (courseWork) information
            if (!string.IsNullOrEmpty(ltiRequest.ContextId))
            {
                var courseWorkRequest = classroomService.Courses.CourseWork.List(ltiRequest.ContextId);
                ListCourseWorkResponse courseWorkResponse = null;
                var thisPageUrl = Request.GetDisplayUrl();
                do
                {
                    if (courseWorkResponse != null)
                    {
                        courseWorkRequest.PageToken = courseWorkResponse.NextPageToken;
                    }

                    courseWorkResponse = await courseWorkRequest.ExecuteAsync(cancellationToken)
                                         .ConfigureAwait(false);

                    var courseWorkItem = courseWorkResponse.CourseWork?.FirstOrDefault(w =>
                                                                                       w.Materials.FirstOrDefault(m => m.Link.Url.Equals(thisPageUrl)) !=
                                                                                       null);
                    if (courseWorkItem != null)
                    {
                        ltiRequest.ResourceLinkId          = courseWorkItem.Id;
                        ltiRequest.ResourceLinkTitle       = courseWorkItem.Title;
                        ltiRequest.ResourceLinkDescription = courseWorkItem.Description;
                    }
                } while (string.IsNullOrEmpty(ltiRequest.ResourceLinkId) &&
                         !string.IsNullOrEmpty(courseWorkResponse.NextPageToken));
            }
        }
Esempio n. 16
0
        private async Task <List <ClassesViewModel> > GetClassesAsync()
        {
            string            externalAccessToken = null;
            ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();

            if (User.Identity.IsAuthenticated)
            {
                var userFromManager = await _userManager.GetUserAsync(User);

                string authenticationMethod = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.AuthenticationMethod)?.Value;
                if (authenticationMethod != null)
                {
                    externalAccessToken = await _userManager.GetAuthenticationTokenAsync(userFromManager,
                                                                                         authenticationMethod, "access_token");
                }
                else
                {
                    externalAccessToken = await _userManager.GetAuthenticationTokenAsync(userFromManager,
                                                                                         "Google", "access_token");
                }

                GoogleCredential googleCredential = GoogleCredential.FromAccessToken(externalAccessToken);
                // Create Classroom API service.
                var service = new ClassroomService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = googleCredential,
                    ApplicationName       = _configuration["ApplicationName"],
                });

                // Define request parameters.
                CoursesResource.ListRequest request = service.Courses.List();
                request.PageSize = 100;

                try
                {
                    // List courses.
                    ListCoursesResponse response = request.Execute();
                    var classes = new List <ClassesViewModel>();
                    if (response.Courses != null && response.Courses.Count > 0)
                    {
                        foreach (var course in response.Courses)
                        {
                            var courseWorksRequest        = service.Courses.CourseWork.List(course.Id);
                            ListCourseWorkResponse cwList = courseWorksRequest.Execute();

                            var studentsListRequest          = service.Courses.Students.List(course.Id);
                            ListStudentsResponse studentList = studentsListRequest.Execute();

                            classes.Add(new ClassesViewModel
                            {
                                Name             = course.Name,
                                Id               = course.Id,
                                Description      = course.Description,
                                CourseWorksCount = cwList?.CourseWork?.Count,
                                StudentsCount    = studentList?.Students?.Count
                            });
                        }
                    }

                    return(classes);
                }
                catch (Exception err)
                {
                    return(new List <ClassesViewModel>());
                }
            }

            return(new List <ClassesViewModel>());
        }