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; }
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()); }
public ScoInfo SaveSeminar(SeminarUpdateItem seminar, IAdobeConnectProxy provider) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } if (seminar == null) { throw new ArgumentNullException(nameof(seminar)); } if (string.IsNullOrWhiteSpace(seminar.ScoId)) { throw new ArgumentException("sco-id can't be empty.", nameof(seminar)); } if (!string.IsNullOrWhiteSpace(seminar.UrlPath)) { throw new InvalidOperationException("UrlPath can't be updated."); } else { seminar.UrlPath = null; } ScoInfoResult result = provider.UpdateSco(seminar); return(ProcessResult(result)); }
private static void CreateUserFoldersStructure(string folderScoId, IAdobeConnectProxy provider, string userFolderName, string userMeetingsFolderName, out string innerFolderScoId) { var folderContent = provider.GetContentsByScoId(folderScoId); var userFolder = folderContent.Values.FirstOrDefault(x => x.Name == userFolderName); if (userFolder == null) { var userFolderScoId = CreateFolder(folderScoId, userFolderName, provider); var userMeetingsFolderScoId = CreateFolder(userFolderScoId, userMeetingsFolderName, provider); innerFolderScoId = userMeetingsFolderScoId; return; } var userFolderContent = provider.GetContentsByScoId(userFolder.ScoId); var userMeetingsFolder = userFolderContent.Values.FirstOrDefault(x => x.Name == userMeetingsFolderName); if (userMeetingsFolder == null) { innerFolderScoId = CreateFolder(userFolder.ScoId, userMeetingsFolderName, provider); return; } innerFolderScoId = userMeetingsFolder.ScoId; }
public OperationResult RemoveRecording( ILmsLicense lmsCompany, IAdobeConnectProxy provider, string courseId, string recordingId, int id) { LmsCourseMeeting meeting = lmsCourseMeetingModel.GetOneByCourseAndId(lmsCompany.Id, courseId, id); if (meeting == null) { return(OperationResult.Error(Resources.Messages.MeetingNotFound)); } ScoContentCollectionResult result = provider.GetMeetingRecordings(new[] { meeting.GetMeetingScoId() }, lmsCompany.UseMP4); var recording = result.Values.FirstOrDefault(x => x.ScoId == recordingId); if (recording == null) { return(OperationResult.Error(Resources.Messages.RecordingNotFound)); } /*if (recording.Icon == "mp4-archive") * { * var scheduledRecording = this.GetScheduledRecording(recordingId, scoId, provider); * if (scheduledRecording.JobStatus == "job-pending") * { * return OperationResult.Error("Cannot delete " + scheduledRecording.Name + " MP4 recording. Recording converting - in progress"); * } * }*/ provider.DeleteSco(recordingId); return(OperationResult.Success()); }
public Principal GetPrincipalByLoginOrEmail( IAdobeConnectProxy provider, string login, string email, bool searchByEmail) { if (searchByEmail && string.IsNullOrWhiteSpace(email)) { return(null); } if (!searchByEmail && string.IsNullOrWhiteSpace(login)) { return(null); } PrincipalCollectionResult result = searchByEmail ? provider.GetAllByEmail(email) : provider.GetAllByLogin(login); if (!result.Success) { return(null); } return(result.Return(x => x.Values, Enumerable.Empty <Principal>()).FirstOrDefault()); }
public OperationResult AddAudioProfileToMeeting(IAdobeConnectProxy provider, string meetingScoId, string audioProfileId) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } if (string.IsNullOrWhiteSpace(meetingScoId)) { throw new ArgumentException("Non-empty value expected", nameof(meetingScoId)); } if (string.IsNullOrWhiteSpace(audioProfileId)) { throw new ArgumentException("Non-empty value expected", nameof(audioProfileId)); } //todo: telephony-profile-info to AC provider var telephonyProfileInfoResult = provider.TelephonyProfileInfo(audioProfileId); if (telephonyProfileInfoResult.Success && telephonyProfileInfoResult.TelephonyProfile != null) { provider.UpdateAclField(meetingScoId, AclFieldId.telephony_profile, audioProfileId); return(OperationResult.Success()); } logger.ErrorFormat($"Error occured when tried to AddAudioProfileToMeeting. ProfileId={audioProfileId}."); return(OperationResult.Error("Couldn't get audio profile.")); }
public static StatusInfo UpdateScoPermissionForPrincipal(this IAdobeConnectProxy provider, string meetingScoId, string userPrincipalId, MeetingPermissionId permission) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } if (string.IsNullOrWhiteSpace(meetingScoId)) { throw new ArgumentException("Non-empty value expected", nameof(meetingScoId)); } if (string.IsNullOrWhiteSpace(userPrincipalId)) { throw new ArgumentException("Non-empty value expected", nameof(userPrincipalId)); } return(provider.UpdateScoPermissions(new MeetingPermissionUpdateTrio[] { new MeetingPermissionUpdateTrio { ScoId = meetingScoId, PrincipalId = userPrincipalId, PermissionId = permission, } })); }
private ScoInfo DoGetSco(string scoId, IAdobeConnectProxy ac, string principalId) { // check is user already has read permission!!! // TODO: setup only if source recording is accessible?? // ac.UpdateScoPermissionForPrincipal(scoId, principalId, MeetingPermissionId.view); var sco = ac.GetScoInfo(scoId); if (sco.Status.Code == Esynctraining.AC.Provider.Entities.StatusCodes.no_access && sco.Status.SubCode == StatusSubCodes.denied) { Logger.ErrorFormat("DoGetSco: {0}. sco-id:{1}.", sco.Status.GetErrorInfo(), scoId); throw new WarningMessageException("Access denied."); } if (sco.Status.Code == Esynctraining.AC.Provider.Entities.StatusCodes.no_data && sco.Status.SubCode == StatusSubCodes.not_set) { Logger.ErrorFormat("DoGetSco: {0}. sco-id:{1}.", sco.Status.GetErrorInfo(), scoId); throw new WarningMessageException("File not found in Adobe Connect."); } else if (!sco.Success) { Logger.ErrorFormat("DoGetSco: {0}. sco-id:{1}.", sco.Status.GetErrorInfo(), scoId); string msg = string.Format("[AdobeConnectProxy Error] {0}. Parameter1:{1}.", sco.Status.GetErrorInfo(), scoId); throw new InvalidOperationException(msg); } return(sco.ScoInfo); }
private string LoginCurrentUser(out IAdobeConnectProxy adminProvider) { //try //{ var param = Session.LtiSession.LtiParam; var lmsUser = Session.LmsUser; if (lmsUser.PrincipalId == null) { throw new WarningMessageException("User doesn't have account in Adobe Connect."); } adminProvider = GetAdminProvider(); string breezeToken = MeetingSetup.ACLogin(LmsCompany, param, lmsUser, adminProvider).BreezeSession; if (breezeToken == null) { throw new WarningMessageException("There is an issue with login to Adobe Connect."); } return(breezeToken); //} //catch (Exception ex) //{ // //string errorMessage = GetOutputErrorMessage("ContentApi-LoginCurrentUser", ex); // throw; //} }
public IEnumerable <UserSeminarLicenseSco> GetUserSeminarLicenses(IAdobeConnectProxy provider) { var seminarsShortcutId = GetSeminarsShortcutId(provider); var result = provider.GetUserSeminarLicenses(seminarsShortcutId); return(result.Values); }
public IEnumerable <TemplateDto> GetMyMeetingTemplates(IAdobeConnectProxy api) { if (api == null) { throw new ArgumentNullException(nameof(api)); } return(GetShortcutContentsFromApi(api, ScoShortcutType.my_meeting_templates.GetACEnum())); }
private Principal CreatePrincipal( IAdobeConnectProxy provider, string login, string email, string firstName, string lastName, bool acUsesEmailAsLogin) { if (string.IsNullOrWhiteSpace(firstName)) { throw new Core.WarningMessageException("Adobe Connect User's First Name can't be empty."); } if (string.IsNullOrWhiteSpace(lastName)) { throw new Core.WarningMessageException("Adobe Connect User's Last Name can't be empty."); } var setup = new PrincipalSetup { Email = string.IsNullOrWhiteSpace(email) ? null : email, FirstName = firstName, LastName = lastName, Name = login, Login = login, Type = PrincipalType.user, }; PrincipalResult pu = provider.PrincipalUpdate(setup, false, false); if (!pu.Success) { if (pu.Status.InvalidField == "login" && pu.Status.SubCode == StatusSubCodes.duplicate) { if (acUsesEmailAsLogin) { UserCollectionResult guestsByEmail = provider.ReportGuestsByEmail(HttpUtilsInternal.UrlEncode(email)); if (guestsByEmail.Success && guestsByEmail.Values.Any()) { throw new Core.WarningMessageException(string.Format(Messages.PrincipalEmailUsedForGuest, email)); } } else { UserCollectionResult guestsByLogin = provider.ReportGuestsByLogin(login); if (guestsByLogin.Success && guestsByLogin.Values.Any()) { throw new Core.WarningMessageException(string.Format(Messages.PrincipalLoginUsedForGuest, login)); } } } } if (pu.Principal != null) { return(pu.Principal); } return(null); }
public ScoInfo SaveSession(SeminarSessionDto sessionItem, IAdobeConnectProxy provider) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } if (sessionItem == null) { throw new ArgumentNullException(nameof(sessionItem)); } if (sessionItem.ExpectedLoad <= 0) { throw new ArgumentException("ExpectedLoad should have positive value", nameof(sessionItem)); } var isNewSession = string.IsNullOrWhiteSpace(sessionItem.SeminarSessionScoId); var session = new SeminarSessionUpdateItem { ScoId = sessionItem.SeminarSessionScoId, FolderId = sessionItem.SeminarScoId, Type = ScoType.seminarsession, Name = sessionItem.Name, Description = sessionItem.Summary }; ScoInfoResult sessionScoResult = isNewSession ? provider.CreateSco(session) : provider.UpdateSco(session); ScoInfo sessionSco = ProcessResult(sessionScoResult); var sessionSettingsResult = provider.SeminarSessionScoUpdate(new SeminarSessionScoUpdateItem { ScoId = sessionSco.ScoId, Name = sessionSco.Name, DateBegin = sessionItem.DateBegin.ToString(AcDateFormat), DateEnd = sessionItem.DateEnd.ToString(AcDateFormat), ParentAclId = sessionItem.SeminarScoId, SourceScoId = sessionItem.SeminarScoId, }); // if session was not updated correctly, it's sco would appear in the list anyway // with wrong parameters(dates) => deleting just created session in case of unsuccessful update if (!sessionSettingsResult.Success && isNewSession) { provider.DeleteSco(sessionSco.ScoId); } var result = ProcessResult(sessionSettingsResult); StatusInfo loadResult = provider.UpdateAclField(result.ScoId, AclFieldId.seminar_expected_load, sessionItem.ExpectedLoad.ToString()); if ((loadResult.Code != StatusCodes.ok) && isNewSession) { provider.DeleteSco(sessionSco.ScoId); } return(result); }
public string GetPasscode(ILmsLicense lmsCompany, IAdobeConnectProxy provider, string scoId) { var info = provider.GetScoInfo(scoId); if (!info.Success) { return(string.Empty); } return(info.ScoInfo.MeetingPasscode); }
protected IAdobeConnectProxy GetAdobeConnectProvider(ILmsLicense lmsCompany) { IAdobeConnectProxy provider = null; if (lmsCompany != null) { provider = acAccountService.GetProvider(new AdobeConnectAccess(new Uri(lmsCompany.AcServer), lmsCompany.AcUsername, lmsCompany.AcPassword), true); } return(provider); }
public IEnumerable <ScoContent> GetSeminars(string seminarLicenseScoId, IAdobeConnectProxy provider) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } var sessionResult = provider.GetContentsByScoId(seminarLicenseScoId); return(sessionResult.Values.Where(x => x.Type == "meeting" && x.IsSeminar)); }
private bool IsPublicRecording(string recordingScoId, IAdobeConnectProxy acProxy) { var moreDetails = acProxy.GetScoPublicAccessPermissions(recordingScoId, skipAcError: true); var isPublic = false; if (moreDetails.Success && moreDetails.Values.Any()) { isPublic = moreDetails.Values.First().PermissionId == PermissionId.view; } return(isPublic); }
public StatusInfo DeleteSeminar(string seminarScoId, IAdobeConnectProxy provider) { if (string.IsNullOrWhiteSpace(seminarScoId)) { throw new ArgumentException("Empty sco-id value", nameof(seminarScoId)); } if (provider == null) { throw new ArgumentNullException(nameof(provider)); } return(provider.DeleteSco(seminarScoId)); }
public ContentEditControllerHelper(ILogger logger, IAdobeConnectProxy acProxy) { if (logger == null) { throw new ArgumentNullException(nameof(logger)); } if (acProxy == null) { throw new ArgumentNullException(nameof(acProxy)); } _logger = logger; _acProxy = acProxy; }
public ContentService(ILogger logger, IAdobeConnectProxy provider) { if (logger == null) { throw new ArgumentNullException(nameof(logger)); } if (provider == null) { throw new ArgumentNullException(nameof(provider)); } _logger = logger; _provider = provider; }
public IEnumerable <PrincipalReportDto> GetMeetingHostReport(IAdobeConnectProxy provider) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } var group = provider.GetGroupsByType(PrincipalType.live_admins); if (group.Status.Code != StatusCodes.ok) { throw new InvalidOperationException("AC.GetGroupsByType error"); } PrincipalCollectionResult usersResult = provider.GetGroupUsers(group.Values.First().PrincipalId); if (usersResult.Status.Code != StatusCodes.ok) { throw new InvalidOperationException("AC.GetGroupUsers error"); } var result = new List <PrincipalReportDto>(); foreach (Principal user in usersResult.Values) { var item = new PrincipalReportDto { Principal = PrincipalDto.Build(user), }; TransactionCollectionResult trxResult = provider.ReportMeetingTransactionsForPrincipal(user.PrincipalId, startIndex: 0, limit: 1); if (trxResult.Status.Code != StatusCodes.ok) { throw new InvalidOperationException("AC.ReportMeetingTransactionsForPrincipal error"); } TransactionInfo trx = trxResult.Values.FirstOrDefault(); if (trx != null) { item.LastTransaction = TransactionInfoDto.Build(trx); } result.Add(item); } return(result.AsReadOnly()); }
public TelephonyProfile GetAudioProfileInfo(IAdobeConnectProxy provider, string profileId) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } if (string.IsNullOrWhiteSpace(profileId)) { throw new ArgumentException("Non-empty value expected", nameof(profileId)); } var profile = provider.TelephonyProfileInfo(profileId); return(profile.Success ? profile.TelephonyProfile : null); }
public OperationResult DeleteAudioProfile(string audioProfileId, IAdobeConnectProxy provider) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } if (string.IsNullOrWhiteSpace(audioProfileId)) { throw new ArgumentException("Non-empty value expected", nameof(audioProfileId)); } var deleteProfileStatus = provider.TelephonyProfileDelete(audioProfileId); return(OperationResult.Success()); }
public IEnumerable <TelephonyProfile> GetAudioProfiles(IAdobeConnectProxy provider, string principalId) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } if (string.IsNullOrWhiteSpace(principalId)) { throw new ArgumentException("Non-empty value expected", nameof(principalId)); } var telephonyPrfilesListResult = provider.TelephonyProfileList(principalId); var profiles = telephonyPrfilesListResult.Values.ToList(); return(profiles); }
public IEnumerable <TemplateDto> GetCachedTemplates(IAdobeConnectProxy api, ICache cache, Func <string> cacheKeyFactory, ScoShortcutType scoShortcut) { if (api == null) { throw new ArgumentNullException(nameof(api)); } if (cache == null) { throw new ArgumentNullException(nameof(cache)); } var item = CacheUtility.GetCachedItem <IEnumerable <TemplateDto> >(cache, cacheKeyFactory(), () => GetShortcutContentsFromApi(api, scoShortcut.GetACEnum())); return(item); }
private static string CreateFolder(string folderScoId, string folderName, IAdobeConnectProxy provider) { var newFolder = provider.CreateSco(new FolderUpdateItem { Name = folderName.TruncateIfMoreThen(60), FolderId = folderScoId, Type = ScoType.folder }); if (!newFolder.Success) { var msg = string.Format("[AdobeConnectProxy Error] CreateSco " + "Parameters: FolderId:{0}, Name:{1}", folderScoId, folderName); throw new InvalidOperationException(msg); } return(newFolder.ScoInfo.ScoId); }
private List <ACSessionDto> GetSessionsWithParticipantsBySessionTime(string meetingId, List <MeetingAttendee> meetingAttendees, IAdobeConnectProxy acp, TimeZoneInfo timeZone, int startIndex = 0, int limit = 0) { List <MeetingSession> sessions = acp.ReportMeetingSessions(meetingId, startIndex: startIndex, limit: limit).Values.ToList(); var result = sessions.Select(sco => new ACSessionDto(sco, timeZone)).ToList(); var unprocessedAttendees = new List <MeetingAttendee>(); foreach (var attendee in meetingAttendees) { var session = result.FirstOrDefault(x => x.dateStarted <= attendee.DateCreated && (!x.dateEnded.HasValue || attendee.DateEnd <= x.dateEnded)); if (session != null) { session.participants.Add(new ACSessionParticipantDto(attendee, timeZone)); //if (string.IsNullOrEmpty(session.meetingName)) //{ // session.meetingName = attendee.ScoName; //} } else { unprocessedAttendees.Add(attendee); } } //unlikely possible case, need to check if (unprocessedAttendees.Count > 0) { var maxDate = result.Max(x => x.dateStarted); var ua = unprocessedAttendees.Where(x => x.DateCreated >= maxDate); if (ua.Any()) { var currentSessionNumber = result.Max(x => x.sessionNumber); result.Add(new ACSessionDto { sessionNumber = currentSessionNumber + 1, //sessionName = (currentSessionNumber + 1).ToString(CultureInfo.CurrentCulture), dateStarted = ua.Min(x => x.DateCreated), participants = ua.Select(attendee => new ACSessionParticipantDto(attendee, timeZone)).ToList(), //meetingName = ua.First().ScoName, }); } } GroupSessionParticipants(result); return(result.OrderBy(s => s.sessionNumber).ToList()); }
public ACDetailsDTO GetAccountDetails(IAdobeConnectProxy provider) { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } CommonInfoResult commonInfo = provider.GetCommonInfo(); if (!commonInfo.Success) { _logger.ErrorFormat("GetAccountDetails.GetCommonInfo. AC error:{0}.", commonInfo.Status.GetErrorInfo()); return(null); } if (commonInfo.CommonInfo.AccountId.HasValue) { FieldCollectionResult fields = provider.GetAclFields(commonInfo.CommonInfo.AccountId.Value); if (fields.Status.Code != StatusCodes.ok) { _logger.ErrorFormat("GetAccountDetails.GetAclFields. AC error. Code:{0}.SubCode:{1}.", fields.Status.Code, fields.Status.SubCode); return(null); } var dto = new ACDetailsDTO { Version = commonInfo.CommonInfo.Version, PasswordPolicies = ParsePasswordPolicies(fields), Customization = ParseCustomization(fields, provider), TimeZoneJavaId = commonInfo.CommonInfo.TimeZoneJavaId, }; //var timeZone = GetTimeZone(commonInfo.CommonInfo); int session; int.TryParse(GetField(fields, "web-session-timeout-minutes"), out session); dto.SessionTimeout = session; //dto.SetTimeZone(timeZone); return(dto); } _logger.Error("GetAccountDetails. Account is NULL"); return(null); }
public OperationResult EditRecording( ILmsLicense lmsCompany, IAdobeConnectProxy provider, string courseId, string recordingId, int id, string name, string summary) { LmsCourseMeeting meeting = lmsCourseMeetingModel.GetOneByCourseAndId(lmsCompany.Id, courseId, id); if (meeting == null) { return(OperationResult.Error(Resources.Messages.MeetingNotFound)); } ScoContentCollectionResult result = provider.GetMeetingRecordings(new[] { meeting.GetMeetingScoId() }, lmsCompany.UseMP4); var recording = result.Values.FirstOrDefault(x => x.ScoId == recordingId); if (recording == null) { return(OperationResult.Error(Resources.Messages.RecordingNotFound)); } ScoInfoResult editResult = provider.UpdateSco <RecordingUpdateItem>(new RecordingUpdateItem { ScoId = recordingId, Name = name.Trim(), Description = summary, Type = ScoType.content, }); if (!editResult.Success || editResult.ScoInfo == null) { if ((editResult.Status.SubCode == StatusSubCodes.duplicate) && (editResult.Status.InvalidField == "name")) { return(OperationResult.Error(Resources.Messages.NotUniqueName)); } return(OperationResult.Error(editResult.Status.GetErrorInfo())); } return(OperationResult.Success()); }