-
Notifications
You must be signed in to change notification settings - Fork 106
Expand file tree
/
Copy pathGraphService.ts
More file actions
98 lines (80 loc) · 3.05 KB
/
GraphService.ts
File metadata and controls
98 lines (80 loc) · 3.05 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
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
// <GetUserSnippet>
import { Client, GraphRequestOptions, PageCollection, PageIterator } from '@microsoft/microsoft-graph-client';
import { AuthCodeMSALBrowserAuthenticationProvider } from '@microsoft/microsoft-graph-client/authProviders/authCodeMsalBrowser';
import { endOfWeek, startOfWeek } from 'date-fns';
import { fromZonedTime } from 'date-fns-tz';
import { User, Event } from '@microsoft/microsoft-graph-types';
let graphClient: Client | undefined = undefined;
function ensureClient(authProvider: AuthCodeMSALBrowserAuthenticationProvider) {
if (!graphClient) {
graphClient = Client.initWithMiddleware({
authProvider: authProvider
});
}
return graphClient;
}
export async function getUser(authProvider: AuthCodeMSALBrowserAuthenticationProvider): Promise<User> {
ensureClient(authProvider);
// Return the /me API endpoint result as a User object
const user: User = await graphClient!.api('/me')
// Only retrieve the specific fields needed
.select('displayName,mail,mailboxSettings,userPrincipalName')
.get();
return user;
}
// </GetUserSnippet>
// <GetUserWeekCalendarSnippet>
export async function getUserWeekCalendar(authProvider: AuthCodeMSALBrowserAuthenticationProvider,
timeZone: string): Promise<Event[]> {
ensureClient(authProvider);
// Generate startDateTime and endDateTime query params
// to display a 7-day window
const now = new Date();
const startDateTime = fromZonedTime(startOfWeek(now), timeZone).toISOString();
const endDateTime = fromZonedTime(endOfWeek(now), timeZone).toISOString();
// GET /me/calendarview?startDateTime=''&endDateTime=''
// &$select=subject,organizer,start,end
// &$orderby=start/dateTime
// &$top=50
var response: PageCollection = await graphClient!
.api('/me/calendarview')
.header('Prefer', `outlook.timezone="${timeZone}"`)
.query({ startDateTime: startDateTime, endDateTime: endDateTime })
.select('subject,organizer,start,end')
.orderby('start/dateTime')
.top(25)
.get();
if (response["@odata.nextLink"]) {
// Presence of the nextLink property indicates more results are available
// Use a page iterator to get all results
var events: Event[] = [];
// Must include the time zone header in page
// requests too
var options: GraphRequestOptions = {
headers: { 'Prefer': `outlook.timezone="${timeZone}"` }
};
var pageIterator = new PageIterator(graphClient!, response, (event) => {
events.push(event);
return true;
}, options);
await pageIterator.iterate();
return events;
} else {
return response.value;
}
}
// </GetUserWeekCalendarSnippet>
// <CreateEventSnippet>
export async function createEvent(authProvider: AuthCodeMSALBrowserAuthenticationProvider,
newEvent: Event): Promise<Event> {
ensureClient(authProvider);
// POST /me/events
// JSON representation of the new event is sent in the
// request body
return await graphClient!
.api('/me/events')
.post(newEvent);
}
// </CreateEventSnippet>