Skip to content

Commit 2c14471

Browse files
guillimcharlesBochet
authored andcommitted
12690-error-unknown-error-importing-calendar-events-reafcto-required (#12711)
Why : we had an issue impoting events du to CalendarEvents not yet existing while inserting the CalendarChannelAssociation due to inverted method in the service This PR refactors the calendar event import logic by - renaming - splitting utility functions for better clarity and maintainability. - adding TSDoc comments to explain the purpose and uniqueness of the `eventExternalId` field in calendar event associations Fixes #12690 --------- Co-authored-by: Charles Bochet <[email protected]>
1 parent 51fa78c commit 2c14471

16 files changed

+326
-269
lines changed

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/google-calendar/utils/__tests__/format-google-calendar-event.util.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ describe('formatGoogleCalendarEvents', () => {
5959
expect(formattedEvent.isFullDay).toBe(false);
6060
expect(formattedEvent.startsAt).toBe('2023-01-15T14:00:00Z');
6161
expect(formattedEvent.endsAt).toBe('2023-01-15T15:00:00Z');
62-
expect(formattedEvent.externalId).toBe('event123');
62+
expect(formattedEvent.id).toBe('event123');
6363
expect(formattedEvent.conferenceSolution).toBe('hangoutsMeet');
6464
expect(formattedEvent.conferenceLinkUrl).toBe(
6565
'https://meet.google.com/abc-defg-hij',

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/google-calendar/utils/format-google-calendar-event.util.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import { calendar_v3 as calendarV3 } from 'googleapis';
22

33
import { sanitizeCalendarEvent } from 'src/modules/calendar/calendar-event-import-manager/drivers/utils/sanitizeCalendarEvent';
44
import { CalendarEventParticipantResponseStatus } from 'src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity';
5-
import { CalendarEventWithParticipants } from 'src/modules/calendar/common/types/calendar-event';
5+
import { FetchedCalendarEvent } from 'src/modules/calendar/common/types/fetched-calendar-event';
66

77
export const formatGoogleCalendarEvents = (
88
events: calendarV3.Schema$Event[],
9-
): CalendarEventWithParticipants[] => {
9+
): FetchedCalendarEvent[] => {
1010
return events.map(formatGoogleCalendarEvent);
1111
};
1212

1313
const formatGoogleCalendarEvent = (
1414
event: calendarV3.Schema$Event,
15-
): CalendarEventWithParticipants => {
15+
): FetchedCalendarEvent => {
1616
const formatResponseStatus = (status: string | null | undefined) => {
1717
switch (status) {
1818
case 'accepted':
@@ -27,15 +27,15 @@ const formatGoogleCalendarEvent = (
2727
};
2828

2929
// Create the event object
30-
const calendarEvent: CalendarEventWithParticipants = {
30+
const calendarEvent: FetchedCalendarEvent = {
3131
title: event.summary ?? '',
3232
isCanceled: event.status === 'cancelled',
3333
isFullDay: event.start?.dateTime == null,
34-
startsAt: event.start?.dateTime ?? event.start?.date ?? null,
35-
endsAt: event.end?.dateTime ?? event.end?.date ?? null,
36-
externalId: event.id ?? '',
37-
externalCreatedAt: event.created ?? null,
38-
externalUpdatedAt: event.updated ?? null,
34+
startsAt: event.start?.dateTime ?? event.start?.date ?? '',
35+
endsAt: event.end?.dateTime ?? event.end?.date ?? '',
36+
id: event.id ?? '',
37+
externalCreatedAt: event.created ?? '',
38+
externalUpdatedAt: event.updated ?? '',
3939
description: event.description ?? '',
4040
location: event.location ?? '',
4141
iCalUID: event.iCalUID ?? '',
@@ -54,11 +54,11 @@ const formatGoogleCalendarEvent = (
5454
status: event.status ?? '',
5555
};
5656

57-
const propertiesToSanitize: (keyof CalendarEventWithParticipants)[] = [
57+
const propertiesToSanitize: (keyof FetchedCalendarEvent)[] = [
5858
'title',
5959
'startsAt',
6060
'endsAt',
61-
'externalId',
61+
'id',
6262
'externalCreatedAt',
6363
'externalUpdatedAt',
6464
'description',

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/microsoft-calendar/services/microsoft-calendar-import-events.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Event } from '@microsoft/microsoft-graph-types';
44

55
import { formatMicrosoftCalendarEvents } from 'src/modules/calendar/calendar-event-import-manager/drivers/microsoft-calendar/utils/format-microsoft-calendar-event.util';
66
import { parseMicrosoftCalendarError } from 'src/modules/calendar/calendar-event-import-manager/drivers/microsoft-calendar/utils/parse-microsoft-calendar-error.util';
7-
import { CalendarEventWithParticipants } from 'src/modules/calendar/common/types/calendar-event';
7+
import { FetchedCalendarEvent } from 'src/modules/calendar/common/types/fetched-calendar-event';
88
import { MicrosoftOAuth2ClientManagerService } from 'src/modules/connected-account/oauth2-client-manager/drivers/microsoft/microsoft-oauth2-client-manager.service';
99
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
1010

@@ -20,7 +20,7 @@ export class MicrosoftCalendarImportEventsService {
2020
'provider' | 'refreshToken' | 'id'
2121
>,
2222
changedEventIds: string[],
23-
): Promise<CalendarEventWithParticipants[]> {
23+
): Promise<FetchedCalendarEvent[]> {
2424
try {
2525
const microsoftClient =
2626
await this.microsoftOAuth2ClientManagerService.getOAuth2Client(

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/microsoft-calendar/utils/__tests__/format-microsoft-calendar-event.util.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ describe('formatMicrosoftCalendarEvents', () => {
6666
expect(formattedEvent.isFullDay).toBe(false);
6767
expect(formattedEvent.startsAt).toBe('2023-01-15T14:00:00Z');
6868
expect(formattedEvent.endsAt).toBe('2023-01-15T15:00:00Z');
69-
expect(formattedEvent.externalId).toBe('event123');
69+
expect(formattedEvent.id).toBe('event123');
7070
expect(formattedEvent.conferenceSolution).toBe('teamsForBusiness');
7171
expect(formattedEvent.conferenceLinkUrl).toBe(
7272
'https://teams.microsoft.com/l/meetup-join/abc123',

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/drivers/microsoft-calendar/utils/format-microsoft-calendar-event.util.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,15 @@ import {
66

77
import { sanitizeCalendarEvent } from 'src/modules/calendar/calendar-event-import-manager/drivers/utils/sanitizeCalendarEvent';
88
import { CalendarEventParticipantResponseStatus } from 'src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity';
9-
import { CalendarEventWithParticipants } from 'src/modules/calendar/common/types/calendar-event';
9+
import { FetchedCalendarEvent } from 'src/modules/calendar/common/types/fetched-calendar-event';
1010

1111
export const formatMicrosoftCalendarEvents = (
1212
events: Event[],
13-
): CalendarEventWithParticipants[] => {
13+
): FetchedCalendarEvent[] => {
1414
return events.map(formatMicrosoftCalendarEvent);
1515
};
1616

17-
const formatMicrosoftCalendarEvent = (
18-
event: Event,
19-
): CalendarEventWithParticipants => {
17+
const formatMicrosoftCalendarEvent = (event: Event): FetchedCalendarEvent => {
2018
const formatResponseStatus = (
2119
status: NullableOption<ResponseType> | undefined,
2220
) => {
@@ -33,15 +31,15 @@ const formatMicrosoftCalendarEvent = (
3331
}
3432
};
3533

36-
const calendarEvent: CalendarEventWithParticipants = {
34+
const calendarEvent: FetchedCalendarEvent = {
3735
title: event.subject ?? '',
3836
isCanceled: !!event.isCancelled,
3937
isFullDay: !!event.isAllDay,
40-
startsAt: event.start?.dateTime ?? null,
41-
endsAt: event.end?.dateTime ?? null,
42-
externalId: event.id ?? '',
43-
externalCreatedAt: event.createdDateTime ?? null,
44-
externalUpdatedAt: event.lastModifiedDateTime ?? null,
38+
startsAt: event.start?.dateTime ?? '',
39+
endsAt: event.end?.dateTime ?? '',
40+
id: event.id ?? '',
41+
externalCreatedAt: event.createdDateTime ?? '',
42+
externalUpdatedAt: event.lastModifiedDateTime ?? '',
4543
description: event.body?.content ?? '',
4644
location: event.location?.displayName ?? '',
4745
iCalUID: event.iCalUId ?? '',
@@ -59,11 +57,11 @@ const formatMicrosoftCalendarEvent = (
5957
status: '',
6058
};
6159

62-
const propertiesToSanitize: (keyof CalendarEventWithParticipants)[] = [
60+
const propertiesToSanitize: (keyof FetchedCalendarEvent)[] = [
6361
'title',
6462
'startsAt',
6563
'endsAt',
66-
'externalId',
64+
'id',
6765
'externalCreatedAt',
6866
'externalUpdatedAt',
6967
'description',

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-events-import.service.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { filterEventsAndReturnCancelledEvents } from 'src/modules/calendar/calen
2121
import { CalendarChannelSyncStatusService } from 'src/modules/calendar/common/services/calendar-channel-sync-status.service';
2222
import { CalendarChannelEventAssociationWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity';
2323
import { CalendarChannelWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity';
24-
import { CalendarEventWithParticipants } from 'src/modules/calendar/common/types/calendar-event';
24+
import { FetchedCalendarEvent } from 'src/modules/calendar/common/types/fetched-calendar-event';
2525
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
2626

2727
@Injectable()
@@ -43,13 +43,13 @@ export class CalendarEventsImportService {
4343
calendarChannel: CalendarChannelWorkspaceEntity,
4444
connectedAccount: ConnectedAccountWorkspaceEntity,
4545
workspaceId: string,
46-
fetchedCalendarEvents?: CalendarEventWithParticipants[],
46+
fetchedCalendarEvents?: FetchedCalendarEvent[],
4747
): Promise<void> {
4848
await this.calendarChannelSyncStatusService.markAsCalendarEventsImportOngoing(
4949
[calendarChannel.id],
5050
);
5151

52-
let calendarEvents: CalendarEventWithParticipants[] = [];
52+
let calendarEvents: FetchedCalendarEvent[] = [];
5353

5454
try {
5555
if (fetchedCalendarEvents) {
@@ -103,7 +103,7 @@ export class CalendarEventsImportService {
103103
);
104104

105105
const cancelledEventExternalIds = cancelledEvents.map(
106-
(event) => event.externalId,
106+
(event) => event.id,
107107
);
108108

109109
const BATCH_SIZE = 1000;

packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-get-events.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import {
88
CalendarEventImportException,
99
CalendarEventImportExceptionCode,
1010
} from 'src/modules/calendar/calendar-event-import-manager/exceptions/calendar-event-import.exception';
11-
import { CalendarEventWithParticipants } from 'src/modules/calendar/common/types/calendar-event';
11+
import { FetchedCalendarEvent } from 'src/modules/calendar/common/types/fetched-calendar-event';
1212
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
1313

1414
export type GetCalendarEventsResponse = {
1515
fullEvents: boolean;
16-
calendarEvents?: CalendarEventWithParticipants[];
16+
calendarEvents?: FetchedCalendarEvent[];
1717
calendarEventIds?: string[];
1818
nextSyncCursor: string;
1919
};

0 commit comments

Comments
 (0)