-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgoogleCalendar.js
More file actions
141 lines (123 loc) · 4.7 KB
/
googleCalendar.js
File metadata and controls
141 lines (123 loc) · 4.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
const fs = require('fs').promises;
const readline = require("readline-sync")
const { google } = require('googleapis');
const SCOPES = ['https://www.googleapis.com/auth/calendar'];
const TOKEN_PATH = 'token.json';
async function getAuthorize() {
let credentials = await getCredentials()
const { client_secret, client_id, redirect_uris } = credentials.installed || credentials.web;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);
try {
let tokenFile = await fs.readFile(TOKEN_PATH, "utf8")
oAuth2Client.setCredentials(JSON.parse(tokenFile))
return oAuth2Client
} catch (err) {
console.log("error code :" + err.code)
if (err.code === "ENOENT") {
console.info("token not fund")
console.info("generate token")
await getAccessToken(oAuth2Client)
return oAuth2Client
} else {
console.log(err)
process.exit(-1)
}
}
}
async function getCredentials() {
try {
let credentials = await fs.readFile('credentials.json')
return JSON.parse(credentials);
} catch (err) { console.log('Error loading client secret file:', err) }
}
async function getAccessToken(oAuth2Client) {
try {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES,
});
console.log('Authorize this app by visiting this url:', authUrl);
let codeRead = readline.question('Enter the code from that page here: ')
let token = (await oAuth2Client.getToken(codeRead)).tokens
oAuth2Client.setCredentials(token);
await fs.writeFile(TOKEN_PATH, JSON.stringify(token))
console.info('Token stored to', TOKEN_PATH)
return oAuth2Client;
} catch (err) {
console.error('Error : ', err);
process.exit(-1)
}
}
async function listEventsBetweenDate(auth, date) {
const calendar = google.calendar({ version: 'v3', auth });
return (await calendar.events.list({
calendarId: process.env.CALENDAR_ID,
timeMin: date.startDate.toISOString(),
timeMax: date.endDate.toISOString(),
singleEvents: true,
orderBy: 'startTime',
})).data.items;
}
async function deleteEvent(auth, events) {
const calendar = google.calendar({ version: 'v3', auth });
await Promise.all(events.map(async (event) => {
for (let i = 0; i < 5; i++) {
let params = {
calendarId: process.env.CALENDAR_ID,
eventId: event.id,
};
try {
let result = await calendar.events.delete(params)
break;
} catch (error) {
if (error.errors[0].reason === "rateLimitExceeded") {
await (new Promise(resolve => setTimeout(resolve, 1000 * i + Math.random() * (10000 - 1000) + 1000)))
} else {
throw new Error("error api google : " + error)
}
}
}
}));
}
async function insertEventByMyGes(auth, events) {
const calendar = google.calendar({ version: 'v3', auth });
await Promise.all(events.map(async (eventMyGes) => {
for (let i = 0; i < 5; i++) {
let description = ""
let listElement = ["matiere", "intervenant", "salle", "type", "modality"]
listElement.forEach(element => {
description = description + eventMyGes[element] + '<br>'
});
var event = {
'summary': eventMyGes.matiere.split(':')[1],
'description': description,
'start': {
'dateTime': eventMyGes.start
},
'end': {
'dateTime': eventMyGes.end
}
}
try {
await calendar.events.insert({
auth: auth,
calendarId: process.env.CALENDAR_ID,
resource: event,
})
break;
} catch (error) {
if (error.errors[0].reason === "rateLimitExceeded") {
await (new Promise(resolve => setTimeout(resolve, 1000 * i + Math.random() * (10000 - 1000) + 1000)))
} else {
throw new Error("error api google : " + error)
}
}
}
}));
}
module.exports = {
getAuthorize: getAuthorize,
listEventsBetweenDate: listEventsBetweenDate,
insertEventByMyGes: insertEventByMyGes,
deleteEvent: deleteEvent
}