示例#1
0
        public virtual async Task <OperationResult> ConvertWithSubtitles([FromBody] RecordingActionRequestDto input)
        {
            try
            {
                string licenseKey = LmsCompany.GetSetting <string>(LmsLicenseSettingNames.Mp4ServiceWithSubtitlesLicenseKey);
                if (string.IsNullOrWhiteSpace(licenseKey))
                {
                    throw new WarningMessageException("Can't find your MP4Service license. Contact administrator.");
                }

                Guid license;
                if (!Guid.TryParse(licenseKey, out license))
                {
                    throw new WarningMessageException("Invalid MP4Service license. Contact administrator.");
                }

                return(await Mp4ApiUtility.DoConvert(Mp4Client,
                                                     license,
                                                     MP4Service.Contract.Client.LicenseType.MP4WithSubtitles,
                                                     input.RecordingId,
                                                     null,
                                                     Logger).ConfigureAwait(false));
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("ConvertWithSubtitles", ex);
                return(OperationResult.Error(errorMessage));
            }
        }
示例#2
0
        public virtual async Task <OperationResultWithData <Mp4TaskStatusDto> > GetRecordingStatus([FromBody] RecordingActionRequestDto input)
        {
            try
            {
                Guid mp4;
                if (!Guid.TryParse(LmsCompany.GetSetting <string>(LmsLicenseSettingNames.Mp4ServiceLicenseKey), out mp4))
                {
                    mp4 = Guid.Empty;
                }
                Guid mp4Subtitles;
                if (!Guid.TryParse(LmsCompany.GetSetting <string>(LmsLicenseSettingNames.Mp4ServiceWithSubtitlesLicenseKey), out mp4Subtitles))
                {
                    mp4Subtitles = Guid.Empty;
                }

                if ((mp4 != Guid.Empty) || (mp4Subtitles != Guid.Empty))
                {
                    var mp4Client = IoC.Resolve <TaskClient>();
                    return(await Mp4ApiUtility.GetRecordingStatus(mp4Client, input.RecordingId,
                                                                  mp4,
                                                                  mp4Subtitles,
                                                                  _mp4LinkBuilder,
                                                                  _vttLinkBuilder,
                                                                  Logger));
                }

                return(OperationResultWithData <Mp4TaskStatusDto> .Error("No MP4 license found"));
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("MP4-GetRecordings", ex);
                return(OperationResultWithData <Mp4TaskStatusDto> .Error(errorMessage));
            }
        }
示例#3
0
 private void ProcessTelephony(CompanyLmsDTO dto, LmsCompany instance)
 {
     if (dto.Telephony != null)
     {
         UpdateOrDeleteSetting(instance, LmsLicenseSettingNames.Telephony.ActiveProfile,
                               dto.Telephony.ActiveProfile);
         UpdateOrDeleteSetting(instance, LmsLicenseSettingNames.Telephony.CourseMeetingOption,
                               dto.Telephony.CourseMeetingOption);
         UpdateOrDeleteSetting(instance, LmsLicenseSettingNames.Telephony.OfficeHoursOption,
                               dto.Telephony.OfficeHoursOption);
         UpdateOrDeleteSetting(instance, LmsLicenseSettingNames.Telephony.StudyGroupOption,
                               dto.Telephony.StudyGroupOption);
         if (dto.Telephony.MeetingOne != null)
         {
             UpdateOrDeleteSetting(instance, LmsLicenseSettingNames.Telephony.MeetingOne.OwningAccountNumber,
                                   dto.Telephony.MeetingOne.OwningAccountNumber);
             UpdateOrDeleteSetting(instance, LmsLicenseSettingNames.Telephony.MeetingOne.UserName,
                                   dto.Telephony.MeetingOne.UserName);
             UpdateOrDeleteSetting(instance, LmsLicenseSettingNames.Telephony.MeetingOne.SecretHashKey,
                                   dto.Telephony.MeetingOne.SecretHashKey);
         }
         if (dto.Telephony.Arkadin != null)
         {
             UpdateOrDeleteSetting(instance, LmsLicenseSettingNames.Telephony.Arkadin.UserName,
                                   dto.Telephony.Arkadin.UserName);
         }
     }
 }
示例#4
0
        public virtual async Task <OperationResult> UpdateMeetingCourseSections([FromBody] UpdateCourseSectionsDto updateCourseSectionsDto)
        {
            if (!LmsCompany.GetSetting <bool>(LmsLicenseSettingNames.UseCourseSections))
            {
                return(OperationResult.Error("License doesn't support 'Sections' feature"));
            }

            var param = Session.LtiSession.LtiParam;
            var ac    = GetAdminProvider();

            try
            {
                await meetingSetup.UpdateMeetingCourseSectionsAsync(LmsCompany, updateCourseSectionsDto, param);

                var users = await usersSetup.GetUsers(LmsCompany,
                                                      ac,
                                                      param.course_id,
                                                      param,
                                                      updateCourseSectionsDto.MeetingId);

                return(users.Item2 != null
                    ? OperationResult.Error(users.Item2)
                    : users.Item1.ToSuccessResult());
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("UpdateMeetingCourseSections", ex);
                return(OperationResult.Error(errorMessage));
            }
        }
示例#5
0
        private void ProcessAc(LmsCompany lmsCompany)
        {
            IAdobeConnectProxy provider = IoC.Resolve <IAdobeConnectAccountService>().GetProvider(lmsCompany);

            var stopwatch = Stopwatch.StartNew();

            var result = provider.GetAllPrincipals();

            stopwatch.Stop();
            var acTime = stopwatch.Elapsed;

            if (!result.Success)
            {
                _log.WriteLine("    GetAllPrincipals Issue:" + result.Status.Code);
                return;
            }

            stopwatch = Stopwatch.StartNew();

            var table = new AcCacheDataSet.AcCachePrincipalDataTable();

            foreach (Principal p in result.Values)
            {
                AddToTable(table, p, lmsCompany.Id);
            }
            BatchBulkCopy(table, "AcCachePrincipal", 500);

            stopwatch.Stop();
            var dbTime = stopwatch.Elapsed;

            _log.WriteLine("    PrincipalCount: " + result.Values.Count() + ". AC fetch time: " + acTime.ToString() + ". DB save time: " + dbTime.ToString());
        }
示例#6
0
        public OperationResultWithData <IEnumerable <ScoShortcutDto> > GetShortcuts()
        {
            try
            {
                if (!LmsCompany.GetSetting <bool>(LmsCompanySettingNames.EnableMyContent))
                {
                    return(OperationResultWithData <IEnumerable <ScoShortcutDto> > .Error("Operation is not enabled."));
                }

                var param = Session.LtiSession.LtiParam;
                var ac    = this.GetUserProvider();

                var lmsUser = _lmsUserModel.GetOneByUserIdAndCompanyLms(param.lms_user_id, LmsCompany.Id).Value;

                var contentService = new ContentService(Logger, ac);
                IEnumerable <ScoShortcut> shortcuts = contentService.GetShortcuts(new ScoShortcutType[] { ScoShortcutType.content, ScoShortcutType.my_content });

                var result = shortcuts.Select(x => new ScoShortcutDto
                {
                    ScoId = x.ScoId,
                    Type  = x.Type,
                    Name  = Resources.ScoShortcutNames.ResourceManager.GetString(x.Type.Replace('-', '_')), // TRICK: AC trick to change my-content to my_content
                });

                return(result.ToSuccessResult());
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("ContentApi-GetShortcuts", ex);
                return(OperationResultWithData <IEnumerable <ScoShortcutDto> > .Error(errorMessage));
            }
        }
示例#7
0
 public MeetingFolderBuilder(LmsCompany lmsCompany, IAdobeConnectProxy provider, bool useLmsUserEmailForSearch, LmsMeetingType lmsMeetingType = LmsMeetingType.Meeting)
 {
     _lmsCompany = lmsCompany ?? throw new ArgumentNullException(nameof(lmsCompany));
     _provider   = provider ?? throw new ArgumentNullException(nameof(provider));
     _useLmsUserEmailForSearch = useLmsUserEmailForSearch;
     _lmsMeetingType           = lmsMeetingType;
 }
示例#8
0
        private string LoginCurrentUser(LmsUserSession session)
        {
            LmsCompany lmsCompany = null;

            try
            {
                lmsCompany = session.LmsCompany;
                var param        = session.LtiSession.LtiParam;
                var LmsUserModel = IoC.Resolve <LmsUserModel>();
                var lmsUser      = LmsUserModel.GetOneByUserIdAndCompanyLms(param.lms_user_id, lmsCompany.Id).Value;
                if (lmsUser == null)
                {
                    throw new Core.WarningMessageException($"No user with id {param.lms_user_id} found in the database.");
                }

                if (lmsUser.PrincipalId == null)
                {
                    throw new Core.WarningMessageException("User doesn't have account in Adobe Connect.");
                }

                var ac             = GetAdminProvider(lmsCompany);
                var registeredUser = ac.GetOneByPrincipalId(lmsUser.PrincipalId).PrincipalInfo.Principal;

                var    MeetingSetup = IoC.Resolve <MeetingSetup>();
                string breezeToken  = MeetingSetup.ACLogin(lmsCompany, param, lmsUser, registeredUser, ac);

                return(breezeToken);
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("ContentApi-LoginCurrentUser", ex);
                throw;
            }
        }
示例#9
0
        public TelephonyDTO(LmsCompany instance)
        {
            if (instance == null)
            {
                throw new ArgumentNullException(nameof(instance));
            }


            ActiveProfile = instance.GetSetting <string>(LmsLicenseSettingNames.Telephony.ActiveProfile);

            CourseMeetingOption = instance.GetSetting <int>(LmsLicenseSettingNames.Telephony.CourseMeetingOption);
            OfficeHoursOption   = instance.GetSetting <int>(LmsLicenseSettingNames.Telephony.OfficeHoursOption);
            StudyGroupOption    = instance.GetSetting <int>(LmsLicenseSettingNames.Telephony.StudyGroupOption);

            MeetingOne = new TelephonyMeetingOneDTO
            {
                OwningAccountNumber = instance.GetSetting <string>(LmsLicenseSettingNames.Telephony.MeetingOne.OwningAccountNumber),
                UserName            = instance.GetSetting <string>(LmsLicenseSettingNames.Telephony.MeetingOne.UserName),
                SecretHashKey       = instance.GetSetting <string>(LmsLicenseSettingNames.Telephony.MeetingOne.SecretHashKey),
            };

            Arkadin = new TelephonyArkadinDTO
            {
                UserName = instance.GetSetting <string>(LmsLicenseSettingNames.Telephony.Arkadin.UserName),
            };
        }
示例#10
0
        public OperationResultWithData <FolderDto> CreateSubFolder(string folderScoId, [FromBody] FolderDto dto)
        {
            if (dto == null)
            {
                throw new ArgumentNullException(nameof(dto));
            }

            try
            {
                if (!LmsCompany.GetSetting <bool>(LmsCompanySettingNames.EnableMyContent))
                {
                    return(OperationResultWithData <FolderDto> .Error("Operation is not enabled."));
                }

                // TRICK:
                dto.FolderId = folderScoId;

                var ac     = this.GetUserProvider();
                var helper = new ContentEditControllerHelper(Logger, ac);
                return(helper.CreateFolder(dto));
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("ContentApi-CreateSubFolder", ex);
                return(OperationResultWithData <FolderDto> .Error(errorMessage));
            }
        }
示例#11
0
        private static bool LicenseExpired(LmsCompany lmsCompany)
        {
            var companyModel = IoC.Resolve <CompanyModel>();
            var company      = companyModel.GetOneById(lmsCompany.CompanyId).Value;

            return((company == null) || !company.IsActive());
        }
示例#12
0
        //#region Public Methods and Operators

        ///// <summary>
        ///// The login and create a session.
        ///// </summary>
        ///// <param name="error">
        ///// The error.
        ///// </param>
        ///// <param name="lmsDomain">
        ///// The LMS domain.
        ///// </param>
        ///// <param name="userName">
        ///// The user name.
        ///// </param>
        ///// <param name="password">
        ///// The password.
        ///// </param>
        ///// <returns>
        ///// The <see cref="Session"/>.
        ///// </returns>
        //internal Session LoginAndCreateASession(out string error, string lmsDomain, string userName, string password)
        //{
        //    try
        //    {
        //        var session = new Session("EduGameCloud", (string)this.settings.AgilixBuzzApiUrl) { Verbose = true };
        //        string userPrefix = lmsDomain.ToLower()
        //            .Replace(".agilixbuzz.com", string.Empty)
        //            .Replace("www.", string.Empty);

        //        XElement result = session.Login(userPrefix, userName, password);
        //        if (!Session.IsSuccess(result))
        //        {
        //            error = "DLAP. Unable to login: "******"string(user/@domainid)").ToString();
        //        return session;
        //    }
        //    catch (Exception ex)
        //    {
        //        error = ex.Message;
        //        return null;
        //    }
        //}

        //public bool LoginAndCheckSession(out string error, string lmsDomain, string userName, string password)
        //{
        //    Session session = LoginAndCreateASession(out error, lmsDomain, userName, password);
        //    return session != null;
        //}

        /////// <summary>
        /////// The create announcement.
        /////// </summary>
        /////// <param name="credentials">
        /////// The credentials.
        /////// </param>
        /////// <param name="courseId">
        /////// The course id.
        /////// </param>
        /////// <param name="announcementTitle">
        /////// The announcement title.
        /////// </param>
        /////// <param name="announcementMessage">
        /////// The announcement message.
        /////// </param>
        /////// <param name="error">
        /////// The error.
        /////// </param>
        /////// <param name="session">
        /////// The session.
        /////// </param>
        ////public void CreateAnnouncement(LmsCompany credentials, int courseId, string announcementTitle, string announcementMessage, out string error, Session session = null)
        ////{
        ////    XElement courseResult = this.LoginIfNecessary(
        ////        session,
        ////        s =>
        ////        s.Get(Commands.Courses.GetOne, string.Format(Parameters.Courses.GetOne, courseId).ToParams()),
        ////        credentials,
        ////        out error);
        ////    if (courseResult == null)
        ////    {
        ////        error = error ?? "DLAP. Unable to retrive course from API";
        ////        return;
        ////    }

        ////    if (!Session.IsSuccess(courseResult))
        ////    {
        ////        error = "DLAP. Unable to get course: " + Session.GetMessage(courseResult);
        ////        this.logger.Error(error);
        ////    }

        ////    if (session != null)
        ////    {
        ////        /*[<roles>
        ////        When entityid refers to a course or section, the recipient roles within the course or section for this announcement.
        ////        <role flags="enum" />
        ////        . . .
        ////        </roles>]*/
        ////        var course = courseResult.XPathSelectElement("/course");
        ////        var courseName = course.XPathEvaluate("string(@title)").ToString();
        ////        var courseStartDate = course.XPathEvaluate("string(@startdate)").ToString();
        ////        var courseEndDate = course.XPathEvaluate("string(@enddate)").ToString();
        ////        var announcementName = Guid.NewGuid().ToString("N") + ".zip";
        ////        //// var groupsXml = this.FormatGroupsXml(session, courseId);

        ////        // ReSharper disable once UnusedVariable
        ////        XElement announcementResult = session.Post(
        ////            Commands.Announcements.Put + "&"
        ////            + string.Format(Parameters.Announcements.Put, courseId, announcementName),
        ////            new XElement(
        ////                "announcement",
        ////                new XAttribute("to", courseName),
        ////                new XAttribute("entityid", courseId),
        ////                new XAttribute("title", announcementTitle),
        ////                new XAttribute("startdate", courseStartDate),
        ////                new XAttribute("enddate", courseEndDate),
        ////                new XAttribute("recurse", "false"),
        ////                new XElement("body", new XCData(announcementMessage))));
        ////    }
        ////}

        ///// <summary>
        ///// The get users for course.
        ///// </summary>
        ///// <param name="company">
        ///// The company.
        ///// </param>
        ///// <param name="courseid">
        ///// The course id.
        ///// </param>
        ///// <param name="error">
        ///// The error.
        ///// </param>
        ///// <param name="session">
        ///// The session.
        ///// </param>
        ///// <returns>
        ///// The <see cref="List{LmsUserDTO}"/>.
        ///// </returns>
        //public List<LmsUserDTO> GetUsersForCourse(
        //    LmsCompany company,
        //    int courseid,
        //    out string error,
        //    object extraData)
        //{
        //    Session session = extraData as Session;

        //    var result = new List<LmsUserDTO>();
        //    XElement enrollmentsResult = this.LoginIfNecessary(
        //        session,
        //        s =>
        //        s.Get(
        //            Commands.Enrollments.List,
        //            string.Format(Parameters.Enrollments.List, s.DomainId, courseid).ToParams()),
        //            company,
        //            out error);
        //    if (enrollmentsResult == null)
        //    {
        //        error = error ?? "DLAP. Unable to retrive result from API";
        //        return result;
        //    }

        //    if (!Session.IsSuccess(enrollmentsResult))
        //    {
        //        error = "DLAP. Unable to create user: "******"/enrollments/enrollment");
        //    foreach (XElement enrollment in enrollments)
        //    {
        //        string privileges = enrollment.XPathEvaluate("string(@privileges)").ToString();
        //        string status = enrollment.XPathEvaluate("string(@status)").ToString();
        //        XElement user = enrollment.XPathSelectElement("user");
        //        if (!string.IsNullOrWhiteSpace(privileges) && user != null && this.IsEnrollmentActive(status))
        //        {
        //            var role = ProcessRole(privileges);
        //            string userId = user.XPathEvaluate("string(@id)").ToString();
        //            string firstName = user.XPathEvaluate("string(@firstname)").ToString();
        //            string lastName = user.XPathEvaluate("string(@lastname)").ToString();
        //            string userName = user.XPathEvaluate("string(@username)").ToString();
        //            string email = user.XPathEvaluate("string(@email)").ToString();
        //            result.Add(
        //                new LmsUserDTO
        //                    {
        //                        lms_role = role,
        //                        primary_email = email,
        //                        login_id = userName,
        //                        id = userId,
        //                        name = firstName + " " + lastName,
        //                    });
        //        }
        //    }

        //    return result;
        //}

        ///// <summary>
        ///// The is enrollment active.
        ///// </summary>
        ///// <param name="enrollmentStatus">
        ///// The enrollment status.
        ///// </param>
        ///// <returns>
        ///// The <see cref="bool"/>.
        ///// </returns>
        //public bool IsEnrollmentActive(string enrollmentStatus)
        //{
        //    switch (enrollmentStatus)
        //    {
        //        case "4": ////Withdrawn
        //        case "5": ////WithdrawnFailed
        //        case "6": ////Transfered
        //        case "9": ////Suspended
        //        case "10": ////Inactive
        //            return false;
        //    }

        //    return true;
        //}

        ///// <summary>
        ///// The get users for course.
        ///// </summary>
        ///// <param name="company">
        ///// The company.
        ///// </param>
        ///// <param name="courseId">
        ///// The course Id.
        ///// </param>
        ///// <param name="error">
        ///// The error.
        ///// </param>
        ///// <param name="session">
        ///// The session.
        ///// </param>
        ///// <returns>
        ///// The <see cref="Course"/>.
        ///// </returns>
        //internal Course GetCourse(
        //    LmsCompany company,
        //    int courseId,
        //    out string error,
        //    Session session = null)
        //{
        //    XElement courseResult = this.LoginIfNecessary(
        //        session,
        //        s =>
        //        s.Get(Commands.Courses.GetOne, string.Format(Parameters.Courses.GetOne, courseId).ToParams()),
        //        company,
        //        out error);
        //    if (courseResult == null)
        //    {
        //        error = error ?? "DLAP. Unable to retrive course from API";
        //        return null;
        //    }

        //    if (!Session.IsSuccess(courseResult))
        //    {
        //        error = "DLAP. Unable to get course: " + Session.GetMessage(courseResult);
        //        this.logger.Error(error);
        //    }

        //    if (session != null)
        //    {
        //        var course = courseResult.XPathSelectElement("/course");
        //        if (course != null)
        //        {
        //            var courseName = course.XPathEvaluate("string(@title)").ToString();
        //            var courseStartDate = course.XPathEvaluate("string(@startdate)").ToString();
        //            var courseEndDate = course.XPathEvaluate("string(@enddate)").ToString();

        //            return new Course
        //                       {
        //                           CourseId = courseId,
        //                           Title = courseName,
        //                           StartDate = courseStartDate,
        //                           EndDate = courseEndDate,
        //                       };
        //        }

        //        error = "Course not found";
        //    }

        //    return null;
        //}

        ///// <summary>
        ///// The get enrollment.
        ///// </summary>
        ///// <param name="company">
        ///// The company.
        ///// </param>
        ///// <param name="enrollmentId">
        ///// The enrollment Id.
        ///// </param>
        ///// <param name="error">
        ///// The error.
        ///// </param>
        ///// <param name="session">
        ///// The session.
        ///// </param>
        ///// <returns>
        ///// The <see cref="Enrollment"/>.
        ///// </returns>
        //internal Enrollment GetEnrollment(
        //    LmsCompany company,
        //    long enrollmentId,
        //    out string error,
        //    Session session = null)
        //{
        //    XElement enrollmentResult = this.LoginIfNecessary(
        //        session,
        //        s =>
        //        s.Get(Commands.Enrollments.GetOne, string.Format(Parameters.Enrollments.GetOne, enrollmentId).ToParams()),
        //        company,
        //        out error);
        //    if (enrollmentResult == null)
        //    {
        //        error = error ?? "DLAP. Unable to retrive enrollment from API";
        //        return null;
        //    }

        //    if (!Session.IsSuccess(enrollmentResult))
        //    {
        //        error = "DLAP. Unable to get course: " + Session.GetMessage(enrollmentResult);
        //        this.logger.Error(error);
        //    }

        //    if (session != null)
        //    {
        //        var enrollment = enrollmentResult.XPathSelectElement("/enrollment");
        //        if (enrollment != null)
        //        {
        //            var userId = enrollment.XPathEvaluate("string(@userid)").ToString();
        //            var courseId = int.Parse(enrollment.XPathEvaluate("string(@courseid)").ToString());
        //            var role = enrollment.XPathEvaluate("string(@privileges)").ToString();
        //            var status = enrollment.XPathEvaluate("string(@status)").ToString();
        //            var user = enrollment.XPathSelectElement("user");
        //            var email = user.XPathEvaluate("string(@email)").ToString();
        //            var userName = user.XPathEvaluate("string(@username)").ToString();
        //            return new Enrollment
        //            {
        //                CourseId = courseId,
        //                UserId = userId,
        //                Role = ProcessRole(role),
        //                Email = email,
        //                UserName = userName,
        //                Status = status,
        //            };
        //        }

        //        error = "Enrollment not found";
        //    }

        //    return null;
        //}

        ///// <summary>
        ///// The get last signal id.
        ///// </summary>
        ///// <param name="company">
        ///// The company.
        ///// </param>
        ///// <param name="error">
        ///// The error.
        ///// </param>
        ///// <param name="session">
        ///// The session.
        ///// </param>
        ///// <returns>
        ///// The <see cref="Nullable{Int64}"/>.
        ///// </returns>
        //internal long? GetLastSignalId(LmsCompany company, out string error, Session session = null)
        //{
        //    long? result = null;
        //    XElement signalsResult = this.LoginIfNecessary(session, s => s.Get(Commands.Signals.GetLastSignalId), company, out error);
        //    if (signalsResult == null)
        //    {
        //        error = error ?? "DLAP. Unable to retrive result from API";
        //        return null;
        //    }

        //    if (!Session.IsSuccess(signalsResult))
        //    {
        //        error = "DLAP. Unable to create user: "******"/signal");
        //        result = long.Parse(signal.XPathEvaluate("string(@id)").With(x => x.ToString()));
        //    }
        //    catch (Exception ex)
        //    {
        //        error = ex.ToString();
        //    }

        //    return result;
        //}

        /// <summary>
        /// The get last signal id.
        /// </summary>
        /// <param name="company">
        /// The company.
        /// </param>
        /// <param name="error">
        /// The error.
        /// </param>
        /// <param name="session">
        /// The session.
        /// </param>
        /// <returns>
        /// The <see cref="Nullable{Int64}"/>.
        /// </returns>
        internal async Task <(long?result, string error)> GetLastSignalIdAsync(LmsCompany company, Session session = null)
        {
            long?result = null;

            var(signalsResult, error) = await this.LoginIfNecessaryAsync(session, s => s.GetAsync(Commands.Signals.GetLastSignalId), company);

            if (signalsResult == null)
            {
                error = error ?? "DLAP. Unable to retrive result from API";
                return(null, error);
            }

            if (!Session.IsSuccess(signalsResult))
            {
                error = "DLAP. Unable to create user: "******"/signal");
                result = long.Parse(signal.XPathEvaluate("string(@id)").With(x => x.ToString()));
            }
            catch (Exception ex)
            {
                error = ex.ToString();
            }

            return(result, error);
        }
示例#13
0
        public PrincipalReportDto[] GetMeetingHostReport(int lmsCompanyId)
        {
            LmsCompany license = this.LmsCompanyModel.GetOneById(lmsCompanyId).Value;

            var provider = AdobeConnectAccountService.GetProvider(license);

            return(AdobeConnectAccountService.GetMeetingHostReport(provider).ToArray());
        }
示例#14
0
        internal async Task <(List <Signal> result, string error)> GetSignalsListAsync(
            LmsCompany company,
            Session session = null,
            string types    = "1.2|4.3|4.8")
        {
            var result = new List <Signal>();

            var(signalsResult, error) = await this.LoginIfNecessaryAsync(
                session,
                s => s.GetAsync(Commands.Signals.List, string.Format(Parameters.Signals.List, company.LastSignalId, s.DomainId, types).ToDictionary()),
                company);

            if (signalsResult == null)
            {
                error = error ?? "DLAP. Unable to retrive result from API";
                return(result, error);
            }

            if (!Session.IsSuccess(signalsResult))
            {
                error = "DLAP. Unable to create user: "******"/signals/signal");

            foreach (XElement signal in signals)
            {
                var signalId = long.Parse(signal.XPathEvaluate("string(@signalid)").With(x => x.ToString()));
                var entityid = int.Parse(signal.XPathEvaluate("string(@entityid)").With(x => x.ToString()));
                var type     = signal.XPathEvaluate("string(@type)").ToString();
                var data     = signal.XPathSelectElement("data");
                if (data != null)
                {
                    switch (type)
                    {
                    case SignalTypes.EnrollmentChanged:
                        ProcessEnrollment(signalId, entityid, type, data, signal, result);
                        break;

                    case SignalTypes.CourseDeleted:
                        ProcessCourseSignal(data, result, signalId, entityid, type);

                        break;

                    case SignalTypes.CourseCreated:
                        ProcessCourseSignal(data, result, signalId, entityid, type);

                        break;
                    }
                }
            }

            return(result, error);
        }
示例#15
0
        public virtual async Task <OperationResult> GetMeetingCourseSections()
        {
            if (!LmsCompany.GetSetting <bool>(LmsLicenseSettingNames.UseCourseSections))
            {
                return(OperationResult.Error("License doesn't support 'Sections' feature"));
            }

            LmsCourseSectionsServiceBase sectionsService = lmsFactory.GetCourseSectionsService(LmsCompany.LmsProviderId, LmsCompany.GetLMSSettings(Settings), Session.LtiSession.LtiParam);

            return((await sectionsService.GetCourseSections()).ToSuccessResult());
        }
示例#16
0
        private ActionResult LoginToAC(string realUrl, string breezeSession, LmsCompany credentials)
        {
            if (!credentials.LoginUsingCookie.GetValueOrDefault())
            {
                return(this.Redirect(realUrl));
            }

            this.ViewBag.MeetingUrl    = realUrl;
            this.ViewBag.BreezeSession = breezeSession;
            this.ViewBag.AcServer      = credentials.AcServer + "/";

            return(this.View("~/Views/Lti/LoginToAC.cshtml"));
        }
示例#17
0
        /// <summary>
        /// Retrieves secret for key.
        /// </summary>
        /// <param name="key">
        ///     The key.
        /// </param>
        /// <param name="credentials">
        ///     The credentials
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        private static string RetrieveSecretForKey(string key, LmsCompany credentials)
        {
            // Use this method to return back the secret associated with this key.
            // In this example I am using the key/secret pair { "MyKey", "Secret12345" }
            // You will need to create your own key/secret pair and replace the code below with the key/secret pair that you create.
            // The domain in AgilixBuzz that contains your blti links will then need to be customized with your key/secret pair.
            if (credentials.ConsumerKey == key)
            {
                return(credentials.SharedSecret);
            }

            return(null);
        }
示例#18
0
        /// <summary>
        /// The get enrollment.
        /// </summary>
        /// <param name="company">
        /// The company.
        /// </param>
        /// <param name="enrollmentId">
        /// The enrollment Id.
        /// </param>
        /// <param name="error">
        /// The error.
        /// </param>
        /// <param name="session">
        /// The session.
        /// </param>
        /// <returns>
        /// The <see cref="Enrollment"/>.
        /// </returns>
        internal async Task <(Enrollment result, string error)> GetEnrollmentAsync(
            LmsCompany company,
            long enrollmentId,
            Session session = null)
        {
            var(enrollmentResult, error) = await this.LoginIfNecessaryAsync(
                session,
                s => s.GetAsync(Commands.Enrollments.GetOne, string.Format(Parameters.Enrollments.GetOne, enrollmentId).ToDictionary()),
                company);

            if (enrollmentResult == null)
            {
                error = error ?? "DLAP. Unable to retrive enrollment from API";
                return(null, error);
            }

            if (!Session.IsSuccess(enrollmentResult))
            {
                error = "DLAP. Unable to get course: " + Session.GetMessage(enrollmentResult);
                _logger.Error(error);
            }

            if (session != null)
            {
                var enrollment = enrollmentResult.XPathSelectElement("/enrollment");
                if (enrollment != null)
                {
                    var userId   = enrollment.XPathEvaluate("string(@userid)").ToString();
                    var courseId = int.Parse(enrollment.XPathEvaluate("string(@courseid)").ToString());
                    var role     = enrollment.XPathEvaluate("string(@privileges)").ToString();
                    var status   = enrollment.XPathEvaluate("string(@status)").ToString();
                    var user     = enrollment.XPathSelectElement("user");
                    var email    = user.XPathEvaluate("string(@email)").ToString();
                    var userName = user.XPathEvaluate("string(@username)").ToString();

                    return(new Enrollment
                    {
                        CourseId = courseId,
                        UserId = userId,
                        Role = ProcessRole(role),
                        Email = email,
                        UserName = userName,
                        Status = status,
                    }, error);
                }

                error = "Enrollment not found";
            }

            return(null, error);
        }
示例#19
0
 public void Process(LmsCompany license)
 {
     try
     {
         _log.WriteLine("START " + license.AcServer);
         ProcessAc(license);
     }
     catch (Exception ex)
     {
         _log.WriteLine("    Error. AC: " + license.AcServer);
         _log.WriteLine(ex, "    ");
     }
     _log.WriteLine("STOP " + license.AcServer);
 }
示例#20
0
        private IEnumerable <LmsCompanyRoleMapping> GetGuestAuditRoleMappings(LmsCompany lmsCompany, LtiParamDTO param)
        {
            if (!lmsCompany.GetSetting <bool>(LmsLicenseSettingNames.EnableAuditGuestEntry))
            {
                return(Enumerable.Empty <LmsCompanyRoleMapping>());
            }
            var customRoles         = lmsCompany.RoleMappings.Where(x => !x.IsDefaultLmsRole && new[] { AcRole.Host.Id, AcRole.Presenter.Id }.Contains(x.AcRole));
            var currentUserLtiRoles = new List <string>();

            if (!string.IsNullOrEmpty(param.roles))
            {
                currentUserLtiRoles.AddRange(param.roles.Split(',', ';').Select(x => x.Trim()));
            }

            return(customRoles.Where(x => currentUserLtiRoles.Any(lr => lr.Equals(x.LmsRoleName))));
        }
示例#21
0
        protected string GetOutputErrorMessage(string methodName, LmsCompany credentials, Exception ex)
        {
            string lmsInfo = (credentials != null)
                ? string.Format(" LmsCompany ID: {0}. Lms License Title: {1}. Lms Domain: {2}. AC Server: {3}.", credentials.Id, credentials.Title, credentials.LmsDomain, credentials.AcServer)
                : string.Empty;

            Logger.Error(methodName + lmsInfo, ex);

            if (ex is IUserMessageException)
            {
                return(ex.Message);
            }

            return(IsDebug
                ? Resources.Messages.ExceptionOccured + ex.ToString()
                : Resources.Messages.ExceptionMessage);
        }
示例#22
0
        private static void ProcessRoleMapping(CompanyLmsDTO dto, LmsCompany instance)
        {
            if (dto.roleMapping == null)
            {
                dto.roleMapping = new LmsCompanyRoleMappingDTO[0];
            }

            var oldMapsToDelete = new List <LmsCompanyRoleMapping>();

            foreach (LmsCompanyRoleMapping old in instance.RoleMappings)
            {
                var newSetRole = dto.roleMapping.FirstOrDefault(x => x.lmsRoleName == old.LmsRoleName);
                if (newSetRole == null)
                {
                    oldMapsToDelete.Add(old);
                }
                else
                {
                    old.AcRole        = newSetRole.acRole;
                    old.IsTeacherRole = newSetRole.isTeacherRole;
                }
            }
            if (oldMapsToDelete.Count > 0)
            {
                foreach (var item in oldMapsToDelete)
                {
                    instance.RoleMappings.Remove(item);
                }
            }

            foreach (LmsCompanyRoleMappingDTO newRole in dto.roleMapping)
            {
                if (!instance.RoleMappings.Any(map => map.LmsRoleName == newRole.lmsRoleName))
                {
                    var map = new LmsCompanyRoleMapping
                    {
                        LmsCompany       = instance,
                        LmsRoleName      = newRole.lmsRoleName,
                        AcRole           = newRole.acRole,
                        IsDefaultLmsRole = newRole.isDefaultLmsRole,
                        IsTeacherRole    = newRole.isTeacherRole,
                    };
                    instance.RoleMappings.Add(map);
                }
            }
        }
示例#23
0
        private static void Test(LmsCompany entity, CompanyLmsDTO resultDto)
        {
            bool   isTransient = false;
            string lmsPassword = resultDto.lmsAdminPassword;

            if (!isTransient && string.IsNullOrWhiteSpace(resultDto.lmsAdminPassword))
            {
                if ((entity.LmsProviderId == (int)LmsProviderEnum.Moodle) ||
                    ((entity.LmsProviderId == (int)LmsProviderEnum.Blackboard) && !resultDto.enableProxyToolMode))
                {
                    lmsPassword = entity.AdminUser.Password;
                }
                else if ((entity.LmsProviderId == (int)LmsProviderEnum.Blackboard) && resultDto.enableProxyToolMode)
                {
                    lmsPassword = resultDto.proxyToolPassword;
                }
            }

            ConnectionInfoDTO lmsConnectionTest = TestConnectionService.TestConnection(new ConnectionTestDTO
            {
                domain = resultDto.lmsDomain,
                enableProxyToolMode = resultDto.enableProxyToolMode,
                login    = resultDto.lmsAdmin,
                password = lmsPassword,
                type     = resultDto.lmsProvider,
            });

            string acPassword = (isTransient || !string.IsNullOrWhiteSpace(resultDto.acPassword))
                ? resultDto.acPassword
                : entity.AcPassword;

            string acConnectionInfo;
            bool   loginSameAsEmail;
            bool   acConnectionTest = TestConnectionService.TestACConnection(new ConnectionTestDTO
            {
                domain = resultDto.acServer,
                enableProxyToolMode = resultDto.enableProxyToolMode,
                login    = resultDto.acUsername,
                password = acPassword,
                type     = "ac",
            }, out acConnectionInfo, out loginSameAsEmail);

            // NOTE: always use setting from AC not UI
            entity.ACUsesEmailAsLogin = loginSameAsEmail;
            entity.IsActive           = lmsConnectionTest.status == OkMessage && acConnectionTest;
        }
示例#24
0
        internal async Task <(Course course, string error)> GetCourseAsync(
            LmsCompany company,
            int courseId,
            Session session = null)
        {
            var(courseResult, error) = await this.LoginIfNecessaryAsync(
                session,
                s => s.GetAsync(Commands.Courses.GetOne, string.Format(Parameters.Courses.GetOne, courseId).ToDictionary()),
                company);

            if (courseResult == null)
            {
                error = error ?? "DLAP. Unable to retrive course from API";
                return(null, error);
            }

            if (!Session.IsSuccess(courseResult))
            {
                error = "DLAP. Unable to get course: " + Session.GetMessage(courseResult);
                _logger.Error(error);
            }

            if (session != null)
            {
                var course = courseResult.XPathSelectElement("/course");
                if (course != null)
                {
                    var courseName      = course.XPathEvaluate("string(@title)").ToString();
                    var courseStartDate = course.XPathEvaluate("string(@startdate)").ToString();
                    var courseEndDate   = course.XPathEvaluate("string(@enddate)").ToString();

                    return(new Course
                    {
                        CourseId = courseId,
                        Title = courseName,
                        StartDate = courseStartDate,
                        EndDate = courseEndDate,
                    }, error);
                }

                error = "Course not found";
            }

            return(null, error);
        }
示例#25
0
        private string SetupUserMeetingsFolder(LmsCompany lmsCompany, IAdobeConnectProxy provider,
                                               Principal user, bool useLmsUserEmailForSearch)
        {
            var shortcutName = MeetingTypeFactory.GetMeetingFolderShortcut(_lmsMeetingType, true).GetACEnum();
            var shortcut     = provider.GetShortcutByType(shortcutName);

            var userFolderName = lmsCompany.ACUsesEmailAsLogin.GetValueOrDefault() ? user.Email : user.Login;

            //var userFolderName = useLmsUserEmailForSearch ? user.Email : user.Login;
            var meetingsFolderName = string.IsNullOrEmpty(lmsCompany.UserFolderName)
                ? userFolderName
                : lmsCompany.UserFolderName;
            string meetingFolderScoId;

            CreateUserFoldersStructure(shortcut.ScoId, provider, userFolderName,
                                       meetingsFolderName, out meetingFolderScoId);
            return(meetingFolderScoId);
        }
示例#26
0
        public OperationResult MoveFileOrFolder(string scoId, string destinationFolderScoId)
        {
            try
            {
                if (!LmsCompany.GetSetting <bool>(LmsCompanySettingNames.EnableMyContent))
                {
                    return(OperationResult.Error("Operation is not enabled."));
                }

                var ac             = this.GetUserProvider();
                var contentService = new ContentService(Logger, ac);
                var helper         = new ContentEditControllerHelper(Logger, ac);
                return(helper.MoveSco(scoId, destinationFolderScoId));
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("ContentApi-MoveFileOrFolder", ex);
                return(OperationResultWithData <IEnumerable <ScoContentDto> > .Error(errorMessage));
            }
        }
示例#27
0
        private string GetMeetingFolder(LmsCompany lmsCompany, IAdobeConnectProxy provider, Principal user, bool useLmsUserEmailForSearch)
        {
            string adobeConnectScoId = null;

            if (lmsCompany.UseUserFolder.GetValueOrDefault() && user != null)
            {
                ////TODO Think about user folders + renaming directory
                adobeConnectScoId = SetupUserMeetingsFolder(lmsCompany, provider, user, useLmsUserEmailForSearch);
            }

            if (adobeConnectScoId == null)
            {
                LmsProvider lmsProvider = LmsProviderModel.GetById(lmsCompany.LmsProviderId);
                adobeConnectScoId = SetupSharedMeetingsFolder(lmsCompany, lmsProvider, provider);
                this.LmsСompanyModel.RegisterSave(lmsCompany);
                this.LmsСompanyModel.Flush();
            }

            return(adobeConnectScoId);
        }
示例#28
0
        public async Task <OperationResultWithData <IEnumerable <ScoContentDto> > > FolderContent(string folderScoId)
        {
            try
            {
                if (!LmsCompany.GetSetting <bool>(LmsCompanySettingNames.EnableMyContent))
                {
                    return(OperationResultWithData <IEnumerable <ScoContentDto> > .Error("Operation is not enabled."));
                }

                var ac             = this.GetUserProvider();
                var contentService = new ContentService(Logger, ac);
                var helper         = new ContentControllerHelper <ScoContentDto>(Logger, contentService, new ScoContentDtoMapper());
                return(await helper.GetFolderContent(folderScoId, new NullDtoProcessor <ScoContentDto>()));
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("ContentApi-FolderContent", ex);
                return(OperationResultWithData <IEnumerable <ScoContentDto> > .Error(errorMessage));
            }
        }
示例#29
0
        private void UpdateOrDeleteSetting(LmsCompany lmsCompany, string settingName, object settingValue)
        {
            var stringSettingValue = settingValue as string;

            if (settingValue != null && (stringSettingValue == null || !string.IsNullOrEmpty(stringSettingValue)))
            {
                LmsCompanyModel.UpdateCompanySetting(lmsCompany, settingName,
                                                     settingValue.ToString());
            }
            else
            {
                // todo: handle not-nullable values correctly if necessary
                var setting = LmsCompanySettingModel.GetOneByLmsCompanyIdAndSettingName(lmsCompany.Id, settingName);
                if (setting.Value != null)
                {
                    lmsCompany.Settings.Remove(lmsCompany.Settings.FirstOrDefault(x => x.Id == setting.Value.Id));
                    LmsCompanySettingModel.RegisterDelete(setting.Value, true);
                }
            }
        }
示例#30
0
        public OperationResult GetDownloadLink(string scoId)
        {
            try
            {
                if (!LmsCompany.GetSetting <bool>(LmsCompanySettingNames.EnableMyContent))
                {
                    return(OperationResult.Error("Operation is not enabled."));
                }

                var ac             = this.GetUserProvider();
                var contentService = new ContentService(Logger, ac);
                var helper         = new ContentControllerHelper <ScoContentDto>(Logger, contentService, new ScoContentDtoMapper());

                var param   = Session.LtiSession.LtiParam;
                var lmsUser = _lmsUserModel.GetOneByUserIdAndCompanyLms(param.lms_user_id, LmsCompany.Id).Value;
                if (lmsUser == null)
                {
                    throw new Core.WarningMessageException($"No user with id {param.lms_user_id} found in the database.");
                }

                if (lmsUser.PrincipalId == null)
                {
                    throw new Core.WarningMessageException("User doesn't have account in Adobe Connect.");
                }

                var registeredUser = ac.GetOneByPrincipalId(lmsUser.PrincipalId).PrincipalInfo.Principal;

                string breezeToken = MeetingSetup.ACLogin(LmsCompany, param, lmsUser, registeredUser, ac);

                return(helper.GetDownloadAsZipLink(scoId, breezeToken));
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("ContentApi-GetDownloadLink", ex);
                return(OperationResultWithData <IEnumerable <ScoContentDto> > .Error(errorMessage));
            }
        }