/// <summary> /// Возвращает список событий как виртуальных так и реальных. /// </summary> /// <param name="filterColl">The filter coll.</param> /// <param name="request">The request.</param> /// <returns></returns> private static IEnumerable <CalendarEventEntity> ListEvents(FilterElementCollection filterColl, CalendarEventListRequest request) { McEvent mcEvent = null; //Конструируем стандартный запрос LIST без критериев содержащих дату начала и конца события ListRequest moListRequest = (ListRequest)EventHelper.ConstructRequest <ListRequest>(request.Target, true); moListRequest.Filters = filterColl.ToArray(); moListRequest.Sorting = request.Sorting; //выполняем стандартный запрос ListResponse listResp = (ListResponse)BusinessManager.Execute(moListRequest); if (listResp != null && listResp.EntityObjects != null) { //Пробегаем по реальным events foreach (CalendarEventEntity entity in listResp.EntityObjects) { mcEvent = EventHelper.LoadCalEvent(entity.PrimaryKeyId.Value); if (mcEvent.IsReccuring) { iCalDateTime dtReccurBase = mcEvent.DTStart; //Пробегаем по виртуальным events foreach (Occurrence occur in mcEvent.GetOccurrences(mcEvent.DTStart, mcEvent.RecurrenceSeriesEndDate)) { //Создаем виртуальные события VirtualEventId vEventId = (VirtualEventId)entity.PrimaryKeyId; vEventId.RecurrenceId = EventHelper.iCalDateTime2Recurrence(dtReccurBase, occur.Period.StartTime); //Set virtual id mcEvent.UID = vEventId.ToString(); //Set recurrence-ID mcEvent.Recurrence_ID = occur.Period.StartTime; mcEvent.DTStart = occur.Period.StartTime; mcEvent.DTEnd = occur.Period.EndTime; EntityObjectHierarchy recurrenceEntity = EventHelper.ConstructEntityHierarchy(mcEvent); CalendarEventEntity occurEventEntity = recurrenceEntity.InnerEntity as CalendarEventEntity; if (occurEventEntity != null) { yield return(occurEventEntity); } } } else { yield return(entity); } } } }
/// <summary> /// Reads the right check. /// </summary> /// <param name="context">The context.</param> private void ReadRightCheck(BusinessContext context) { //Если есть флаг отключить проверку авторизации то ничего не фильтруем if (!SkipSecurityCheckScope.IsActive) { string securityViewQuery = @"SELECT ObjectId FROM [dbo].[CalendarEvent_Security_Read]"; //Добавляем в sql context текущего пользователя SetContextInfo(Security.CurrentUserId); //Для метода List необходимо отфильтровать список согласно security view if (context.GetMethod() == RequestMethod.List) { ListRequest listRequest = context.Request as ListRequest; FilterElementCollection filterColl = new FilterElementCollection(); foreach (FilterElement origFilterEl in listRequest.Filters) { filterColl.Add(origFilterEl); } FilterElement filterEl = new FilterElement("PrimaryKeyId", FilterElementType.In, securityViewQuery); filterColl.Add(filterEl); //перезаписываем старую коллекцию фильтров, новой listRequest.Filters = filterColl.ToArray(); } //Для метода Load необходмио предотвратить загрузку объета не имеющего соотв прав else if (context.GetMethod() == RequestMethod.Load) { LoadRequest loadRequest = context.Request as LoadRequest; PrimaryKeyId eventId = loadRequest.Target.PrimaryKeyId.Value; VirtualEventId vEventId = (VirtualEventId)eventId; if (vEventId.IsRecurrence) { eventId = vEventId.RealEventId; } if (BusinessObject.GetTotalCount(DataContext.Current.GetMetaClass(CalendarEventEntity.ClassName), new FilterElement[] { new FilterElement("PrimaryKeyId", FilterElementType.Equal, eventId), new FilterElement("PrimaryKeyId", FilterElementType.In, securityViewQuery) }) == 0) { throw new Exception("Read access denied"); } } } }
/// <summary> /// Регестрирует все изменения над событиями в хранилище метаданных /// Данный plugin должен быть подписан на все post события производимые над всеми метаклассами событий /// В хранилище метаданных отслеживаться будет только события (в случаи наличия рекрсии только базовое зобытие рекрсии). /// Например: 1. Если мы изменяем ресурсы события то в хранилище метаданных изменится версия связанного с данным ресурсом события. /// 2. Если мы создаем exception то обновиться метаданные только базовго события, а новые метаданные для exception созданы не будут. /// </summary> /// <param name="context">The context.</param> public void Execute(BusinessContext context) { bool needTracking = false; //Отмлеживаем только во время отсутствия прцесса синхронизации if (!CalendarEventSyncProvider.SyncSessionInProcess(Provider.ReplicaId)) { //Регистрируем только вызовы BusinessObjectRequestHandler, все вызовы перехватываемые обработчиком //отслеживать не нужно. bool origRequestInvoked = context.Request.Parameters.GetValue <bool>(Mediachase.Ibn.Events.CustomMethods.EventHelper.FORCE_BASE_PARAM, false); if (origRequestInvoked) { //перечисление методов switch (context.GetMethod()) { case RequestMethod.Create: case RequestMethod.Delete: case RequestMethod.Update: case CalendarResourcesUpdateMethod.METHOD_NAME: case ChangeTrackingMethod.METHOD_NAME: needTracking = true; break; } } } if (needTracking) { PrimaryKeyId?eventId = null; //Пытаемся получить event pk из запроса или ответа if (context.GetTargetMetaClassName() == CalendarEventEntity.ClassName) { eventId = context.Request.Target.PrimaryKeyId; if (eventId == null) { eventId = ((CreateResponse)context.Response).PrimaryKeyId; } } else if (context.GetTargetMetaClassName() == CalendarEventRecurrenceEntity.ClassName) { eventId = (PrimaryKeyId?)context.Request.Target[CalendarEventRecurrenceEntity.FieldEventId]; } else if (context.GetTargetMetaClassName() == CalendarEventResourceEntity.ClassName) { eventId = (PrimaryKeyId?)context.Request.Target[CalendarEventResourceEntity.FieldEventId]; } VirtualEventId vEventId = (VirtualEventId)eventId.Value; eventId = vEventId.RealEventId; //для события (виртуального или exception) необходимо произвести обновление только метаданных //родительского события if (vEventId.IsRecurrence) { ChangeVersionMetadataItem(eventId); } else { //только для методов касающихся события выполняются операции создания и удаления метаданных if (context.GetTargetMetaClassName() == CalendarEventEntity.ClassName && context.Request.Method == RequestMethod.Create) { CreateMetadataItem(eventId.Value); } else if (context.GetTargetMetaClassName() == CalendarEventEntity.ClassName && context.Request.Method == RequestMethod.Delete) { MarkAsTombstoneMetadataItem(eventId); } else { ChangeVersionMetadataItem(eventId); } } } }