Blog

As intrincações e desafios de implementar um sistema com suporte a CalDAV para Cal.com

Syed Ali ShabhazOct 6, 2023

Introdução

Dar suporte ao protocolo CalDAV requer uma compreensão profunda das nuances e especificidades deste padrão da Internet. Implementá-lo não é fácil; se fosse, veríamos todas as outras plataformas de agendamento a suportá-lo. No entanto, nós na Cal.com gostamos de um desafio. A integração do CalDAV é crucial para a Cal.com, porque está alinhada com a nossa visão de fornecer uma infraestrutura de agendamento transparente, flexível e fácil de usar, capaz de interagir de forma fluida com outros sistemas de calendário, promovendo um ambiente de agendamento mais conectado e eficiente para toda a gente. 

Esperamos que este blogue esclareça o processo e ajude os leitores a perceber porque é tão difícil ter uma integração CalDAV fiável. Junta-te a nós enquanto navegamos o complexo labirinto do suporte à integração CalDAV para a Cal.com. 

CalDAV e a sua relevância para a Cal.com

Um cliente pode aceder a dados de agendamento num servidor remoto usando o protocolo padrão da Internet conhecido como CalDAV, abreviação de Calendar Extensions to WebDAV. Ele permite que um cliente adicione, leia, edite e elimine facilmente eventos de calendário armazenados num servidor. Em essência, permite aos utilizadores partilhar e gerir informação de calendário online. É uma das integrações mais pedidas na Cal.com e com razão. Há muito poucas soluções de agendamento com suporte para CalDAV.

Este padrão da Internet para partilha de dados de calendário baseia-se no formato iCalendar, que é amplamente utilizado. Com a ajuda deste padrão, os clientes podem atualizar ou obter dados do servidor facilmente. O facto de todas estas ações poderem ser realizadas em plataformas e dispositivos diversos é conveniente e valioso. Isto significa que a tua informação de agendamento pode ser sincronizada, quer estejas a usar um computador desktop, um smartphone ou um tablet com sistemas operativos diferentes para aceder a ela.

Uma breve visão sobre a funcionalidade técnica do CalDAV

Digamos que queremos criar um novo evento no nosso calendário usando CalDAV. Usaríamos um pedido HTTP PUT, que poderia ser algo assim:

Terminal mostrando um payload de pedido CalDAV PUT

Neste pedido, estamos a criar um evento com um identificador único (UID) de 1234567890; trata-se de uma reunião de equipa agendada para começar às 14:00 e terminar às 15:00 a 20 de maio de 2023.

Para obter uma lista de eventos do calendário, usa um pedido REPORT com um filtro de intervalo de tempo. Poderia ser algo assim:

Exemplo de código de pedido CalDAV REPORT

Neste pedido REPORT, estamos a pedir todos os eventos (VEVENT) dentro de um intervalo de datas específico, de 19 de maio de 2023 a 19 de junho de 2023. O servidor devolveria um documento XML com os dados de cada evento nesse intervalo de datas.

Isto deve dar-te uma ideia dos mecanismos do CalDAV. É um protocolo sofisticado que, quando implementado corretamente, facilita uma gestão de calendário fluida e fiável. Na Cal.com, estamos a caminho de ativar o nosso suporte ao formato iCalendar 2.0. A adoção deste protocolo garante aos nossos utilizadores uma experiência de agendamento superior. 

Os desafios de uma implementação CalDAV

Implementar um sistema com suporte para CalDAV traz consigo a sua quota de intrincações técnicas. Requer uma compreensão profunda de vários requisitos de servidor, estruturas complexas de HTTP e XML e conceitos avançados de agendamento. Vamos explorar estes aspetos brevemente:

Requisitos de servidor

Servidores CalDAV diferentes podem ter nuances distintas na interpretação e implementação do padrão. Compreender estas variações é crucial para garantir uma experiência fluida para os utilizadores ao integrar com vários serviços de calendário. Trata-se de mergulhar a fundo na documentação de cada servidor e pôr as mãos na massa com testes e depuração.

Estruturas HTTP e XML

O CalDAV é construído sobre o protocolo HTTP e usa XML para representação de dados. A estrutura complexa de pedidos/respostas HTTP e a manipulação de dados XML podem representar um desafio. Por exemplo, criar um pedido REPORT adequado para obter eventos específicos ou lidar com respostas multi-status exige uma compreensão sólida destas tecnologias. 

Servidores diferentes podem escolher implementar certas funcionalidades opcionais da especificação CalDAV ou interpretar de forma diferente as diretivas 'MUST', 'SHOULD' e 'MAY' na especificação. Por exemplo, alguns servidores podem optar por implementar suporte para anexos geridos, enquanto outros podem não o fazer.

Gerir fusos horários e eventos recorrentes

Implementar suporte a timezone é um aspeto vital, mas desafiante, do CalDAV. Como a Cal.com pretende servir utilizadores em todo o mundo, o sistema tem de ter em conta com precisão uma miríade de timezones globais.

Gráfico de texto a brincar com problemas de timezone

Além disso, lidar com eventos recorrentes é outra funcionalidade complexa. O CalDAV depende do formato iCalendar para a representação de dados, que inclui uma especificação detalhada, mas intrincada, para eventos recorrentes. Analisar e interpretar corretamente estas regras é crucial para manter dados de calendário consistentes.

No que diz respeito à informação de timezone, há várias formas de a representar dentro do formato iCalendar, no qual o CalDAV se baseia. Aqui tens alguns exemplos:

  • Incorporar componentes VTIMEZONE: o iCalendar permite incluir componentes VTIMEZONE para definir a timezone usada no objeto de calendário.

Excerto de código de uma definição de timezone em VCALENDAR

  • Este exemplo define a timezone "America/Los_Angeles" com os seus componentes de horário de verão e de horário padrão. Esta informação VTIMEZONE pode ser referida dentro de componentes VEVENT usando o parâmetro de propriedade TZID.

  • Tempo UTC ou "Zulu": o iCalendar permite que valores de data e hora sejam especificados diretamente em Tempo Universal Coordenado (UTC), também conhecido como tempo "Zulu", acrescentando um "Z" ao final do timestamp.

  • No formato iCalendar, a propriedade DTSTART, que especifica a hora de início de um evento, pode incluir um parâmetro de propriedade TZID para especificar a timezone. A forma como servidores e clientes diferentes tratam e interpretam o parâmetro TZID pode variar, levando a possíveis discrepâncias ou problemas de interoperabilidade. 

  • Embora o formato iCalendar permita várias formas de representar fusos horários, algumas implementações podem apenas suportar algumas destas formas com igual eficácia. Algumas podem lidar perfeitamente com tempo UTC e tempo flutuante, mas podem ter dificuldade em interpretar componentes VTIMEZONE.

Os eventos recorrentes são um aspeto complexo do formato iCalendar e, por isso, do padrão CalDAV. Plataformas diferentes podem ter formas distintas de interpretar regras recorrentes, o que leva a potenciais discrepâncias na forma como esses eventos são tratados e apresentados. Alguns fornecedores de serviços CalDAV optam por tratar as regras recorrentes (RRULE) internamente, o que significa que precisamos de confirmar se lidam bem com o pedido da propriedade EXPAND. Se não o fizerem, os pedidos podem falhar silenciosamente. 

Eventos de dia inteiro

  • Abordar outra peça intrincada do quebra-cabeças iCalendar e CalDAV é crucial: eventos de dia inteiro. Por mais simples que pareçam, os eventos de dia inteiro introduzem outra camada de complexidade no que toca ao tratamento de timezone.

    Um evento de dia inteiro, como um aniversário ou um feriado público, é tipicamente considerado como ocupando o dia inteiro, independentemente da timezone. A parte complicada surge quando consideramos que um "dia inteiro" pode começar e terminar a horas diferentes em timezones diferentes.

    No formato iCalendar, os eventos de dia inteiro são representados como valores de data sem componente de hora e também sem timezone. Por exemplo:

Editor de código a mostrar um ficheiro VCALENDAR ICS

Este formato não especifica uma timezone para o evento, por isso cabe ao sistema que interpreta o evento determinar como ele deve ser apresentado e tratado. Isto pode tornar-se complicado quando se trata de calcular dados de livre/ocupado numa base horária.

Por exemplo, se um utilizador em San Francisco (PDT, UTC-7) agendar um evento de dia inteiro, e outro utilizador em Nova Iorque (EDT, UTC-4) verificar o seu estado de livre/ocupado, pode haver uma discrepância. Quando é que o "dia inteiro" começa e termina para cada utilizador? Existe um período de 3 horas em que o utilizador de San Francisco ainda está ocupado com o evento de dia inteiro, mas o utilizador de Nova Iorque já está livre?

Na Cal.com, estamos a trabalhar em formas inteligentes de lidar com este desafio. Neste caso, ajustamos a apresentação com base na timezone do organizador do evento no nosso sistema. Ao adotar esta abordagem, pretendemos garantir que os eventos de dia inteiro são tratados com precisão de acordo com a disponibilidade do Host, independentemente de onde os bookers estejam localizados.

Na implementação do padrão iCalendar, muitos fornecedores de serviços CalDAV optam por parâmetros personalizados e pelo tratamento interno de certos aspetos. Um caso típico que ilustra este cenário gira em torno do tratamento de eventos recorrentes, especificamente da propriedade EXPAND, por certos serviços de calendário. Por exemplo, a Zoho prefere tratá-lo internamente e, em vez disso, falha silenciosamente se pedirmos com a propriedade EXPAND definida como true. Isto causou muita dor de cabeça ao depurar a causa exata de os Calendar Objects não estarem a ser devolvidos pela Zoho, apesar de o estado do cabeçalho de retorno ser 200.

Tudo isto sublinha a importância e os desafios de testes cuidadosos e rigorosos ao implementar uma solução CalDAV robusta como a que estamos a construir na Cal.com.

A falácia do 'Tamanho único serve para todos'

A expressão 'Tamanho único serve para todos' é muitas vezes usada para sugerir que uma única solução ou sistema pode satisfazer as necessidades de todos os utilizadores ou cenários. No entanto, no contexto da implementação de CalDAV, este conceito torna-se mais uma falácia do que uma abordagem viável. Eis porquê:

Quando discutimos a implementação de CalDAV, lidamos com um ecossistema diversificado de servidores de calendário, clientes e necessidades dos utilizadores. Servidores diferentes podem interpretar os padrões CalDAV e iCalendar de forma ligeiramente diferente, e clientes diferentes podem ter funcionalidades ou limitações únicas. Além disso, as necessidades dos utilizadores podem variar imenso, desde alguém que só quer acompanhar alguns compromissos pessoais até uma empresa multinacional que precisa de coordenar milhares de horários em vários fusos horários.

Criar uma solução de 'Tamanho único serve para todos' neste contexto significaria desenvolver uma implementação CalDAV que suporte todos os padrões, seja compatível com todos os servidores, funcione na perfeição em todos os clientes e se ajuste perfeitamente às necessidades dos utilizadores. Isto é pedir muito e, francamente, pouco realista.

Em vez de tentar criar uma solução de 'Tamanho único serve para todos' na Cal.com, focamo-nos em desenvolver uma implementação CalDAV flexível e adaptável que satisfaça um padrão específico. Abraçamos a diversidade do ecossistema CalDAV e esforçamo-nos por fornecer um serviço que funcione bem numa vasta gama de servidores e clientes, ao mesmo tempo que oferecemos um conjunto de funcionalidades principais que satisfazem as necessidades da maioria dos utilizadores. Estamos a caminho de suportar totalmente o iCalendar 2.0, garantindo que o nosso sistema se pode adaptar e crescer para suportar todos os fornecedores que sigam o padrão iCalendar 2.0 na sua implementação CalDAV. Isto inclui suportar as flexibilidades que o iCalendar 2.0 oferece com interpretações e implementações variáveis.

O que vem a seguir

Lidar com demasiados problemas desde o início desta integração quase nos levou a considerar encerrá-la, mas tivemos de lhe dar um último impulso. Em retrospectiva, é assustador perceber quão perto esteve de ser encerrada por completo. 

Agora que estamos lentamente a conseguir e a tornar a integração CalDAV mais estável, planeamos melhorar a experiência do utilizador. Há muitas conversas e discussões entre a equipa de engenharia a explorar melhorias para o CalDAV como um todo, desde a fiabilidade até ao fornecimento de um suporte de integração mais abrangente para a experiência do utilizador final ao gerir uma integração CalDAV com a Cal.com. Estamos empenhados em torná-la uma integração fiável e estável.

Bio do autor: Syed Ali Shahbaz ocupa atualmente o cargo de Developer Relations Engineer na Cal.com. Com uma rica tapeçaria de experiências, Ali cofundou a app Log Doctor e esteve anteriormente ao leme da Timecrypt.app, uma ferramenta inovadora de gestão de tempo baseada em Blockchain. Concebeu toda a sua desenvolvimento, desde o design até à implementação, em pouco mais de um ano.

Antigo aluno da University of St Andrews e do King’s College London, as credenciais académicas de Ali falam por si. Obteve os graus de MSc em Artificial Intelligence e Robotics nestas prestigiadas instituições, dotando-o de conhecimentos profundos em áreas como AI, Machine Learning e Robotics.

Syed Ali Shabhaz

Post by

Syed Ali Shabhaz

Developer Relations Engineer