Exemple #1
0
        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));
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        public OperationResult EditSco(string scoId, FileUpdateDto dto)
        {
            if (string.IsNullOrWhiteSpace(scoId))
            {
                throw new ArgumentException("Non-empty value expected", nameof(scoId));
            }
            if (dto == null)
            {
                throw new ArgumentNullException(nameof(dto));
            }

            try
            {
                ScoInfoResult scoResult = _acProxy.GetScoInfo(scoId);
                if (!scoResult.Success)
                {
                    if (scoResult.Status.Code == StatusCodes.no_access && scoResult.Status.SubCode == StatusSubCodes.denied)
                    {
                        return(OperationResult.Error(Resources.Messages.AccessDenied));
                    }
                    throw new AdobeConnectException(scoResult.Status);
                }

                ScoInfoResult updatedSco =
                    _acProxy.UpdateSco(
                        new FolderUpdateItem
                {
                    Name        = dto.Name,
                    Description = dto.Description,
                    ScoId       = scoId,
                    Type        = scoResult.ScoInfo.Type,
                });

                if (!updatedSco.Success)
                {
                    return(OperationResult.Error(updatedSco.Status.GetErrorInfo()));
                }
                return(OperationResult.Success());
            }
            catch (AdobeConnectException ex)
            {
                if (ex.Status.Code == StatusCodes.no_access && ex.Status.SubCode == StatusSubCodes.denied)
                {
                    return(OperationResult.Error(Resources.Messages.AccessDenied));
                }

                string errorMessage = GetOutputErrorMessage("EditSco", ex);
                return(OperationResult.Error(errorMessage));
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("EditSco", ex);
                return(OperationResult.Error(errorMessage));
            }
        }
Exemple #4
0
        public virtual async Task <OperationResult> UpdateMeeting([FromBody] EditMeetingDto input)
        {
            try
            {
                var trace = new StringBuilder();
                var ac    = GetAdminProvider();
                //bool useLmsUserEmailForSearch = true;
                var useLmsUserEmailForSearch = !string.IsNullOrEmpty(input.ApiLtiParam.lis_person_contact_email_primary);
                var fb = new MeetingFolderBuilder((LmsCompany)LmsCompany, ac, useLmsUserEmailForSearch, LmsMeetingType.Meeting);
                // HACK: we support Meeting only.
                LmsCourseMeeting existed      = _meetingSetup.GetCourseMeeting(LmsCompany, input.ApiLtiParam.course_id, input.Id, LmsMeetingType.Meeting);
                string           meetingSco   = existed.GetMeetingScoId();
                bool             isNewMeeting = string.IsNullOrEmpty(meetingSco);
                if (isNewMeeting)
                {
                    return(OperationResult.Error("Meeting not found"));
                }

                var           acProvider = this.GetAdminProvider();
                ScoInfoResult scoResult  = acProvider.GetScoInfo(meetingSco);

                MeetingDTOInput meeting = input.Build(existed, scoResult.ScoInfo);

                //LmsUser lmsUser = IoC.Resolve<LmsUserModel>()
                //    .GetOneByUserIdAndCompanyLms(input.ApiLtiParam.lms_user_id, LmsCompany.Id).Value;

                //MeetingDTO dto = await _meetingSetup.BuildDto(
                //    lmsUser,
                //    input.ApiLtiParam,
                //    LmsCompany,
                //    meeting,
                //    null,
                //    //timeZone,
                //    trace);

                OperationResult ret = await _meetingSetup.SaveMeeting(
                    LmsCompany,
                    ac,
                    input.ApiLtiParam,
                    meeting,
                    trace,
                    fb);

                return(ret);
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("UpdateMeeting", ex);
                return(OperationResult.Error(errorMessage));
            }
        }
Exemple #5
0
        public OperationResultWithData <FolderDto> CreateFolder(FolderDto dto)
        {
            if (dto == null)
            {
                throw new ArgumentNullException(nameof(dto));
            }

            try
            {
                // TODO: validation!! via FluentValidation
                //if (string.IsNullOrWhiteSpace(dto.FolderId))
                //    throw new ArgumentException("folderScoId can't be empty");

                ScoInfoResult updatedSco =
                    _acProxy.CreateSco(
                        new FolderUpdateItem
                {
                    Name        = dto.Name,
                    Description = dto.Description,
                    FolderId    = dto.FolderId,
                    Type        = ScoType.folder,
                });

                if (!updatedSco.Success)
                {
                    if (updatedSco.Status.Code == StatusCodes.no_access &&
                        updatedSco.Status.SubCode == StatusSubCodes.denied)
                    {
                        return(OperationResultWithData <FolderDto> .Error(Resources.Messages.AccessDenied));
                    }

                    if (updatedSco.Status.Code == StatusCodes.invalid &&
                        updatedSco.Status.SubCode == StatusSubCodes.duplicate &&
                        updatedSco.Status.InvalidField == "name")
                    {
                        return(OperationResultWithData <FolderDto> .Error(Resources.Messages.NameNotUnique));
                    }

                    _logger.Error(updatedSco.Status.GetErrorInfo());
                    return(OperationResultWithData <FolderDto> .Error(updatedSco.Status.GetErrorInfo()));
                }

                dto.ScoId = updatedSco.ScoInfo.ScoId;
                return(dto.ToSuccessResult());
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("CreateFolder", ex);
                return(OperationResultWithData <FolderDto> .Error(errorMessage));
            }
        }
Exemple #6
0
        public OperationResultWithData <FolderDto> CreateFolder(FolderDto dto)
        {
            if (dto == null)
            {
                throw new ArgumentNullException(nameof(dto));
            }

            try
            {
                // TODO: validation!! via FluentValidation
                //if (string.IsNullOrWhiteSpace(dto.FolderId))
                //    throw new ArgumentException("folderScoId can't be empty");

                ScoInfoResult updatedSco =
                    _acProxy.CreateSco(
                        new FolderUpdateItem
                {
                    Name        = dto.Name,
                    Description = dto.Description,
                    FolderId    = dto.FolderId,
                    Type        = ScoType.folder,
                });

                if (!updatedSco.Success)
                {
                    _logger.Error(updatedSco.Status.GetErrorInfo());
                    return(OperationResultWithData <FolderDto> .Error(updatedSco.Status.GetErrorInfo()));
                }

                dto.ScoId = updatedSco.ScoInfo.ScoId;
                return(OperationResultWithData <FolderDto> .Success(dto));
            }
            catch (AdobeConnectException ex)
            {
                if (ex.Status.Code == StatusCodes.no_access && ex.Status.SubCode == StatusSubCodes.denied)
                {
                    return(OperationResultWithData <FolderDto> .Error("You do not have permission to access this item."));
                }

                string errorMessage = GetOutputErrorMessage("CreateFolder", ex);
                return(OperationResultWithData <FolderDto> .Error(errorMessage));
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("CreateFolder", ex);
                return(OperationResultWithData <FolderDto> .Error(errorMessage));
            }
        }
Exemple #7
0
        /// <summary>
        /// The get model.
        /// </summary>
        /// <param name="scoInfoResult">
        /// The SCO info.
        /// </param>
        /// <returns>
        /// The <see cref="MeetingDetailModel"/>.
        /// </returns>
        protected override MeetingDetailModel GetModel(ScoInfoResult scoInfoResult)
        {
            string permissionId = null;
            var    permission   = this.AdobeConnect.GetScoPublicAccessPermissions(scoInfoResult.ScoInfo.ScoId);

            if (permission.Success && permission.Values != null && permission.Values.Any())
            {
                var publicAccessPermission = permission.Values.FirstOrDefault();

                if (publicAccessPermission != null)
                {
                    permissionId = publicAccessPermission.PermissionId.ToXmlString();
                }
            }

            return(scoInfoResult.ScoInfo.ToMeetingUpdateModel(permissionId));
        }
Exemple #8
0
        public OperationResultWithData <ScoContentDto> UploadFile(string folderScoId, IFormFile file)
        {
            // TRICK:
            var    form       = this.ControllerContext.HttpContext.Request.Form;
            string sessionKey = form["session"];

            Session = GetReadOnlySession(Guid.Parse(sessionKey));
            if (Session == null)
            {
                return(OperationResultWithData <ScoContentDto> .Error(Messages.SessionTimeOut));
            }
            LmsCompany = Session.LmsCompany;

            // TODO: check user is teacher + feature is enabled

            string name        = form["name"];
            string description = form["description"];
            string customUrl   = form["customUrl"];

            try
            {
                string fileName = file.FileName;

                var           ac     = this.GetUserProvider();
                var           helper = new ContentEditControllerHelper(Logger, ac);
                int           fileSize;
                ScoInfoResult createdFile = helper.UploadFile(folderScoId, name, description, customUrl, fileName, file.ContentType, file.OpenReadStream(), out fileSize);

                var sco = ac.GetScoContent(createdFile.ScoInfo.ScoId);
                var dto = new ScoContentDtoMapper().Map(sco.ScoContent);
                //TRICK:
                dto.ByteCount = fileSize;

                return(dto.ToSuccessResult());
            }
            catch (Exception ex)
            {
                IUserMessageException userError = ex as IUserMessageException;
                if (userError != null)
                {
                    return(OperationResultWithData <ScoContentDto> .Error(ex.Message));
                }

                throw;
            }
        }
Exemple #9
0
        /// <summary>
        /// The get model.
        /// </summary>
        /// <param name="scoInfoResult">
        /// The sco info.
        /// </param>
        /// <returns>
        /// The <see cref="EventDetailModel"/>.
        /// </returns>
        protected override EventDetailModel GetModel(ScoInfoResult scoInfoResult)
        {
            //string permissionId = null;
            //var permission = AdobeConnect.GetScoPublicAccessPermissions(scoInfoResult.ScoInfo.ScoId);

            //if (permission.Success && permission.Values != null && permission.Values.Any())
            //{
            //    var publicAccessPermission = permission.Values.FirstOrDefault();

            //    if (publicAccessPermission != null)
            //    {
            //        permissionId = publicAccessPermission.PermissionId.ToXmlString();
            //    }
            //}

            return(scoInfoResult.ScoInfo.ToEventUpdateModel());
        }
Exemple #10
0
        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());
        }
Exemple #11
0
        public ScoInfo CreateSeminar(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 should be empty.", nameof(seminar));
            }

            ScoInfoResult result = provider.CreateSco(seminar);

            return(ProcessResult(result));
        }
Exemple #12
0
        private static ScoInfo ProcessResult(ScoInfoResult result)
        {
            if (!result.Success || result.ScoInfo == null)
            {
                if ((result.Status.SubCode == StatusSubCodes.duplicate) && (result.Status.InvalidField == "name"))
                {
                    throw new WarningMessageException(Resources.Messages.MeetingNotUniqueName);
                }

                if ((result.Status.SubCode == StatusSubCodes.duplicate) && (result.Status.InvalidField == "url-path"))
                {
                    throw new WarningMessageException(Resources.Messages.MeetingNotUniqueUrlPath);
                }
                if (result.Status.SubCode == StatusSubCodes.session_schedule_conflict)
                {
                    throw new WarningMessageException(Resources.Messages.SessionScheduleConflict);
                }

                throw new WarningMessageException(result.Status.GetErrorInfo());
            }

            return(result.ScoInfo);
        }
Exemple #13
0
        private string SetupSharedMeetingsFolder(LmsCompany lmsCompany, LmsProvider lmsProvider, IAdobeConnectProxy provider)
        {
            string ltiFolderSco = null;
            string name         = lmsCompany.UserFolderName ?? lmsProvider.LmsProviderName;

            name = name.TruncateIfMoreThen(60);
            bool useDbFolderId = MeetingTypeFactory.UseDbMeetingFolderId(_lmsMeetingType);

            if (useDbFolderId && !string.IsNullOrWhiteSpace(lmsCompany.ACScoId))
            {
                ScoInfoResult meetingsFolder = provider.GetScoInfo(lmsCompany.ACScoId);
                if (meetingsFolder.Success && meetingsFolder.ScoInfo != null)
                {
                    if (meetingsFolder.ScoInfo.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
                    {
                        ltiFolderSco = meetingsFolder.ScoInfo.ScoId;
                    }
                    else
                    {
                        ScoInfoResult updatedSco =
                            provider.UpdateSco(
                                new FolderUpdateItem
                        {
                            ScoId    = meetingsFolder.ScoInfo.ScoId,
                            Name     = name,
                            FolderId = meetingsFolder.ScoInfo.FolderId,
                            Type     = ScoType.folder
                        });
                        if (updatedSco.Success && updatedSco.ScoInfo != null)
                        {
                            ltiFolderSco = updatedSco.ScoInfo.ScoId;
                        }
                    }
                }
            }

            if (ltiFolderSco == null)
            {
                var shortcutName = MeetingTypeFactory.GetMeetingFolderShortcut(_lmsMeetingType, false).GetACEnum();
                ScoContentCollectionResult sharedMeetings = provider.GetContentsByType(shortcutName);
                if (sharedMeetings.ScoId != null && sharedMeetings.Values != null)
                {
                    ScoContent existingFolder = sharedMeetings.Values.FirstOrDefault(v => v.Name.Equals(name, StringComparison.OrdinalIgnoreCase) && v.IsFolder);
                    if (existingFolder != null)
                    {
                        ltiFolderSco = existingFolder.ScoId;
                    }
                    else
                    {
                        ScoInfoResult newFolder = provider.CreateSco(new FolderUpdateItem {
                            Name = name, FolderId = sharedMeetings.ScoId, Type = ScoType.folder
                        });
                        if (newFolder.Success && newFolder.ScoInfo != null)
                        {
                            provider.UpdatePublicAccessPermissions(newFolder.ScoInfo.ScoId, SpecialPermissionId.denied);
                            ltiFolderSco = newFolder.ScoInfo.ScoId;
                        }
                    }
                }
                if (ltiFolderSco != null && useDbFolderId)
                {
                    lmsCompany.ACScoId = ltiFolderSco;
                }
            }

            return(ltiFolderSco);
        }
Exemple #14
0
        public async Task <HttpResponseMessage> UploadFile(string folderScoId)
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            var provider = new MultipartFormDataMemoryStreamProvider();
            await Request.Content.ReadAsMultipartAsync(provider);

            string name        = provider.FormData["name"];
            string description = provider.FormData["description"];
            string customUrl   = provider.FormData["customUrl"];

            if (!provider.FileStreams.Any())
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);

                //return Content(HttpStatusCode.BadRequest, "No file uploaded");
            }
            if (provider.FileStreams.Count != 1)
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
                //return Content(HttpStatusCode.BadRequest, "Single file expected");
            }

            try
            {
                string fileName = provider.FileStreams.First().Key;
                MultipartFormDataMemoryStreamProvider.FileContent stream = provider.FileStreams.First().Value;

                var           ac             = this.GetUserProvider();
                var           contentService = new ContentService(Logger, ac);
                var           helper         = new ContentEditControllerHelper(Logger, ac);
                int           fileSize;
                ScoInfoResult createdFile = helper.UploadFile(folderScoId, name, description, customUrl, fileName, stream.ContentType, stream.Stream, out fileSize);

                var sco = ac.GetScoContent(createdFile.ScoInfo.ScoId);
                var dto = new ScoContentDtoMapper().Map(sco.ScoContent);
                //TRICK:
                dto.ByteCount = fileSize;

                string output   = JsonSerializer.JsonSerialize(dto.ToSuccessResult());
                var    response = new HttpResponseMessage();
                response.Content = new StringContent(output);
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
                return(response);
            }
            catch (Exception ex)
            {
                IUserMessageException userError = ex as IUserMessageException;
                if (userError != null)
                {
                    string output = JsonSerializer.JsonSerialize(OperationResultWithData <ScoContentDto> .Error(ex.Message));
                    //JsonConvert.SerializeObject(OperationResultWithData<ScoContentDto>.Error(ex.Message));
                    var response = new HttpResponseMessage();
                    response.Content = new StringContent(output);
                    response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
                    return(response);
                }

                throw;
            }
        }
Exemple #15
0
        public ScoInfoResult UploadFile(string folderScoId, string name, string description, string customUrl,
                                        string fileName, string fileContentType, Stream fileStream,
                                        out int fileSize)
        {
            try
            {
                var createFile = new ContentUpdateItem
                {
                    FolderId    = folderScoId,
                    Name        = name,
                    Description = description,
                    UrlPath     = customUrl,
                    Type        = ScoType.content,
                };

                ScoInfoResult createdFile = _acProxy.CreateSco(createFile);

                if (!createdFile.Success || createdFile.ScoInfo == null)
                {
                    if ((createdFile.Status.SubCode == StatusSubCodes.duplicate) && (createdFile.Status.InvalidField == "name"))
                    {
                        throw new WarningMessageException(Resources.Messages.NameNotUnique);
                    }

                    if ((createdFile.Status.SubCode == StatusSubCodes.duplicate) && (createdFile.Status.InvalidField == "url-path"))
                    {
                        throw new WarningMessageException(Resources.Messages.UrlPathNotUnique);
                    }

                    if ((createdFile.Status.SubCode == StatusSubCodes.illegal_operation) && (createdFile.Status.InvalidField == "url-path"))
                    {
                        throw new WarningMessageException(Resources.Messages.UrlPathReserved);
                    }

                    if ((createdFile.Status.SubCode == StatusSubCodes.format) && (createdFile.Status.InvalidField == "url-path"))
                    {
                        throw new WarningMessageException(Resources.Messages.UrlPathInvalidFormat);
                    }

                    _logger.Error("UploadFile.CreateSco error. " + createdFile.Status.GetErrorInfo());
                    throw new WarningMessageException(createdFile.Status.Code.ToString() + " " + createdFile.Status.SubCode.ToString());
                }

                var uploadScoInfo = new UploadScoInfo
                {
                    scoId           = createdFile.ScoInfo.ScoId,
                    fileContentType = fileContentType,
                    fileName        = fileName,
                    fileBytes       = fileStream.ReadToEnd(),
                    title           = fileName,
                };

                // TRICK:
                fileSize = uploadScoInfo.fileBytes.Length;

                try
                {
                    StatusInfo uploadResult = _acProxy.UploadContent(uploadScoInfo);
                }
                catch (AdobeConnectException ex)
                {
                    try
                    {
                        _acProxy.DeleteSco(createdFile.ScoInfo.ScoId);
                    }
                    catch
                    {
                    }

                    // Status.Code: invalid. Status.SubCode: format. Invalid Field: file
                    if (ex.Status.Code == StatusCodes.invalid && ex.Status.SubCode == StatusSubCodes.format && ex.Status.InvalidField == "file")
                    {
                        throw new WarningMessageException(Resources.Messages.FileInvalidFormat);
                    }

                    throw new WarningMessageException("Error occured during file uploading.", ex);
                }

                return(createdFile);
            }
            catch (Exception ex)
            {
                _logger.Error("UploadFile", ex);
                throw;
            }
        }
Exemple #16
0
 /// <summary>
 /// The get model.
 /// </summary>
 /// <param name="scoInfoResult">
 /// The sco info.
 /// </param>
 /// <returns>
 /// The <see cref="T"/>.
 /// </returns>
 protected abstract T GetModel(ScoInfoResult scoInfoResult);