示例#1
0
        public virtual OperationResultWithData <IEnumerable <ACSessionDto> > GetSessionsReport([FromBody] ReportRequestDto request)
        {
            try
            {
                LmsCourseMeeting meeting = LmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, request.MeetingId);
                if (meeting == null)
                {
                    return(OperationResultWithData <IEnumerable <ACSessionDto> > .Error(Messages.MeetingNotFound));
                }

                IEnumerable <ACSessionDto> report = _reportService.GetSessionsReports(
                    meeting.GetMeetingScoId(),
                    GetAdminProvider(),
                    TimeZoneInfo.Utc,
                    request.StartIndex,
                    request.Limit);

                return(report.ToSuccessResult());
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("GetSessionsReport", ex);
                return(OperationResultWithData <IEnumerable <ACSessionDto> > .Error(errorMessage));
            }
        }
示例#2
0
        public string UpdateName(LmsCourseMeeting meeting, string lmsMeetingTitle)
        {
            if (meeting == null)
            {
                throw new ArgumentNullException(nameof(meeting));
            }
            if (string.IsNullOrWhiteSpace(lmsMeetingTitle))
            {
                throw new ArgumentException("Meeting Title is required", nameof(lmsMeetingTitle));
            }

            MeetingNameInfo nameInfo = _nameInfoDeserializer.JsonDeserialize <MeetingNameInfo>(meeting.MeetingNameJson);

            nameInfo.meetingName    = lmsMeetingTitle;
            meeting.MeetingNameJson = _nameInfoSerializer.JsonSerialize(nameInfo);

            if (meeting.LmsMeetingType == (int)LmsMeetingType.OfficeHours)
            {
                return(lmsMeetingTitle.TruncateIfMoreThen(60));
            }

            int extraDataLength = ((string)nameInfo.courseNum).Length + ": ".Length + " - ".Length + ((string)nameInfo.courseId).Length;

            if (extraDataLength > 52)
            {
                throw new WarningMessageException("Can't generate Adobe Connect meeting name. Course Label is too long.");
            }

            return(string.Format("{0}: {1} - {2}", (string)nameInfo.courseNum, lmsMeetingTitle.TruncateIfMoreThen(60 - extraDataLength), (string)nameInfo.courseId));
        }
示例#3
0
        public async Task <OperationResultWithData <SlotDto> > BookSlot([FromBody] CreateSlotDto dto)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, dto.MeetingId);

            if (meeting?.OfficeHours == null)
            {
                return(OperationResultWithData <SlotDto> .Error("Meeting not found"));
            }

            var slotResult = await _officeHoursService.AddSlots(meeting.OfficeHours.Id, Session.LmsUser, new[] { dto }, status : OfficeHoursSlotStatus.Booked);

            //if (slotResult.IsSuccess)
            //{
            //    var details = await _meetingApiService.GetMeetingApiDetails(meeting);
            //    var host = _userService.GetUser(meeting.ProviderHostId); //todo: get user data from lmsUser table
            //    if (host != null)
            //    {
            //        _queue.QueueBackgroundWorkItem(async token =>
            //        {
            //            await _notificationService.SendOHBookSlotEmail(slotResult.Data.First(), details.Topic, host.Email,
            //                $"{host.FirstName} {host.LastName}");
            //            Logger.Info($"Email for slotId={slotResult.Data.First().Id} is sent to host {host.Email}");
            //        });
            //    }
            //}

            return(slotResult.IsSuccess ? slotResult.Data.First().ToSuccessResult() : OperationResultWithData <SlotDto> .Error(slotResult.Message));
        }
示例#4
0
        public OperationResult SaveSeminarSession([FromBody] SeminarSessionInputDto seminarSessionDto)
        {
            try
            {
                // TRICK: change record meeting id to meeting sco-id
                LmsCourseMeeting meeting = this.LmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, long.Parse(seminarSessionDto.SeminarRoomId));
                if (meeting == null)
                {
                    return(OperationResult.Error(Messages.MeetingNotFound));
                }

                //NOTE: save under admin account doesn't work for user license
                var ac = GetUserProvider();
                ProcessQuota(ac, meeting.ScoId, seminarSessionDto);

                //var timeZone = AcAccountService.GetAccountDetails(ac, IoC.Resolve<ICache>()).TimeZoneInfo;
                var meetingUpdateResult = _seminarService.SaveSeminarSession(seminarSessionDto, meeting.ScoId, ac /*, timeZone*/);
                return(meetingUpdateResult);
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("SaveSeminarSession", ex);
                return(OperationResult.Error(errorMessage));
            }
        }
示例#5
0
        public OperationResult UnpublishRecording([FromBody] RecordingRequestDto request)
        {
            try
            {
                // TODO : FeatureName - but default value is true here!
                if (LmsCompany.AutoPublishRecordings)
                {
                    throw new WarningMessageException("UnPublishing is not allowed by LMS license settings");
                }

                LmsCourseMeeting meeting = this.LmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, request.MeetingId);
                var recording            = meeting.MeetingRecordings.FirstOrDefault(x => x.ScoId == request.RecordingId);
                if (recording != null)
                {
                    meeting.MeetingRecordings.Remove(recording);
                    LmsCourseMeetingModel.RegisterSave(meeting, flush: true);
                }

                return(OperationResult.Success());
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("PublishRecording", ex);
                return(OperationResult.Error(errorMessage));
            }
        }
示例#6
0
        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());
        }
示例#7
0
        private async Task CreateCalendarEvents(LtiParamDTO param, LmsCourseMeeting meeting)
        {
            if (_calendarEventService == null)
            {
                return;
            }


            foreach (var session in meeting.MeetingSessions)
            {
                var eventDto = new LmsCalendarEventDTO
                {
                    StartAt = session.StartDate,
                    EndAt   = session.EndDate,
                    Title   = session.Name
                };

                var lmsSettings = _license.GetLMSSettings(Settings);

                try
                {
                    LmsCalendarEventDTO lmsCalendarEvent =
                        await _calendarEventService.CreateEvent(param.course_id.ToString(), lmsSettings, eventDto);

                    session.LmsCalendarEventId = lmsCalendarEvent?.Id;
                }
                catch (Exception e)
                {
                    _logger.Error(e.Message);
                    return;
                }
            }
        }
示例#8
0
        public async Task <MeetingSessionDTO> CreateSessionAsync(int meetingId, LtiParamDTO param)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneById(meetingId).Value;

            MeetingNameInfo nameInfo = string.IsNullOrWhiteSpace(meeting.MeetingNameJson)
                ? new MeetingNameInfo()
                : JsonConvert.DeserializeObject <MeetingNameInfo>(meeting.MeetingNameJson);

            var      lastEvent = meeting.MeetingSessions.OrderByDescending(x => x.StartDate).FirstOrDefault();
            DateTime startDate = DateTime.UtcNow.AddHours(1);
            DateTime endDate   = startDate.AddHours(1);

            if (lastEvent != null)
            {
                startDate = lastEvent.StartDate.AddDays(1);
                endDate   = lastEvent.EndDate.AddDays(1);
            }

            var ev = new MeetingSessionDTO
            {
                Name      = nameInfo.meetingName + " #",
                Summary   = string.Empty,
                StartDate = startDate,
                EndDate   = endDate,
            };

            if (_calendarExportService != null)
            {
                var sakaiEventResult = await _calendarExportService.SaveEventsAsync(meetingId, new MeetingSessionDTO[] { ev }, param, _license);

                ev = sakaiEventResult.Single();
            }
            var dbEvent = new LmsMeetingSession
            {
                LmsCalendarEventId = ev.EventId,
                Name             = ev.Name,
                StartDate        = ev.StartDate,
                EndDate          = ev.EndDate,
                LmsCourseMeeting = meeting,
            };

            if (_calendarEventService != null)
            {
                var lmsSettings = _license.GetLMSSettings(Settings);
                LmsCalendarEventDTO calendarEventDto = new LmsCalendarEventDTO()
                {
                    Title   = dbEvent.Name,
                    StartAt = dbEvent.StartDate,
                    EndAt   = dbEvent.EndDate
                };
                LmsCalendarEventDTO newClaendarEventDto = await _calendarEventService.CreateEvent(param.course_id.ToString(), lmsSettings, calendarEventDto);

                dbEvent.LmsCalendarEventId = newClaendarEventDto?.Id;
            }

            meeting.MeetingSessions.Add(dbEvent);
            _lmsCourseMeetingModel.RegisterSave(meeting, true);
            return(ConvertFromEntity(dbEvent));
        }
示例#9
0
        private static LmsMeetingSession GetMeetingSession(MeetingSessionDTO dto, LmsCourseMeeting meeting)
        {
            var meetingSession = meeting.MeetingSessions.SingleOrDefault(x => x.Id == dto.Id)
                                 ?? new LmsMeetingSession {
                LmsCourseMeeting = meeting
            };

            return(meetingSession);
        }
示例#10
0
        public async Task <OperationResultWithData <OfficeHoursTeacherAvailabilityDto> > AddAvailabitily([FromBody] OfficeHoursTeacherAvailabilityDto dto)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, dto.MeetingId);

            if (meeting?.OfficeHours == null)
            {
                return(OperationResultWithData <OfficeHoursTeacherAvailabilityDto> .Error("Meeting not found"));
            }
            var result = await _officeHoursService.AddAvailability(meeting.OfficeHours, Session.LmsUser, dto);

            return(result);
        }
示例#11
0
        public async Task <OperationResultWithData <IEnumerable <OfficeHoursTeacherAvailabilityDto> > > GetAvailabilities([FromBody] MeetingIdDto dto)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, dto.MeetingId);

            if (meeting?.OfficeHours == null)
            {
                return(OperationResultWithData <IEnumerable <OfficeHoursTeacherAvailabilityDto> > .Error("Meeting not found"));
            }
            var availabilities = await _officeHoursService.GetAvailabilities(meeting.OfficeHours.Id, null); //todo: show slots accross the courses

            return(availabilities.ToSuccessResult());
        }
示例#12
0
        public async Task <OperationResult> ResetDeniedDate([FromBody] DenyDateDto dto)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, dto.MeetingId);

            if (meeting?.OfficeHours == null)
            {
                return(OperationResultWithData <IEnumerable <SlotDto> > .Error("Meeting not found"));
            }
            var result = await _officeHoursService.ResetDeniedSlots(meeting.OfficeHours.Id, dto);

            return(result);
        }
示例#13
0
        [LmsAuthorizeBase] // TeacherOnly ?
        public async Task <OperationResultWithData <SlotDto> > DenySlotByDate([FromBody] DenySlotByDateDto dto)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, dto.MeetingId);

            if (meeting?.OfficeHours == null)
            {
                return(OperationResultWithData <SlotDto> .Error("Meeting not found"));
            }
            var result = await _officeHoursService.DenySlotByDate(meeting.OfficeHours.Id, dto.Start, Session.LmsUser);

            return(result);
        }
示例#14
0
        public async Task <OperationResultWithData <List <SlotDto> > > RescheduleDate([FromBody] RescheduleDateDto dto)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, dto.MeetingId);

            if (meeting?.OfficeHours == null)
            {
                return(OperationResultWithData <List <SlotDto> > .Error("Meeting not found"));
            }
            var slots = await _officeHoursService.RescheduleDate(meeting.OfficeHours.Id, Session.LmsUser, dto);

            return(slots);
        }
示例#15
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));
            }
        }
示例#16
0
        public async Task <MeetingSessionDTO> SaveSessionAsync(int meetingId, MeetingSessionDTO dto, LtiParamDTO param)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneById(meetingId).Value;
            var meetingSession       = GetMeetingSession(dto, meeting);

            if (meetingSession.Id == 0)
            {
                meeting.MeetingSessions.Add(meetingSession);
            }

            await UpdateCalendarEvent(dto, param, meetingSession);

            UpdateMeetingSession(dto, meetingSession);
            _lmsCourseMeetingModel.RegisterSave(meeting, true);
            return(ConvertFromEntity(meetingSession));
        }
示例#17
0
        //private static IEnumerable<IRecordingDto> GetRecordingsLegacy(string meetingSco,
        //    string accountUrl,
        //    TimeZoneInfo timeZone,
        //    Esynctraining.AdobeConnect.IAdobeConnectProxy provider)
        //{
        //    var result = new List<RecordingDto>();
        //    ScoContentCollectionResult apiRecordings = provider.GetMeetingRecordings(new [] {meetingSco});

        //    foreach (var v in apiRecordings.Values)
        //    {
        //        var moreDetails = provider.GetScoPublicAccessPermissions(v.ScoId);
        //        var isPublic = false;
        //        if (moreDetails.Success && moreDetails.Values.Any())
        //        {
        //            isPublic = moreDetails.Values.First().PermissionId == PermissionId.view;
        //        }

        //        result.Add(new RecordingDto(v, accountUrl, isPublic, timeZone));
        //    }

        //    return result;
        //}

        private static void ProcessPublishedFlag(ILmsLicense lmsCompany, LmsCourseMeeting meeting, IEnumerable <IRecordingDto> records)
        {
            if (lmsCompany.AutoPublishRecordings)
            {
                foreach (var item in records)
                {
                    item.Published = true;
                }
            }
            else
            {
                foreach (var item in records)
                {
                    item.Published = meeting.MeetingRecordings.Any(r => r.ScoId == item.Id);
                }
            }
        }
示例#18
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());
        }
示例#19
0
        public async Task <IEnumerable <MeetingSessionDTO> > CreateBatchAsync(CreateMeetingSessionsBatchDto dto, LtiParamDTO param)
        {
            LmsCourseMeeting meeting   = _lmsCourseMeetingModel.GetOneById(dto.MeetingId).Value;
            DateTime         startDate = dto.StartTimestamp;

            var endDate = TimeSpan.TryParse(dto.Duration, out var duration)
                ? startDate.AddMinutes((int)duration.TotalMinutes)
                : startDate.AddHours(1);

            //MeetingNameInfo nameInfo = string.IsNullOrWhiteSpace(meeting.MeetingNameJson)
            //    ? new MeetingNameInfo()
            //    : JsonConvert.DeserializeObject<MeetingNameInfo>(meeting.MeetingNameJson);
            //var meetingName = nameInfo.meetingName ?? nameInfo.reusedMeetingName;
            //int i = 1;
            var latestDateToCheck = startDate.AddDays(dto.Weeks * 7);

            var listOfEvents = new List <MeetingSessionDTO>();

            while (startDate < latestDateToCheck)
            {
                if (dto.DaysOfWeek.Contains((int)startDate.DayOfWeek))
                {
                    var ev = new MeetingSessionDTO
                    {
                        //Name = meetingName + " #" + i.ToString(),
                        Summary   = string.Empty,
                        StartDate = startDate, //.ToString("yyyy-MM-dd HH:mm"),
                        EndDate   = endDate,   //.ToString("yyyy-MM-dd HH:mm"),
                    };
                    listOfEvents.Add(ev);
                    //i++;
                }

                startDate = startDate.AddDays(1);
                endDate   = endDate.AddDays(1);
            }

            if (_calendarExportService != null)
            {
                listOfEvents = (await _calendarExportService.SaveEventsAsync(meeting.Id, listOfEvents, param, _license))
                               .ToList();
            }

            return(listOfEvents.ToArray());
        }
示例#20
0
        public string UpdateName(LmsCourseMeeting meeting, string lmsMeetingTitle)
        {
            if (meeting == null)
            {
                throw new ArgumentNullException(nameof(meeting));
            }
            if (string.IsNullOrWhiteSpace(lmsMeetingTitle))
            {
                throw new ArgumentException("Meeting Title is required", nameof(lmsMeetingTitle));
            }

            MeetingNameInfo nameInfo = _nameInfoDeserializer.JsonDeserialize <MeetingNameInfo>(meeting.MeetingNameJson);

            nameInfo.meetingName    = lmsMeetingTitle;
            meeting.MeetingNameJson = _nameInfoSerializer.JsonSerialize(nameInfo);

            return(lmsMeetingTitle.TruncateIfMoreThen(60));
        }
示例#21
0
 private async Task RemoveCalendarEvents(LmsCourseMeeting meeting)
 {
     if (_calendarEventService != null)
     {
         try
         {
             var lmsSettings = _license.GetLMSSettings(Settings);
             foreach (var session in meeting.MeetingSessions.Where(s => !String.IsNullOrEmpty(s.LmsCalendarEventId)))
             {
                 await _calendarEventService.DeleteCalendarEvent(session.LmsCalendarEventId, lmsSettings);
             }
         }
         catch (Exception e)
         {
             _logger.Error(e.Message);
         }
     }
 }
示例#22
0
        public async Task <OperationResultWithData <IEnumerable <SlotDto> > > GetSlots([FromBody] GetSlotsDto dto)
        {
            LmsCourseMeeting meeting = _lmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, dto.MeetingId);

            if (meeting?.OfficeHours == null)
            {
                return(OperationResultWithData <IEnumerable <SlotDto> > .Error("Meeting not found"));
            }
            var      dateStartConverted = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(dto.Start);
            DateTime?dateEndConverted   = dto.End.HasValue ? new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(dto.End.Value) : (DateTime?)null;
            var      slots = await _officeHoursService.GetSlots(meeting.OfficeHours.Id, Session.LmsUser.Id, dateStartConverted, dateEndConverted);

            if (dto.Status.HasValue)
            {
                slots = slots.Where(x => x.Status == dto.Status.Value);
            }

            return(slots.ToSuccessResult());
        }
示例#23
0
        public async Task DeleteSessionAsync(int meetingId, int id, LtiParamDTO param)
        {
            LmsCourseMeeting  meeting = null;
            LmsMeetingSession dbEvent = null;

            if (meetingId != 0)
            {
                meeting = _lmsCourseMeetingModel.GetOneById(meetingId).Value;

                dbEvent = meeting.MeetingSessions.FirstOrDefault(x => x.Id == id);

                if (dbEvent == null)
                {
                    throw new InvalidOperationException(
                              $"Could not find meeting session in database. MeetingId={meetingId}, Id={id}");
                }
            }

            if (_calendarExportService != null)
            {
                var deleteResult = (await _calendarExportService.DeleteEventsAsync(new[] { dbEvent.LmsCalendarEventId }, param, _license))
                                   .Single();

                if (!string.IsNullOrWhiteSpace(deleteResult) &&
                    !dbEvent.LmsCalendarEventId.Equals(deleteResult, StringComparison.InvariantCultureIgnoreCase))
                {
                    // TODO: logging
                    throw new InvalidOperationException("Some events could not be removed from Sakai calendar.");
                }
            }

            await RemoveCalendarEvent(dbEvent);

            if (meetingId != 0)
            {
                meeting.MeetingSessions.Remove(dbEvent);
                _lmsCourseMeetingModel.RegisterSave(meeting, true);
            }
        }
示例#24
0
        public virtual OperationResultWithData <IEnumerable <RecordingTransactionDTO> > GetRecordingsReport([FromBody] MeetingRequestDto request)
        {
            try
            {
                LmsCourseMeeting meeting = LmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, request.MeetingId);
                if (meeting == null)
                {
                    return(OperationResultWithData <IEnumerable <RecordingTransactionDTO> > .Error(Messages.MeetingNotFound));
                }

                IEnumerable <RecordingTransactionDTO> report = new LtiReportService().GetRecordingsReport(
                    GetAdminProvider(),
                    meeting);

                return(report.ToSuccessResult());
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("GetRecordingsReport", ex);
                return(OperationResultWithData <IEnumerable <RecordingTransactionDTO> > .Error(errorMessage));
            }
        }
示例#25
0
        public async Task DeleteMeetingSessionsAsync(LmsCourseMeeting meeting, LtiParamDTO param)
        {
            //if (meeting.MeetingSessions.Any())
            //{
            //    var events = new HashSet<string>(meeting.MeetingSessions.Select(x => x.EventId));

            //    if (_calendarExportService != null)
            //    {
            //todo:uncomment if need to delete sessions from API when deleting meeting
            //var deleteResultIds = await _calendarExportService.DeleteEventsAsync(null, param, _license);

            //    if (!events.SetEquals(deleteResultIds))
            //    {
            //        _logger.Error(
            //            $"List of all calendar events {string.Join(",", events)}, response is  {string.Join(",", deleteResultIds.ToArray())} ");
            //        throw new InvalidOperationException("Some events could not be removed from Sakai calendar.");
            //    }
            //}

            //    meeting.MeetingSessions.Clear();
            //    _lmsCourseMeetingModel.RegisterSave(meeting);
            //}
        }
示例#26
0
        /// <summary>
        /// The meeting SCO id.
        /// </summary>
        /// <param name="meeting">
        /// The meeting.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        public static string GetMeetingScoId(this LmsCourseMeeting meeting)
        {
            if (meeting == null)
            {
                throw new ArgumentNullException(nameof(meeting));
            }

            if (meeting.ScoId != null)
            {
                return(meeting.ScoId);
            }

            if (meeting.OfficeHours != null)
            {
                return(meeting.OfficeHours.ScoId);
            }

            // TODO: investigate
            //if (meeting.Id > 0)
            //    throw new InvalidOperationException($"sco-id for meeting {meeting.Id} not found.");

            return(null);
        }
示例#27
0
        public string UpdateName(LmsCourseMeeting meeting, string lmsMeetingTitle)
        {
            if (meeting == null)
            {
                throw new ArgumentNullException(nameof(meeting));
            }
            if (string.IsNullOrWhiteSpace(lmsMeetingTitle))
            {
                throw new ArgumentException("Meeting Title is required", nameof(lmsMeetingTitle));
            }

            MeetingNameInfo nameInfo = _nameInfoDeserializer.JsonDeserialize <MeetingNameInfo>(meeting.MeetingNameJson);

            nameInfo.meetingName    = lmsMeetingTitle;
            meeting.MeetingNameJson = _nameInfoSerializer.JsonSerialize(nameInfo);

            if (meeting.LmsMeetingType == (int)LmsMeetingType.OfficeHours)
            {
                return(lmsMeetingTitle.TruncateIfMoreThen(60));
            }

            return(string.Format("{0}: {1}", (string)nameInfo.courseNum, lmsMeetingTitle).TruncateIfMoreThen(60));
        }
示例#28
0
        private void UpdateACRoles(ILmsLicense lmsCompany, LmsCourseMeeting meeting,
                                   IAdobeConnectProxy acProvider, List <MeetingPermissionInfo> enrollments)
        {
            string error        = null;
            var    meetingRoles = usersSetup.GetUserMeetingRoles(meeting);

            var dbUsers = meetingRoles
                          .Select(x => x.User);

            try
            {
                usersSetup.SetDefaultRolesForNonParticipants(
                    lmsCompany,
                    acProvider,
                    meeting,
                    meetingRoles.Select(x => new LmsUserDTO
                {
                    AcId    = x.User.PrincipalId,
                    Id      = x.User.UserIdExtended ?? x.User.UserId,
                    LtiId   = x.User.UserId,
                    Login   = x.User.Username,
                    Name    = x.User.Name,
                    Email   = x.User.Email,
                    LmsRole = x.LmsRole
                }),
                    dbUsers,
                    enrollments,
                    ref error);
            }
            catch (Exception e)
            {
                var message = String.Format(
                    "Error happened when tried to update users in AC for meetingId={0}, scoId={1}",
                    meeting.Id, meeting.GetMeetingScoId());
                logger.Error(message, e);
            }
        }
示例#29
0
        public async Task DeleteMeetingSessionsAsync(LmsCourseMeeting meeting, LtiParamDTO param)
        {
            if (meeting.MeetingSessions.Any())
            {
                var events = new HashSet <string>(meeting.MeetingSessions.Select(x => x.LmsCalendarEventId));

                if (_calendarExportService != null)
                {
                    var deleteResultIds = await _calendarExportService.DeleteEventsAsync(events, param, _license);

                    if (!events.SetEquals(deleteResultIds))
                    {
                        _logger.Error(
                            $"List of all calendar events {string.Join(",", events)}, response is  {string.Join(",", deleteResultIds.ToArray())} ");
                        throw new InvalidOperationException("Some events could not be removed from Sakai calendar.");
                    }
                }

                await RemoveCalendarEvents(meeting);

                meeting.MeetingSessions.Clear();
                _lmsCourseMeetingModel.RegisterSave(meeting);
            }
        }
示例#30
0
        public virtual OperationResultWithData <IEnumerable <ACSessionParticipantDto> > GetAttendanceReport([FromBody] ReportRequestDto request)
        {
            try
            {
                LmsCourseMeeting meeting = this.LmsCourseMeetingModel.GetOneByCourseAndId(LmsCompany.Id, CourseId, request.MeetingId);
                if (meeting == null)
                {
                    return(OperationResultWithData <IEnumerable <ACSessionParticipantDto> > .Error(Messages.MeetingNotFound));
                }

                IEnumerable <ACSessionParticipantDto> report = _reportService.GetAttendanceReports(
                    meeting.GetMeetingScoId(),
                    this.GetAdminProvider(),
                    TimeZoneInfo.Utc,
                    request.StartIndex,
                    request.Limit);

                // TRICK: check that is not API call.
                if (SessionSave != null)
                {
                    // TRICK: clean not to serialize
                    foreach (var item in report)
                    {
                        item.login       = null;
                        item.principalId = null;
                    }
                }

                return(report.ToSuccessResult());
            }
            catch (Exception ex)
            {
                string errorMessage = GetOutputErrorMessage("GetAttendanceReport", ex);
                return(OperationResultWithData <IEnumerable <ACSessionParticipantDto> > .Error(errorMessage));
            }
        }