feat(calendar): integracion real con Google Calendar via service account
Resumen
Reemplaza la implementacion stub de GoogleCalendarServiceImpl por una integracion real con la API de Google Calendar usando service account. Mantiene el mock como fallback para tests y entornos sin credenciales.
Cambios principales
-
Dependencias:
google-api-services-calendar,google-auth-library-oauth2-http,google-http-client-jackson2. -
Configuracion: nueva clase
GoogleCalendarPropertiescon variables de entorno (GOOGLE_CALENDAR_*). Por defecto la integracion esta deshabilitada, se activa conGOOGLE_CALENDAR_ENABLED=true. -
Persistencia: nueva entidad
ReminderCalendarEventy tablareminder_calendar_events(migracion V23) que mapea cada recordatorio con sugoogleEventId. -
Servicio real:
GoogleCalendarServiceImplcon@ConditionalOnProperty(google.calendar.enabled=true)que implementasyncReminder(insert o update segun exista mapeo) ydeleteReminder. Carga credenciales desde el path configurado y maneja el scopeCALENDAR. -
Mock restringido:
MockCalendarServiceImplahora usa@ConditionalOnProperty(google.calendar.enabled=false, matchIfMissing=true), asi queda como fallback para tests y desarrollo local. -
Errores: nueva excepcion
CalendarSyncExceptionmapeada a HTTP 502 enGlobalExceptionHandler, con log de error y mensaje legible.
Tests
-
GoogleCalendarServiceImplTest: cubre inicializacion fallida, sync sin cliente, delete sin mapeo, delete sin inicializar. -
CalendarServiceBeanSelectionTest: verifica conApplicationContextRunnerque la bean correcta se carga segun la propiedad. - Suite completa: 161 tests verdes (155 anteriores + 6 nuevos).
Como probar la integracion real
- Crear service account en Google Cloud Console con la API de Calendar habilitada.
- Descargar el JSON de credenciales.
- Compartir el calendario destino con el email del service account.
- Configurar las variables de entorno:
GOOGLE_CALENDAR_ENABLED=true GOOGLE_CALENDAR_CREDENTIALS_PATH=/ruta/al/credentials.json GOOGLE_CALENDAR_ID=primary - Crear un recordatorio desde Swagger. El log deberia mostrar "Evento de Calendar creado para recordatorio ..." en lugar de "[MOCK]".
Notas
- La integracion usa credenciales server-to-server, no requiere OAuth de usuario.
- El calendario destino debe ser compartido con el service account con permiso de escritura.
- Si
GOOGLE_CALENDAR_ENABLED=falseo no se define, todo sigue funcionando con el mock como antes.