Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / api / calendars.ts
blob93064af192b88b84e44cdc2420c2a61f9ce1817a
1 import { CALENDAR_VALIDATION_MODE } from '../calendar/constants';
2 import type {
3     Attendee,
4     CalendarNotificationSettings,
5     CalendarSettings,
6     CalendarUserSettings,
7 } from '../interfaces/calendar';
8 import {
9     type CalendarCreateArguments,
10     type CalendarCreateOrUpdateEventBlobData,
11     type CalendarEventsIDsQuery,
12     type CalendarEventsQuery,
13     type CalendarExportEventsQuery,
14     type CalendarKeysResetData,
15     type CalendarSetupData,
16     type CreateCalendarMemberData,
17     type CreatePublicLinks,
18     type CreateSinglePersonalEventData,
19     type GetBusySlotsParams,
20     type GetEventByUIDArguments,
21     type QueryCalendarAlarms,
22     type SyncMultipleEventsData,
23     type UpdateCalendarInviteData,
24     type UpdateCalendarMemberData,
25     VIDEO_CONFERENCE_PROVIDER,
26 } from '../interfaces/calendar/Api';
27 import type { Nullable, RequireOnly } from '../interfaces/utils';
28 import type { PaginationParams } from './interface';
30 const CALENDAR_V1 = 'calendar/v1';
32 export const queryLatestModelEventID = (calendarID: string) => ({
33     url: `${CALENDAR_V1}/${calendarID}/modelevents/latest`,
34     method: 'get',
35 });
37 export const queryModelEvents = (calendarID: string, eventID: string) => ({
38     url: `${CALENDAR_V1}/${calendarID}/modelevents/${eventID}`,
39     method: 'get',
40 });
42 export const queryCalendars = () => ({
43     url: `${CALENDAR_V1}`,
44     method: 'get',
45 });
47 export const createCalendar = (data: CalendarCreateArguments) => ({
48     url: `${CALENDAR_V1}`,
49     method: 'post',
50     data,
51 });
53 export const setupCalendar = (calendarID: string, data: CalendarSetupData) => ({
54     url: `${CALENDAR_V1}/${calendarID}/keys`,
55     method: 'post',
56     data,
57 });
59 export const getCalendar = (calendarID: string) => ({
60     url: `${CALENDAR_V1}/${calendarID}`,
61     method: 'get',
62 });
64 export const getFullCalendar = (calendarID: string) => ({
65     url: `${CALENDAR_V1}/${calendarID}/bootstrap`,
66     method: 'get',
67 });
69 export const getCalendarKeys = (calendarID: string) => ({
70     url: `${CALENDAR_V1}/${calendarID}/keys`,
71     method: 'get',
72 });
74 export const getAllCalendarKeys = (calendarID: string) => ({
75     url: `${CALENDAR_V1}/${calendarID}/keys/all`,
76     method: 'get',
77 });
79 export const getPassphrases = (calendarID: string) => ({
80     url: `${CALENDAR_V1}/${calendarID}/passphrases`,
81     method: 'get',
82 });
84 export const getPassphrase = (calendarID: string) => ({
85     url: `${CALENDAR_V1}/${calendarID}/passphrase`,
86     method: 'get',
87 });
89 export const reactivateCalendarKey = (calendarID: string, keyID: string, data: { PrivateKey: string }) => ({
90     url: `${CALENDAR_V1}/${calendarID}/keys/${keyID}`,
91     method: 'put',
92     data,
93 });
95 export const getCalendarGroupReset = () => ({
96     url: `${CALENDAR_V1}/keys/reset`,
97     method: 'get',
98 });
100 export const resetCalendars = (data: { CalendarKeys: CalendarKeysResetData }) => ({
101     url: `${CALENDAR_V1}/keys/reset`,
102     method: 'post',
103     data,
106 export const removeCalendar = (calendarID: string) => ({
107     url: `${CALENDAR_V1}/${calendarID}`,
108     method: 'delete',
111 export const removeHolidaysCalendar = (calendarID: string) => ({
112     url: `${CALENDAR_V1}/${calendarID}/managed`,
113     method: 'delete',
116 export const queryMembers = (calendarID: string, params?: PaginationParams) => ({
117     url: `${CALENDAR_V1}/${calendarID}/members`,
118     method: 'get',
119     params,
122 export const getAllMembers = (calendarID: string) => ({
123     url: `${CALENDAR_V1}/${calendarID}/members/all`,
124     method: 'get',
127 export const getCalendarInvitations = (calendarID: string) => ({
128     url: `${CALENDAR_V1}/${calendarID}/invitations`,
129     method: 'get',
132 export const getAllInvitations = () => ({
133     url: `${CALENDAR_V1}/invitations`,
134     method: 'get',
137 export const addMember = (
138     calendarID: string,
139     data: { AddressID: string; Signature: string; Members: CreateCalendarMemberData[] }
140 ) => ({
141     url: `${CALENDAR_V1}/${calendarID}/members`,
142     method: 'post',
143     data,
146 export const updateMember = (calendarID: string, memberID: string, data: Partial<UpdateCalendarMemberData>) => ({
147     url: `${CALENDAR_V1}/${calendarID}/members/${memberID}`,
148     method: 'put',
149     data,
152 export const updateMemberPermission = (
153     calendarID: string,
154     memberID: string,
155     data: RequireOnly<Pick<UpdateCalendarMemberData, 'Permissions' | 'PassphraseKeyPacket'>, 'Permissions'>
156 ) => ({
157     url: `${CALENDAR_V1}/${calendarID}/members/${memberID}/permission`,
158     method: 'put',
159     data,
162 export const updateInvitation = (
163     calendarID: string,
164     invitationID: string,
165     data: Partial<UpdateCalendarInviteData>
166 ) => ({
167     url: `${CALENDAR_V1}/${calendarID}/invitations/${invitationID}`,
168     method: 'put',
169     data,
172 export const removeMember = (calendarID: string, memberID: string) => ({
173     url: `${CALENDAR_V1}/${calendarID}/members/${memberID}`,
174     method: 'delete',
177 export const getInvitation = (calendarID: string, invitationID: string) => ({
178     url: `${CALENDAR_V1}/${calendarID}/invitations/${invitationID}`,
179     method: 'get',
182 export const removeInvitation = (calendarID: string, invitationID: string) => ({
183     url: `${CALENDAR_V1}/${calendarID}/invitations/${invitationID}`,
184     method: 'delete',
187 export const acceptInvitation = (calendarID: string, addressID: string, data: { Signature: string }) => ({
188     url: `${CALENDAR_V1}/${calendarID}/invitations/${addressID}/accept`,
189     method: 'put',
190     data,
193 export const rejectInvitation = (calendarID: string, addressID: string) => ({
194     url: `${CALENDAR_V1}/${calendarID}/invitations/${addressID}/reject`,
195     method: 'put',
198 export const getEventsCount = (calendarID: string) => ({
199     url: `${CALENDAR_V1}/${calendarID}/events/count`,
200     method: 'get',
203 export const queryEvents = (
204     calendarID: string,
205     params: CalendarEventsQuery | CalendarExportEventsQuery | GetEventByUIDArguments
206 ) => ({
207     url: `${CALENDAR_V1}/${calendarID}/events`,
208     method: 'get',
209     params,
212 export const queryEventsIDs = (calendarID: string, params: CalendarEventsIDsQuery) => ({
213     url: `${CALENDAR_V1}/${calendarID}/events/ids`,
214     method: 'get',
215     params,
218 export const getEvent = (calendarID: string, eventID: string) => ({
219     url: `${CALENDAR_V1}/${calendarID}/events/${eventID}`,
220     method: 'get',
223 export const getEventByUID = (params: GetEventByUIDArguments) => ({
224     url: `${CALENDAR_V1}/events`,
225     method: 'get',
226     params,
229 export const deleteEvent = (calendarID: string, eventID: string) => ({
230     url: `${CALENDAR_V1}/${calendarID}/events/${eventID}`,
231     method: 'delete',
234 export const updatePersonalEventPart = (calendarID: string, eventID: string, data: CreateSinglePersonalEventData) => ({
235     url: `${CALENDAR_V1}/${calendarID}/events/${eventID}/personal`,
236     method: 'put',
237     data,
240 export const updateAttendeePartstat = (
241     calendarID: string,
242     eventID: string,
243     attendeeID: string,
244     data: Pick<Attendee, 'Status' | 'UpdateTime'>
245 ) => ({
246     url: `${CALENDAR_V1}/${calendarID}/events/${eventID}/attendees/${attendeeID}`,
247     method: 'put',
248     data,
251 export const attendeeDeleteSingleEdit = (
252     calendarID: string,
253     eventID: string,
254     data: Pick<CalendarCreateOrUpdateEventBlobData, 'CalendarEventContent'>
255 ) => ({
256     url: `${CALENDAR_V1}/${calendarID}/events/${eventID}/attendee_delete_single_edit`,
257     method: 'put',
258     data,
261 export const upgradeP2PInvite = (
262     calendarID: string,
263     eventID: string,
264     data: Pick<CalendarCreateOrUpdateEventBlobData, 'SharedKeyPacket'>
265 ) => ({
266     url: `${CALENDAR_V1}/${calendarID}/events/${eventID}/upgrade`,
267     method: 'put',
268     data,
271 export const acceptInvite = (uid: string, data: { Signature: string }) => ({
272     url: `${CALENDAR_V1}/events/${uid}/accept`,
273     method: 'put',
274     data,
277 export const getCalendarSettings = (calendarID: string) => ({
278     url: `${CALENDAR_V1}/${calendarID}/settings`,
279     method: 'get',
282 export const updateCalendarSettings = (calendarID: string, data: Partial<CalendarSettings>) => ({
283     url: `${CALENDAR_V1}/${calendarID}/settings`,
284     method: 'put',
285     data,
288 export const getCalendarUserSettings = () => ({
289     url: 'settings/calendar',
290     method: 'get',
293 export const updateCalendarUserSettings = (data: Partial<CalendarUserSettings>) => ({
294     url: 'settings/calendar',
295     method: 'put',
296     data,
299 export const getAllowedTimeZones = () => ({
300     url: `${CALENDAR_V1}/timezones`,
301     method: 'get',
304 export const getVtimezones = (Timezones: string[]) => ({
305     // params doesn't work correctly so
306     url: `${CALENDAR_V1}/vtimezones?${Timezones.map((tzid) => `Timezones[]=${tzid}`).join('&')}`,
307     method: 'get',
308     // params: { Timezones }
311 export const queryCalendarAlarms = (calendarID: string, params: QueryCalendarAlarms) => ({
312     url: `${CALENDAR_V1}/${calendarID}/alarms`,
313     method: 'get',
314     params,
317 export const getCalendarAlarm = (calendarID: string, alarmID: string) => ({
318     url: `${CALENDAR_V1}/${calendarID}/alarms/${alarmID}`,
319     method: 'get',
322 export const syncMultipleEvents = (calendarID: string, data: SyncMultipleEventsData) => ({
323     url: `${CALENDAR_V1}/${calendarID}/events/sync`,
324     method: 'put',
325     data,
328 export const createPublicLink = (calendarID: string, data: CreatePublicLinks) => ({
329     url: `${CALENDAR_V1}/${calendarID}/urls`,
330     method: 'post',
331     data,
334 export const getPublicLinks = (calendarID: string) => ({
335     url: `${CALENDAR_V1}/${calendarID}/urls`,
336     method: 'get',
339 export const deletePublicLink = ({ calendarID, urlID }: { calendarID: string; urlID: string }) => ({
340     url: `${CALENDAR_V1}/${calendarID}/urls/${urlID}`,
341     method: 'delete',
344 export const editPublicLink = ({
345     calendarID,
346     urlID,
347     encryptedPurpose,
348 }: {
349     calendarID: string;
350     urlID: string;
351     encryptedPurpose: Nullable<string>;
352 }) => ({
353     url: `${CALENDAR_V1}/${calendarID}/urls/${urlID}`,
354     method: 'put',
355     data: { EncryptedPurpose: encryptedPurpose },
358 export const getSubscriptionParameters = (calendarID: string) => ({
359     url: `${CALENDAR_V1}/${calendarID}/subscription`,
360     method: 'get',
363 export const validateSubscription = ({
364     url: URL,
365     mode: Mode = CALENDAR_VALIDATION_MODE.DOWNLOAD_AND_PARSE,
366 }: {
367     url: string;
368     mode?: CALENDAR_VALIDATION_MODE;
369 }) => ({
370     url: `${CALENDAR_V1}/subscription/validate`,
371     method: 'post',
372     data: { URL, Mode },
375 export const getDirectoryCalendars = (type: number) => ({
376     url: `${CALENDAR_V1}/directory?Type=${type}`,
377     method: 'get',
380 export const joinHolidaysCalendar = (
381     calendarID: string,
382     addressID: string,
383     data: {
384         PassphraseKeyPacket: string;
385         Signature: string;
386         Color: string;
387         DefaultFullDayNotifications: CalendarNotificationSettings[];
388         Priority?: number;
389     }
390 ) => ({
391     url: `${CALENDAR_V1}/${calendarID}/invitations/${addressID}/join`,
392     method: 'post',
393     data,
396 export const getBusySlots = (emailAddress: string, params: GetBusySlotsParams) => ({
397     url: `${CALENDAR_V1}/${emailAddress}/busy-schedule`,
398     method: 'get',
399     params,
403  * Only Zoom is supported for the moment
404  */
405 export const createZoomMeeting = () => ({
406     url: `${CALENDAR_V1}/videoconferences`,
407     method: 'post',
408     data: { Provider: VIDEO_CONFERENCE_PROVIDER.ZOOM },