예제 #1
0
        private async Task <LmsUserDTO> FetchCourseUser(string userId, string domain, string userToken, int courseId)
        {
            try
            {
                Validate(domain, userToken);

                var client = CreateRestClient(domain);

                var link = string.Format("/api/v1/courses/{0}/users/{1}?include[]=email&include[]=enrollments",
                                         courseId, userId);

                RestRequest request = CreateRequest(domain, link, Method.GET, userToken);

                IRestResponse <CanvasLmsUserDTO> response = await client.ExecuteTaskAsync <CanvasLmsUserDTO>(request);

                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    // NOTE: user not longer exists in Canvas - return null;
                    return(null);
                }

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    _logger.ErrorFormat("[EGCEnabledCanvasAPI.FetchCourseUser] API:{0}. UserToken:{1}. CourseId:{2}. UserId:{3}. {4}",
                                        domain, userToken, courseId, userId, BuildInformation(response));
                    throw new InvalidOperationException(string.Format("[EGCEnabledCanvasAPI.FetchCourseUser] Canvas returns '{0}'", response.StatusDescription));
                }

                var user = response.Data;
                if (user == null)
                {
                    return(null);
                }
                if (!user.enrollments.Any(x => x.course_id == courseId && x.enrollment_state == CanvasEnrollment.EnrollmentState.Active))
                {
                    return(null);
                }

                var result = new LmsUserDTO
                {
                    Id           = user.Id,
                    Email        = user.Email,
                    Login        = user.login_id,
                    Name         = user.Name,
                    PrimaryEmail = user.Email,
                    LmsRole      = SetRole(user, courseId)
                };

                return(result);
            }
            catch (Exception ex)
            {
                _logger.ErrorFormat(ex, "[EGCEnabledCanvasAPI.FetchCourseUser] API:{0}. UserToken:{1}. CourseId:{2}. UserId:{3}.", domain, userToken, courseId, userId);
                throw;
            }
        }
예제 #2
0
        public void CheckAndSetNoneACMapping(LmsUserDTO user, ILmsLicense lmsCompany)
        {
            LmsCompanyRoleMapping mapping = lmsCompany.RoleMappings
                                            .FirstOrDefault(x => x.LmsRoleName.Equals(user.LmsRole, StringComparison.OrdinalIgnoreCase));

            if (mapping != null && mapping.AcRole == AcRole.None.Id) // LMS role is set to be not mapped to any AC role
            {
                user.AcRole = AcRole.None.Id;
            }
        }
예제 #3
0
        public MeetingPermissionId SetAcRole(ILmsLicense lmsCompany, LmsUserDTO u, bool ignoreEmptyACRole = false)
        {
            string role = u.LmsRole != null?u.LmsRole.ToLower() : string.Empty;

            var permission = MeetingPermissionId.view;

            u.AcRole = AcRole.Participant.Id;
            if (string.IsNullOrWhiteSpace(u.Id) || u.Id.Equals("0"))
            {
                permission = MeetingPermissionId.remove;
                u.AcRole   = null; // "Remove"; // probably doesn't make sence, need to review and remove
            }

            LmsCompanyRoleMapping mapping = lmsCompany.RoleMappings.FirstOrDefault(x => x.LmsRoleName.Equals(role, StringComparison.OrdinalIgnoreCase));

            if (mapping != null)
            {
                if (mapping.AcRole == AcRole.None.Id)
                {
                    if (!ignoreEmptyACRole)
                    {
                        permission = AcRole.None.MeetingPermissionId;
                        u.AcRole   = AcRole.None.Id;
                    }

                    return(permission);
                }
                else
                {
                    AcRole acRole = AcRole.GetById(mapping.AcRole);
                    u.AcRole = acRole.Id;
                    return(acRole.MeetingPermissionId);
                }
            }

            if (role.Contains("teacher") || role.Contains("instructor") || role.Contains("owner") ||
                role.Contains("admin") || role.Contains("lecture"))
            {
                permission = MeetingPermissionId.host;
                u.AcRole   = AcRole.Host.Id;
            }
            else if (role.Contains("ta") || role.Contains("designer") || role.Contains("author") ||
                     role.Contains("teaching assistant") || role.Contains("course builder") ||
                     role.Contains("grader") || role == "advisor")
            {
                u.AcRole   = AcRole.Presenter.Id;
                permission = MeetingPermissionId.mini_host;
            }

            return(permission);
        }
예제 #4
0
        private static LmsUserDTO ParseUser(XElement node)
        {
            var user = node.Element("user");

            var info = new LmsUserDTO()
            {
                Id         = node.Attribute("user_id").Value,
                LmsRole    = node.Attribute("role").Value == "S" ? "Student" : "Teacher",
                Login      = user.Attribute("login").Value,
                Email      = user.Attribute("email")?.Value ?? user.Attribute("unconfirmed_email")?.Value,
                Name       = user.Attribute("first_name").Value + " " + user.Attribute("last_name").Value,
                SectionIds = node.Elements("section").Select(s => s.Attribute("id").Value).ToList()
            };

            return(info);
        }
예제 #5
0
        public virtual OperationResultWithData <LmsUserDTO> AddNewUser([FromBody] AddUserDto request)
        {
            try
            {
                // TODO: use FeatureName but this settings has true as default value
                if (!LmsCompany.GetSetting <bool>(LmsLicenseSettingNames.EnableAddGuest, true))
                {
                    return(OperationResultWithData <LmsUserDTO> .Error("Operation is not enabled."));
                }
                var       provider = GetAdminProvider();
                Principal principal;

                try
                {
                    if (string.IsNullOrWhiteSpace(request.PrincipalId))
                    {
                        principal = CreatePrincipal(request, LmsCompany, provider);
                    }
                    else
                    {
                        principal = provider.GetOneByPrincipalId(request.PrincipalId).PrincipalInfo.Principal;
                    }
                }
                catch (WarningMessageException ex)
                {
                    return(OperationResultWithData <LmsUserDTO> .Error(ex.Message));
                }

                // HACK: LmsMeetingType.Meeting param - not in use here
                LmsCourseMeeting meeting = MeetingSetup.GetCourseMeeting(LmsCompany, CourseId, request.MeetingId, LmsMeetingType.Meeting);

                // TODO: review for user-sync mode
                MeetingPermissionCollectionResult meetingEnrollments = provider.GetAllMeetingEnrollments(meeting.GetMeetingScoId());
                if (meetingEnrollments.Status.Code != StatusCodes.ok)
                {
                    string errorMessage = GetOutputErrorMessage(
                        string.Format("AcUserController.AddNewUser.GetAllMeetingEnrollments. Status.Code: {0}, Status.SubCode: {1}.",
                                      meetingEnrollments.Status.Code,
                                      meetingEnrollments.Status.SubCode));

                    return(OperationResultWithData <LmsUserDTO> .Error(errorMessage));
                }
                if (meetingEnrollments.Values.Any(x => x.PrincipalId == principal.PrincipalId))
                {
                    return(OperationResultWithData <LmsUserDTO> .Error(Messages.UserIsAlreadyParticipant));
                }

                AcRole     role   = AcRole.GetById(request.MeetingRole);
                StatusInfo status = provider.UpdateScoPermissionForPrincipal(meeting.GetMeetingScoId(), principal.PrincipalId, role.MeetingPermissionId);

                // Add user as guest to DB
                var guest = new LmsCourseMeetingGuest
                {
                    PrincipalId      = principal.PrincipalId,
                    LmsCourseMeeting = meeting,
                };

                meeting.MeetingGuests.Add(guest);
                this.LmsCourseMeetingModel.RegisterSave(meeting, flush: true);

                var result = new LmsUserDTO
                {
                    GuestId = guest.Id,
                    AcId    = guest.PrincipalId,
                    Name    = principal.Name,
                    AcRole  = request.MeetingRole,
                };

                return(result.ToSuccessResult());
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("AcUserController.AddNewUser", ex);
                return(OperationResultWithData <LmsUserDTO> .Error(errorMessage));
            }
        }
예제 #6
0
        public async Task <(string url, string breezeSession)> JoinRecording(ILmsLicense lmsCompany, LtiParamDTO param, string recordingUrl,
                                                                             IAdobeConnectProxy provider, string mode = null)
        {
            LmsUserDTO lmsUserDto = null;

            var acRecordingScoResult = provider.GetScoByUrl(recordingUrl);

            if (!acRecordingScoResult.Success)
            {
                logger.Error(string.Format("[AdobeConnectProxy Error] {0}. Recording url:{1}", acRecordingScoResult.Status.GetErrorInfo(), recordingUrl));
                throw new AdobeConnectException(acRecordingScoResult.Status);
            }

            var lmsUser = lmsUserModel.GetOneByUserIdAndCompanyLms(param.lms_user_id, lmsCompany.Id).Value;

            if (lmsUser == null)
            {
                throw new Core.WarningMessageException(string.Format("No user with id {0} found in the database.",
                                                                     param.lms_user_id));
            }

            var courseMeetings = this.lmsCourseMeetingModel.GetByCompanyAndScoId(lmsCompany, acRecordingScoResult.ScoInfo.FolderId, 0);
            // for AC provisioning courseMeeting.scoId() is used, so here we can take only first record if Dynamic provisioning is enabled for at least one meeting
            // if sync is enabled then all meetings with the same scoId should have the same users roster and the same value of EnableDynamicProvisioning property
            var courseMeeting = courseMeetings.FirstOrDefault(x => x.EnableDynamicProvisioning);

            if (courseMeeting != null &&
                (LmsMeetingType)courseMeeting.LmsMeetingType != LmsMeetingType.StudyGroup &&
                lmsCompany.UseSynchronizedUsers)
            {
                var lmsUserDtoRes = await usersSetup.GetOrCreateUserWithAcRole(lmsCompany, provider, param, courseMeeting, param.lms_user_id);

                lmsUserDto = lmsUserDtoRes.Data;
                if (!lmsUserDtoRes.IsSuccess)
                {
                    throw new Core.WarningMessageException(
                              string.Format(
                                  "[Dynamic provisioning] Could not create user, id={0}. Message: {1}",
                                  param.lms_user_id, lmsUserDtoRes.Message));
                }

                meetingSetup.ProcessDynamicProvisioning(provider, lmsCompany, courseMeeting, lmsUser, lmsUserDto);
            }

            var    loginResult = meetingSetup.ACLogin(lmsCompany, param, lmsUser, provider);
            string breezeToken = loginResult.BreezeSession;

            meetingSetup.ProcessGuestAuditUsers(provider, lmsCompany, acRecordingScoResult.ScoInfo.FolderId,
                                                loginResult.User.PrincipalId, param, () => courseMeetings);

            var baseUrl       = lmsCompany.AcServer + "/" + recordingUrl;
            var breezeSession = breezeToken ?? string.Empty;

            var url = string.Format(
                "{0}?{1}{2}{3}",
                baseUrl,
                mode != null ? string.Format("pbMode={0}", mode) : string.Empty,
                mode != null && !lmsCompany.LoginUsingCookie.GetValueOrDefault() ? "&" : string.Empty,
                !lmsCompany.LoginUsingCookie.GetValueOrDefault() && breezeToken != null
                    ? "session=" + breezeToken
                    : string.Empty);

            return(url, breezeSession);
        }
예제 #7
0
        public override async Task <OperationResultWithData <List <LmsUserDTO> > > GetUsers(Dictionary <string, object> licenseSettings,
                                                                                            string courseId, ILtiUserListParam param = null)
        {
            if (licenseSettings == null)
            {
                throw new ArgumentNullException(nameof(licenseSettings));
            }

            if (string.IsNullOrEmpty((string)licenseSettings[LmsUserSettingNames.Token]))
            {
                Logger.WarnFormat("[GetD2LUsers]: Admin Token does not exist for LmsCompany key: {1}.", licenseSettings[LmsLicenseSettingNames.LicenseKey]);
                throw new WarningMessageException(Resources.Messages.NoLicenseAdmin);
            }

            string[] tokens = ((string)licenseSettings[LmsUserSettingNames.Token]).Split(' ');

            // get course users list
            var classlistEnrollments = d2lApiService.GetApiObjects <List <ClasslistUser> >(
                tokens[0],
                tokens[1],
                (string)licenseSettings[LmsLicenseSettingNames.LmsDomain],
                string.Format(
                    d2lApiService.EnrollmentsClasslistUrlFormat,
                    (string)this.settings.BrightspaceApiVersion,
                    courseId),
                licenseSettings);

            // mapping to LmsUserDTO
            var result = new List <LmsUserDTO>();

            if (classlistEnrollments != null)
            {
                // get enrollments - this information contains user roles
                var enrollmentsList = new List <OrgUnitUser>();
                PagedResultSet <OrgUnitUser> enrollments = null;
                do
                {
                    enrollments = d2lApiService.GetApiObjects <PagedResultSet <OrgUnitUser> >(
                        tokens[0],
                        tokens[1],
                        (string)licenseSettings[LmsLicenseSettingNames.LmsDomain],
                        string.Format(
                            d2lApiService.EnrollmentsUrlFormat,
                            (string)this.settings.BrightspaceApiVersion,
                            courseId)
                        + (enrollments != null ? "?bookmark=" + enrollments.PagingInfo.Bookmark : string.Empty),
                        licenseSettings);
                    if (enrollments == null || enrollments.Items == null)
                    {
                        var error = "Incorrect API call or returned data. Please contact site administrator";
                        Logger.Error("[D2L Enrollments]: Object returned from API has null value");
                        return(OperationResultWithData <List <LmsUserDTO> > .Error(error));
                    }

                    enrollmentsList.AddRange(enrollments.Items);
                } while (enrollments.PagingInfo.HasMoreItems && !string.IsNullOrEmpty(enrollments.PagingInfo.Bookmark));


                string currentLmsUserId = param?.lms_user_id;

                // current user is not enrolled to this course (user is admin) -> add him to user list
                if (AllowAdminAdditionToCourse && classlistEnrollments.All(x => x.Identifier != currentLmsUserId))
                {
                    var currentLmsUser = lmsUserModel.GetOneByUserIdAndCompanyLms(currentLmsUserId, (int)licenseSettings[LmsLicenseSettingNames.LicenseId]).Value;

                    if ((currentLmsUser != null) && !string.IsNullOrEmpty(currentLmsUser.Token))
                    {
                        string[] currentUserTokens = currentLmsUser.Token.Split(' ');

                        var currentUserInfo = d2lApiService.GetApiObjects <WhoAmIUser>(
                            currentUserTokens[0],
                            currentUserTokens[1],
                            (string)licenseSettings[LmsLicenseSettingNames.LmsDomain],
                            string.Format(d2lApiService.WhoAmIUrlFormat, (string)this.settings.BrightspaceApiVersion),
                            licenseSettings);

                        if (currentUserInfo != null)
                        {
                            //
                            var userInfo = d2lApiService.GetApiObjects <UserData>(tokens[0], tokens[1],
                                                                                  (string)licenseSettings[LmsLicenseSettingNames.LmsDomain],
                                                                                  string.Format(d2lApiService.GetUserUrlFormat, (string)this.settings.BrightspaceApiVersion,
                                                                                                currentUserInfo.Identifier),
                                                                                  licenseSettings);

                            classlistEnrollments.Add(
                                new ClasslistUser
                            {
                                Identifier  = currentUserInfo.Identifier,
                                Username    = currentUserInfo.UniqueName,
                                DisplayName = currentUserInfo.FirstName + " " + currentUserInfo.LastName,
                                Email       = userInfo.ExternalEmail, // TODO: is it OK??
                            });
                        }
                    }
                }

                foreach (ClasslistUser enrollment in classlistEnrollments)
                {
                    OrgUnitUser userInfo =
                        enrollmentsList.FirstOrDefault(e => e.User.Identifier == enrollment.Identifier);

                    var user = new LmsUserDTO
                    {
                        Id      = enrollment.Identifier,
                        Login   = enrollment.Username,
                        Name    = enrollment.GetValidFullName(),
                        Email   = enrollment.Email ?? userInfo?.User.EmailAddress,
                        LmsRole = userInfo != null ? userInfo.Role.Name : "Unknown",
                    };
                    result.Add(user);
                }
            }

            return(result.ToSuccessResult());
        }
예제 #8
0
        public async Task <OperationResultWithData <IEnumerable <LmsUserDTO> > > UpdateUser([FromBody] CourseUsersDto request)
        {
            var    credentials  = LmsCompany;
            string lastError    = null;
            var    updatedUsers = new List <LmsUserDTO>();

            foreach (var user in request.Users)
            {
                try
                {
                    LmsUserDTO updatedUser = null;
                    string     error;
                    if (user.GuestId.HasValue)
                    {
                        updatedUser = this.UsersSetup.UpdateGuest(
                            credentials,
                            GetAdminProvider(),
                            Session.LtiSession.LtiParam,
                            user,
                            request.MeetingId,
                            out error);
                    }
                    else
                    {
                        var updatedUserRes = await UsersSetup.UpdateUser(
                            credentials,
                            GetAdminProvider(),
                            Session.LtiSession.LtiParam,
                            user,
                            request.MeetingId);

                        updatedUser = updatedUserRes.Data;
                        error       = updatedUserRes.Message;
                    }

                    if (!string.IsNullOrEmpty(error))
                    {
                        Logger.Error($"[UpdateUsers] {error}. UserId={user.Id}, MeetingId={request.MeetingId}");
                        lastError = error;
                    }
                    else
                    {
                        // TRICK: if user not found in LMS - return original record from client  (remove user from meeting participant list - user doesn't exist in LMS)
                        updatedUsers.Add(updatedUser ?? user);
                    }
                }
                catch (Exception ex)
                {
                    lastError = GetOutputErrorMessage("UpdateUsers", ex);
                    Logger.Error($"[RemoveUsers] UserId={user.Id}, MeetingId={request.MeetingId}, {lastError}", ex);
                }
            }

            if (string.IsNullOrEmpty(lastError))
            {
                return(updatedUsers.AsEnumerable().ToSuccessResult());
            }

            return(new OperationResultWithData <IEnumerable <LmsUserDTO> >
            {
                Message = Messages.UsersCouldNotBeUpdated,
                Data = updatedUsers
            });
        }