// src/google/google.service.ts import { Injectable, Logger } from '@nestjs/common'; import axios from 'axios'; import { GmailApiStrategy } from '../strategies/email/gmail-api.strategy'; @Injectable() export class GoogleService { private readonly logger = new Logger(GoogleService.name); constructor(private readonly gmailApiStrategy: GmailApiStrategy) {} /** * Create a Google Calendar event */ async createEvent(creds: any, payload: any) { if (!creds?.refreshToken) { throw new Error('Missing refresh token'); } const accessToken = await this.gmailApiStrategy.refreshAccessToken(creds); // Normalize attendees into [{ email: "..." }] const normalizeAttendees = (attendees: any[] = []) => attendees .flatMap((a) => typeof a === 'string' ? [{ email: a }] : Array.isArray(a?.email) ? a.email.map((e) => ({ email: e })) : a?.email ? [{ email: a.email }] : [], ) .filter((a) => a.email && a.email.trim() !== ''); const event = { summary: payload.title, description: payload.description, location: payload.location, start: { dateTime: payload.startTime, timeZone: payload.timeZone || 'Asia/Kolkata', }, end: { dateTime: payload.endTime, timeZone: payload.timeZone || 'Asia/Kolkata', }, attendees: normalizeAttendees(payload.attendees), }; const response = await axios.post( 'https://www.googleapis.com/calendar/v3/calendars/primary/events?sendUpdates=all', event, { headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json', }, }, ); this.logger.debug('Google calendar event created', response.data); return response.data; } /** * Update a Google Calendar event */ async updateEvent(creds: any, eventId: string, payload: any) { if (!creds?.refreshToken) { throw new Error('Missing refresh token'); } const accessToken = await this.gmailApiStrategy.refreshAccessToken(creds); const normalizeAttendees = (attendees: any[] = []) => attendees .flatMap((a) => typeof a === 'string' ? [{ email: a }] : Array.isArray(a?.email) ? a.email.map((e) => ({ email: e })) : a?.email ? [{ email: a.email }] : [], ) .filter((a) => a.email && a.email.trim() !== ''); const event = { summary: payload.title, description: payload.description, location: payload.location, start: { dateTime: payload.startTime, timeZone: payload.timeZone || 'Asia/Kolkata', }, end: { dateTime: payload.endTime, timeZone: payload.timeZone || 'Asia/Kolkata', }, attendees: normalizeAttendees(payload.attendees), }; const response = await axios.patch( `https://www.googleapis.com/calendar/v3/calendars/primary/events/${eventId}?sendUpdates=all`, event, { headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json', }, }, ); return response.data; } }