Пример #1
0
        /// <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);
                    }
                }
            }
        }
Пример #2
0
        /// <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");
                    }
                }
            }
        }
Пример #3
0
        /// <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);
                    }
                }
            }
        }