Добавление событий в Google Calendar других пользователей через приложение node.js
За основу была взята реализация по статье из хабра: https://habr.com/ru/post/524240/ Событие записывается и обновляется в нашем пользовательском календаре
export async function addToGoogleCalendar(form, visitData, updateMode=false) {
async function readPrivateKey() {
return configGoogleCalendar;
}
async function authenticate(key) {
const jwtClient = new google.auth.JWT(
key.client_email,
null,
key.private_key,
[SCOPE_CALENDAR, SCOPE_EVENTS]
);
await jwtClient.authorize();
return jwtClient;
}
function getData() {
let startDateTime = new Date(form.date);
let finishDateTime = new Date(form.date);
finishDateTime.setTime(finishDateTime.getTime() + (2*60*60*1000));
const event = {
'summary': `Встреча с пользователем ${visitData.persons[0].descriptions[0].lastname} ${visitData.persons[0].descriptions[0].firstname}`,
'description': `Встреча пользователя ${visitData.user.surname} ${visitData.user.name} с пользователем ${visitData.persons[0].descriptions[0].lastname} ${visitData.persons[0].descriptions[0].firstname}`,
'start': {
'dateTime': startDateTime.toISOString(),
'timeZone': 'Europe/Moscow',
},
'end': {
'dateTime': finishDateTime.toISOString(),
'timeZone': 'Europe/Moscow',
},
/*'attendees': [
{'email': '[email protected]'}
],*/
};
return event;
}
//функция создания события в календаре
async function createEvent(auth) {
let event = getData();
let calendar = google.calendar('v3');
await calendar.events.insert({
auth: auth,
calendarId: CALENDAR_ID,
resource: event,
sendNotifications: true
}, async function(err, event) {
if (err) {
console.log('There was an error contacting the Calendar service: ' + err);
return;
}
console.log('Event created, eventId: %s', event.data.id);
//возвращаем id задачи календаря
let visit = await models.Visits.findById(visitData._id)
visit.googleCalendarEvent = event.data.id
visit.save()
});
}
//функция обновления события в календаре
async function updateEvent(auth) {
let event = getData();
let calendar = google.calendar('v3');
await calendar.events.update({
auth: auth,
calendarId: CALENDAR_ID,
sendNotifications: true,
eventId: visitData.googleCalendarEvent,
resource: event,
//sendNotifications: true
}, function(err, event) {
if (err) {
console.log('There was an error contacting the Calendar service: ' + err);
return;
}
console.log('Обновленные данные события успешно записаны в календарь');
});
}
// MAIN
try {
const key = await readPrivateKey();
const auth = await authenticate(key);
if (!updateMode) await createEvent(auth);
else await updateEvent(auth);
} catch (e) {
console.log('Error: ' + e);
}
}
Если записывать события только в наш календарь, оставив закомментированным блок с почтой 'attendees', то нет проблем, но критично, чтобы запись о событии добавлять в календари пользователям по указанному массиву адресов, а сейчас вылетает ошибка "Service accounts cannot invite attendees without Domain-Wide Delegation of Authority". При этом, если использовать корпоративный аккаунт гугла и соответственно календарь вместо пользовательского и выполнять все по инструкции для активации Domain-Wide Delegation, заветной галочки активации не появляется. Более того работа скрипта в этом случае возвращает not found. Подскажите, куда копать и может в реализации все куда проще