Как хранить данные (заметки, исполнители) для повторяющихся событий, сгенерированных с помощью RRULE

Я создаю приложение календаря, которое позволяет пользователям создавать повторяющиеся события.

Вместо создания нового объекта в MongoDB для каждого повторяющегося события я создаю один объект события с прикрепленным к нему правилом повторения.

Затем на клиенте я «расширяю» правило повторения, чтобы создавать временные объекты для каждого повторения события, чтобы все они отображались в календаре.

Все это работает очень хорошо и предотвращает заполнение моей БД сотнями объектов каждый раз, когда событие часто повторяется. Мой вопрос: как я могу хранить данные для каждого повторяющегося события? Например, играя с календарем Google, я могу создать повторяющееся событие, а затем добавить «примечания» к каждому повторению. Примечания могут быть добавлены либо к одному событию, либо ко всем событиям.

До сих пор я думал, что когда пользователь хочет добавить «заметки», добавить EXDATE для повторения, которое редактирует пользователь, а затем создать для него новый автономный объект события.

Я не уверен, что это лучший способ подойти к этому. Совет очень ценится.


person Sean    schedule 29.03.2017    source источник


Ответы (1)


С точки зрения представления iCalendar, правильный способ моделирования такого исключения состоит в том, чтобы сделать его частью того же события (тот же UID) с дополнительным параметром RECURRENCE-ID. Вы не должны добавлять EXDATE:

BEGIN:VEVENT
UID:XXX
DTSTART;TZID=zzz:20170401T090000
RRULE:FREQ=DAILY
...
END:VEVENT
BEGIN:VEVENT
UID:XXX
RECURRENCE-ID;TZID=zzz:20170405T090000
DTSTART;TZID=zzz:20170405T090000
... 
END:VEVENT

Обратите внимание, что RECURRENCE-ID исключения всегда должен соответствовать дате и времени, рассчитанному из RRULE, в то время как DTSTART исключения может отличаться (например, если в одном экземпляре вы переместите время события с 9 на 10, RECURRENCE -ID будет T090000, а DTSTART будет иметь T100000.

См. также https://tools.ietf.org/html/rfc5546#section- 4.4.2

person Arnaud Quillaud    schedule 30.03.2017