-
Notifications
You must be signed in to change notification settings - Fork 0
fix: handle collective multiple host on destinationCalendar #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: eval-pr-4-target-1759088940839
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -84,7 +84,7 @@ export default class GoogleCalendarService implements Calendar { | |||||
| }; | ||||||
| }; | ||||||
|
|
||||||
| async createEvent(calEventRaw: CalendarEvent): Promise<NewCalendarEventType> { | ||||||
| async createEvent(calEventRaw: CalendarEvent, credentialId: number): Promise<NewCalendarEventType> { | ||||||
| const eventAttendees = calEventRaw.attendees.map(({ id: _id, ...rest }) => ({ | ||||||
| ...rest, | ||||||
| responseStatus: "accepted", | ||||||
|
|
@@ -97,6 +97,10 @@ export default class GoogleCalendarService implements Calendar { | |||||
| responseStatus: "accepted", | ||||||
| })) || []; | ||||||
| return new Promise(async (resolve, reject) => { | ||||||
| const [mainHostDestinationCalendar] = | ||||||
| calEventRaw?.destinationCalendar && calEventRaw?.destinationCalendar.length > 0 | ||||||
| ? calEventRaw.destinationCalendar | ||||||
| : []; | ||||||
| const myGoogleAuth = await this.auth.getToken(); | ||||||
| const payload: calendar_v3.Schema$Event = { | ||||||
| summary: calEventRaw.title, | ||||||
|
|
@@ -115,8 +119,8 @@ export default class GoogleCalendarService implements Calendar { | |||||
| id: String(calEventRaw.organizer.id), | ||||||
| responseStatus: "accepted", | ||||||
| organizer: true, | ||||||
| email: calEventRaw.destinationCalendar?.externalId | ||||||
| ? calEventRaw.destinationCalendar.externalId | ||||||
| email: mainHostDestinationCalendar?.externalId | ||||||
| ? mainHostDestinationCalendar.externalId | ||||||
| : calEventRaw.organizer.email, | ||||||
| }, | ||||||
| ...eventAttendees, | ||||||
|
|
@@ -138,13 +142,16 @@ export default class GoogleCalendarService implements Calendar { | |||||
| const calendar = google.calendar({ | ||||||
| version: "v3", | ||||||
| }); | ||||||
| const selectedCalendar = calEventRaw.destinationCalendar?.externalId | ||||||
| ? calEventRaw.destinationCalendar.externalId | ||||||
| : "primary"; | ||||||
| // Find in calEventRaw.destinationCalendar the one with the same credentialId | ||||||
|
|
||||||
| const selectedCalendar = calEventRaw.destinationCalendar?.find( | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If no destination calendar matches this credential, Prompt for AI agents[internal] Confidence score: 8/10 [internal] Posted by: General AI Review Agent
Suggested change
|
||||||
| (cal) => cal.credentialId === credentialId | ||||||
| )?.externalId; | ||||||
|
|
||||||
| calendar.events.insert( | ||||||
| { | ||||||
| auth: myGoogleAuth, | ||||||
| calendarId: selectedCalendar, | ||||||
| calendarId: selectedCalendar || "primary", | ||||||
| requestBody: payload, | ||||||
| conferenceDataVersion: 1, | ||||||
| sendUpdates: "none", | ||||||
|
|
@@ -188,6 +195,8 @@ export default class GoogleCalendarService implements Calendar { | |||||
|
|
||||||
| async updateEvent(uid: string, event: CalendarEvent, externalCalendarId: string): Promise<any> { | ||||||
| return new Promise(async (resolve, reject) => { | ||||||
| const [mainHostDestinationCalendar] = | ||||||
| event?.destinationCalendar && event?.destinationCalendar.length > 0 ? event.destinationCalendar : []; | ||||||
| const myGoogleAuth = await this.auth.getToken(); | ||||||
| const eventAttendees = event.attendees.map(({ ...rest }) => ({ | ||||||
| ...rest, | ||||||
|
|
@@ -216,8 +225,8 @@ export default class GoogleCalendarService implements Calendar { | |||||
| id: String(event.organizer.id), | ||||||
| organizer: true, | ||||||
| responseStatus: "accepted", | ||||||
| email: event.destinationCalendar?.externalId | ||||||
| ? event.destinationCalendar.externalId | ||||||
| email: mainHostDestinationCalendar?.externalId | ||||||
| ? mainHostDestinationCalendar.externalId | ||||||
| : event.organizer.email, | ||||||
| }, | ||||||
| ...(eventAttendees as any), | ||||||
|
|
@@ -244,7 +253,7 @@ export default class GoogleCalendarService implements Calendar { | |||||
|
|
||||||
| const selectedCalendar = externalCalendarId | ||||||
| ? externalCalendarId | ||||||
| : event.destinationCalendar?.externalId; | ||||||
| : event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId; | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When Prompt for AI agents[internal] Confidence score: 9/10 [internal] Posted by: General AI Review Agent There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When Prompt for AI agents[internal] Confidence score: 9/10 [internal] Posted by: General AI Review Agent There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. updateEvent may pass undefined calendarId; createEvent follow-up patch may pass undefined calendarId; organizer attendee email set to calendarId; and patch errors are swallowed Prompt for AI agents[internal] Confidence score: 9/10 [internal] Posted by: Functional Bugs Agent |
||||||
|
|
||||||
| calendar.events.update( | ||||||
| { | ||||||
|
|
@@ -303,7 +312,9 @@ export default class GoogleCalendarService implements Calendar { | |||||
| }); | ||||||
|
|
||||||
| const defaultCalendarId = "primary"; | ||||||
| const calendarId = externalCalendarId ? externalCalendarId : event.destinationCalendar?.externalId; | ||||||
| const calendarId = externalCalendarId | ||||||
| ? externalCalendarId | ||||||
| : event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId; | ||||||
|
|
||||||
| calendar.events.delete( | ||||||
| { | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -125,7 +125,8 @@ export default class LarkCalendarService implements Calendar { | |
| async createEvent(event: CalendarEvent): Promise<NewCalendarEventType> { | ||
| let eventId = ""; | ||
| let eventRespData; | ||
| const calendarId = event.destinationCalendar?.externalId; | ||
| const [mainHostDestinationCalendar] = event.destinationCalendar ?? []; | ||
| const calendarId = mainHostDestinationCalendar?.externalId; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The calendar services for Lark, Office365, and iCal have not been correctly updated to handle multiple destination calendars. They consistently only process the first calendar in the DEV MODE: This violation would have been filtered out by screening filters. Failing filters: typescriptUnderstanding. Prompt for AI agents[internal] Confidence score: 10/10 [internal] Posted by: System Design Agent |
||
| if (!calendarId) { | ||
| throw new Error("no calendar id"); | ||
| } | ||
|
|
@@ -160,7 +161,8 @@ export default class LarkCalendarService implements Calendar { | |
| } | ||
|
|
||
| private createAttendees = async (event: CalendarEvent, eventId: string) => { | ||
| const calendarId = event.destinationCalendar?.externalId; | ||
| const [mainHostDestinationCalendar] = event.destinationCalendar ?? []; | ||
| const calendarId = mainHostDestinationCalendar?.externalId; | ||
| if (!calendarId) { | ||
| this.log.error("no calendar id provided in createAttendees"); | ||
| throw new Error("no calendar id provided in createAttendees"); | ||
|
|
@@ -187,7 +189,8 @@ export default class LarkCalendarService implements Calendar { | |
| async updateEvent(uid: string, event: CalendarEvent, externalCalendarId?: string) { | ||
| const eventId = uid; | ||
| let eventRespData; | ||
| const calendarId = externalCalendarId || event.destinationCalendar?.externalId; | ||
| const [mainHostDestinationCalendar] = event.destinationCalendar ?? []; | ||
| const calendarId = externalCalendarId || mainHostDestinationCalendar?.externalId; | ||
| if (!calendarId) { | ||
| this.log.error("no calendar id provided in updateEvent"); | ||
| throw new Error("no calendar id provided in updateEvent"); | ||
|
|
@@ -231,7 +234,8 @@ export default class LarkCalendarService implements Calendar { | |
| * @returns | ||
| */ | ||
| async deleteEvent(uid: string, event: CalendarEvent, externalCalendarId?: string) { | ||
| const calendarId = externalCalendarId || event.destinationCalendar?.externalId; | ||
| const [mainHostDestinationCalendar] = event.destinationCalendar ?? []; | ||
| const calendarId = externalCalendarId || mainHostDestinationCalendar?.externalId; | ||
| if (!calendarId) { | ||
| this.log.error("no calendar id provided in deleteEvent"); | ||
| throw new Error("no calendar id provided in deleteEvent"); | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -70,9 +70,10 @@ export default class Office365CalendarService implements Calendar { | |||||||||
| } | ||||||||||
|
|
||||||||||
| async createEvent(event: CalendarEvent): Promise<NewCalendarEventType> { | ||||||||||
| const [mainHostDestinationCalendar] = event.destinationCalendar ?? []; | ||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The new destructuring assumes Prompt for AI agents[internal] Confidence score: 7/10 [internal] Posted by: General AI Review Agent
Suggested change
|
||||||||||
| try { | ||||||||||
| const eventsUrl = event.destinationCalendar?.externalId | ||||||||||
| ? `/me/calendars/${event.destinationCalendar?.externalId}/events` | ||||||||||
| const eventsUrl = mainHostDestinationCalendar?.externalId | ||||||||||
| ? `/me/calendars/${mainHostDestinationCalendar?.externalId}/events` | ||||||||||
| : "/me/calendar/events"; | ||||||||||
|
|
||||||||||
| const response = await this.fetcher(eventsUrl, { | ||||||||||
|
|
||||||||||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For collective events with multiple hosts, this logic only considers the primary destination calendar (
booking.destinationCalendar). It fails to load all calendar events from the booking's references, leading to incomplete data for reminders. TheCalendarEventobject is constructed with only a single host's calendar, which is incorrect for multi-host bookings.Reasoning:
• GPT-5: Insufficient in-file evidence to confirm the multi-host calendar requirement. The claim depends on architecture outside the visible context; to minimize false positives, filter this.
Prompt for AI agents
[internal] Confidence score: 9/10
[internal] Posted by: System Design Agent