Публикуйте события CalDav для участников сайта и управляйте участниками

Я использую сайт PHP с пользовательской базой данных и управляемой базой данных общего календаря (событий).

Я хочу опубликовать эти события в iCal / CalDAV, чтобы участники могли:

  • Синхронизация всех событий календаря с аутентификацией (частный URL ...)
  • Присоединяйтесь к мероприятию
  • (Но не создавать и не изменять событие)

Приложение должно использовать существующую на сайте базу данных пользователей и календарей.

Я просмотрел реализации CalDav в PHP и Python, все они кажутся слишком сложными для этого простого использования:

  • saber / dav имеет экспериментальную поддержку общего календаря, и использование существующей базы данных пользователей кажется сложной задачей.
  • DAViCal, похоже, имеет собственную базу данных пользователей, сложные схемы ACL и т. д.
  • И Т. Д.

Как это сделать?

  • Используйте адаптированную библиотеку CalDAV / iCal? Есть идеи библиотеки, которая справилась бы с этой работой?
  • Напишите свой собственный сервер CalDAV / iCal с риском плохой поддержки клиентов.

РЕДАКТИРОВАТЬ: полезные ссылки для использования saber / dav с существующей базой данных веб-сайта:

РЕДАКТИРОВАТЬ: Улучшения:

  • Несмотря на то, что он работает должным образом, saber / DAV оказывается слишком медленно при создании серверного события с приглашениями для ~ 100 местных жителей («принципалов»). И он генерирует 99 бесполезных копий события для каждого приглашенного. На обработку приглашений ушло около 8 секунд (30+ секунд при включенном профилировании xdebug, и это привело к сбою!).

  • Что касается использования общего календаря, в стандарте есть только две возможности: либо предоставить приглашенному доступ для чтения и записи, чтобы он мог присоединиться к мероприятию (но также изменить / удалить его!), Либо предоставить ему доступ для чтения и записи. только доступ ... но он не может к нему присоединиться. Итак, я играл с Sabre\CalDAV\Backend\PDO::updateCalendarObject(), чтобы ограничить редактирование событий участником PARTSTAT.

Но каким бы ни было решение, есть проблема с конфликтами:

  • Когда участник A изменяет запись календаря, говоря, что он участвует (PARTSTAT ACCEPTED), Sabre / DAV обрабатывает эту информацию, обновляя все объекты календаря во всех календарях пользователей. При этом SabreDAV увеличивает токен SYNC всех этих календарей.

  • Поэтому, когда участник B пытается присоединиться к мероприятию, но не синхронизировал информацию о том, что участник A присоединился к мероприятию, возникает конфликт, и информация о присоединении участника B становится УТЕРЯНОЙ.

Решение конфликта:

  • RFC 6638 определяет способ избежать таких конфликтов с помощью aschedule-tag. Это только в дорожной карте Sabre / DAV для v3.3. Я разработал экспериментальную поддержку для saber / dav здесь, но все же все Клиенты Android, которые я тестировал, не поддерживают этот RFC, только iOS поддерживает! В любом случае, даже с schedule-tag, если организатор изменит данные мероприятия или при использовании общих календарей, часть информации о присоединении участников будет потеряна.

  • Поэтому я сделал свою собственную реализацию saber / dav, чтобы в большинстве случаев никогда не терять информацию о присоединении к участникам (кроме случаев, когда событие переносится): saber / dav partstat-only-calendar. По сути, он работает, учитывая конфликтующее СОБЫТИЕ, отправленное пользователем, и записывает только информацию PARSTAT участника в событии сервера, вместо того, чтобы обычно выдвигать исключение PreconditionFailed. Мне все еще нужно опубликовать пример сценария запуска сервера, который использует все функции.


person KrisWebDev    schedule 21.04.2016    source источник


Ответы (1)


(Вопрос для StackOverflow кажется слишком широким.)

SabreDAV кажется лучшим выбором при реализации сервера Cal / CardDAV на PHP. Скорее всего, имеет смысл его использовать.

a) Получите все события календаря в синхронизации, с аутентификацией (частный URL ...)

Что ж, это нужно прикрыть.

б) Присоединяйтесь к мероприятию

Я предполагаю, что ваш вариант использования заключается в том, что у вас есть мероприятие, но пользователь не приглашен на него заранее. Но вы по-прежнему хотите, чтобы пользователь-пользователь «добавил» себя к событию. Это не тот вариант использования, который в настоящее время поддерживает стандарт CalDAV. В CalDAV есть общие календари и запланированные события на стороне сервера. Я думаю, что последнее может сработать для вас.

Вы можете синтезировать это поведение «надстройки». Динамически добавлять пользователя в качестве участника события при его представлении клиенту. Затем он может Принять / Может быть / Отклонить. Если он это сделает, настаивайте на этом факте в главном событии - теперь он постоянный приглашенный.

c) (Но не создавать и не изменять событие)

Это поведение по умолчанию для запланированных событий сервера iTIP / CalDAV. Только ОРГАНИЗАТОР может изменять события, за исключением таких вещей, как сигналы тревоги и т. Д. Так что, похоже, это соответствует вашему варианту использования.

person hnh    schedule 21.04.2016
comment
Спасибо, вы помогли мне использовать SabreDAV. Его можно настроить с помощью пользовательских authentication, principal и calendar бэкэндов, так что это способ использовать существующую базу данных сайта. В документации нет примеров, но это помогло. - person KrisWebDev; 22.04.2016