Intégration de CalDAV en Rails

gab_
3 min readFeb 16, 2021

--

Chez Kinoba, nous voulions mettre au point un outil interne pour la gestion des congés et une fonctionnalité qui nous semblait primordial était l’ajout automatique d’un évènement sur notre calendrier d’équipe, une fois le congé validé.

La première étape était de comprendre le protocole utilisé pour transférer l’information entre la plateforme et notre calendrier. Nous utilisons Nextcloud pour notre agenda partagé qui implémente le protocole CalDAV. Pour simplifier, il est possible d’envoyer via ce protocole des informations qui sont formatées grâce à un autre protocole : iCalendar

Le protocole iCalendar

C’est un format de donnée RFC 5545 proposé pour les échanges de données de calendrier. Il est possible de décrire un calendrier (VCALENDAR) mais aussi un évènement (VEVENT), un todo (VTODO) et d’autres composants…

BEGIN:VEVENT
UID:123456789
DTSTAMP:20210201T080000Z
DTSTART:20210201T123000Z
DTEND:20210201T133000Z
SUMMARY:Lunch
CLASS:PRIVATE
CATEGORIES:BUSINESS
END:VEVENT

L’exemple ci-dessus est une représentation d’un évènement Lunch qui se déroule le 2 février 2021 entre 12h30 et 13h30 UTC.

Nous connaissons maintenant le format utilisé pour transférer les données et il existe une gem icalendar (bien maintenue) qui permet de passer d’un objet ruby à une donnée iCalendar. Il faut maintenant trouver le moyen de transférer cette information sur le serveur et c’est là qu’entre en jeu le protocole CalDAV.

Le protocole CalDAV

C’est le moyen d’éditer un calendrier en ligne, il est décrit par la RFC 4791 et c’est une autre extension à WebDAV qui est lui-même basé sur HTTP et qui permet de traiter les fichiers. CalDAV va traiter seulement les fichiers ics du protocole iCalendar.

Trouver une gem qui gère CalDAV est un peu plus compliqué, celles qui existent ne semblent pas très actives.

La gem int2root/twisted-caldav

Nous avons fini par trouver la gem twisted-caldav qui semblait correspondre à nos souhaits et qui avait été mise à jour il y a 9 mois. En regardant plus en détails, cette gem utilisait une ancienne version majeure de icalendar (1.x au lieu de 2.x). Nous décidons de rentrer en détails dans le code pour faire les modifications appropriées dans le but de proposer des changements de code pour la nouvelle version d’icalendar.

Finalement nous avons effectué plusieurs changements : mise à jour des dépendances, refactorisation du code client.rb et ajout de l’attribut transp qui permet de savoir s’il faut noter l’évènement comme libre ou occupé dans le calendrier. Nous avons aussi apporté une amélioration de la gestion des dates de début et de fin d’un évènement, il est possible d’envoyer une date dans plusieurs formats : timestamps, format avec timezone ou sans car le protocole laisse le choix sur l’utilisation ou non des timezones. Les deux PR sont accessibles ici et .

Mise en place de la gem twisted-caldav

Grâce à nos changements, la communauté a maintenant une gem à jour pour ajouter des évènements dans un calendrier. La mise en place de cette gem est simple et classique :

gem install 'twisted-caldav'

Et son utilisation :

require 'twisted-caldav'

u = 'user1'
# initialisation du calendrier
cal = TwistedCaldav::Client.new(uri: "http://yourserver.com:8008/calendars/users/#{u}/calendar/", user: u , password: 'xxxxxx')
# récupération des évènements déjà créés
events = cal.find_events(start: '2021-02-01', end: '2021-04-16')
# création d'un évènement
event = cal.create_event(start: '20210416T1000Z', end: '20210416T1100Z', title: 'Rendez-vous')

Finalement, grâce à cette gem, nous avons maintenant un outil complet pour trouver et créer des congés dans notre calendrier et même si cette librairie n’était pas parfaite, nous avons pu aider la communauté open source en essayant de l’améliorer. Merci au créateur de cette gem ainsi qu’aux autres contributeurs pour le travail réalisé.

--

--

gab_
gab_

Written by gab_

Co-founder of Kinoba, a web agency located in Lyon. Symfony developer, PHP lover. #Symfony #development #php

No responses yet