Skip to content

Commit b31921b

Browse files
committed
jadoo: create full-day leave events as all-day gcal entries
1 parent 7815426 commit b31921b

5 files changed

Lines changed: 23 additions & 3 deletions

File tree

jadoo/src/interfaces/calendar.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface CalendarEvent {
99
description?: string;
1010
start: Date;
1111
end: Date;
12+
allDay?: boolean;
1213
attendees?: string[];
1314
location?: string;
1415
}
@@ -18,6 +19,7 @@ export interface CreateEventRequest {
1819
description?: string;
1920
start: Date;
2021
end: Date;
22+
allDay?: boolean;
2123
attendees?: string[];
2224
location?: string;
2325
}

jadoo/src/services/calendar/gcal-service.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import type {
1212
} from "../../interfaces/calendar.js";
1313

1414
function toCalendarEvent(event: calendar_v3.Schema$Event): CalendarEvent {
15+
const allDay = Boolean(event.start?.date && !event.start?.dateTime);
1516
return {
1617
id: event.id ?? "",
1718
summary: event.summary ?? "",
1819
description: event.description ?? undefined,
1920
start: new Date(event.start?.dateTime ?? event.start?.date ?? ""),
2021
end: new Date(event.end?.dateTime ?? event.end?.date ?? ""),
22+
allDay,
2123
attendees: event.attendees?.map((a) => a.email ?? "").filter(Boolean),
2224
location: event.location ?? undefined,
2325
};
@@ -59,8 +61,12 @@ export class GCalService implements CalendarService {
5961
requestBody: {
6062
summary: request.summary,
6163
description: request.description,
62-
start: { dateTime: request.start.toISOString() },
63-
end: { dateTime: request.end.toISOString() },
64+
start: request.allDay
65+
? { date: request.start.toISOString().slice(0, 10) }
66+
: { dateTime: request.start.toISOString() },
67+
end: request.allDay
68+
? { date: request.end.toISOString().slice(0, 10) }
69+
: { dateTime: request.end.toISOString() },
6470
attendees: request.attendees?.map((email) => ({ email })),
6571
location: request.location,
6672
},

jadoo/src/worker.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,20 +278,26 @@ export class BackgroundWorker {
278278
let stage: LeaveProcessingFailure["stage"] = "calendar";
279279
try {
280280
// Sync to Calendar
281+
const isFullDayLeave = payload.leaveType === "full";
281282
const start = new Date(`${date}T00:00:00`);
282-
const end = new Date(`${date}T23:59:59`);
283+
const end = isFullDayLeave ? new Date(`${date}T00:00:00`) : new Date(`${date}T23:59:59`);
284+
if (isFullDayLeave) {
285+
end.setDate(end.getDate() + 1);
286+
}
283287
logWorker("creating calendar event", {
284288
actionId: action.id,
285289
recordId: record.id,
286290
date,
287291
start: start.toISOString(),
288292
end: end.toISOString(),
293+
allDay: isFullDayLeave,
289294
});
290295
const calEvent = await this.calendar.createEvent({
291296
summary: `${user.slack_display_name}${payload.category} (${payload.leaveType})`,
292297
description: payload.reason,
293298
start,
294299
end,
300+
allDay: isFullDayLeave,
295301
});
296302
logWorker("calendar event created", {
297303
actionId: action.id,

jadoo/test/mocks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ export class MockCalendarService implements CalendarService {
9595
description: request.description,
9696
start: request.start,
9797
end: request.end,
98+
allDay: request.allDay,
9899
attendees: request.attendees,
99100
location: request.location,
100101
};

jadoo/test/worker.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ describe("processTick — create_leave", () => {
8383
expect(calendar.createdEvents).toHaveLength(1);
8484
expect(calendar.createdEvents[0].summary).toContain("Alice");
8585
expect(calendar.createdEvents[0].summary).toContain("vacation");
86+
expect(calendar.createdEvents[0].allDay).toBe(true);
87+
expect(calendar.createdEvents[0].start.toISOString().slice(0, 10)).toBe("2026-04-01");
88+
expect(calendar.createdEvents[0].end.toISOString().slice(0, 10)).toBe("2026-04-02");
8689

8790
// Harvest entry created
8891
expect(harvest.createdEntries).toHaveLength(1);
@@ -257,6 +260,8 @@ describe("processTick — create_leave", () => {
257260
expect(getPendingActionById(db, a1.id)?.status).toBe("completed");
258261
expect(getPendingActionById(db, a2.id)?.status).toBe("completed");
259262
expect(calendar.createdEvents).toHaveLength(2);
263+
expect(calendar.createdEvents[0].allDay).toBe(true);
264+
expect(calendar.createdEvents[1].allDay).toBeFalsy();
260265
expect(harvest.createdEntries).toHaveLength(2);
261266
});
262267
});

0 commit comments

Comments
 (0)