Skip to content

Commit a59ffd1

Browse files
committed
fix(google): keep reminder useDefault, detect fullText outside quoted values, accept numeric task list ids
1 parent a63759f commit a59ffd1

3 files changed

Lines changed: 20 additions & 12 deletions

File tree

‎apps/sim/tools/google_calendar/utils.ts‎

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,14 @@ const MAX_REMINDER_OVERRIDES = 5
105105
const MAX_REMINDER_MINUTES = 40320
106106

107107
/**
108-
* Parse reminder overrides from a JSON string or array of `{ method, minutes }` objects.
109-
* Returns `undefined` when nothing usable was provided. An empty array (`[]`) means
110-
* "no reminders" and is returned as-is so callers can turn the calendar default off.
108+
* Parse the reminders input into the Calendar `reminders` setting. Accepts a JSON string or
109+
* value that is either an array of `{ method, minutes }` overrides (custom reminders; `[]`
110+
* turns reminders off) or the API's own `{ useDefault, overrides }` object, so a previous
111+
* event's reminders can be copied as-is. Returns `undefined` when nothing usable was provided.
111112
*/
112-
function parseReminderOverrides(
113-
reminders: string | GoogleCalendarReminderOverride[] | undefined
114-
): GoogleCalendarReminderOverride[] | undefined {
113+
function parseReminders(
114+
reminders: unknown
115+
): { useDefault: boolean; overrides?: GoogleCalendarReminderOverride[] } | undefined {
115116
if (reminders === undefined || reminders === null) return undefined
116117

117118
let parsed: unknown = reminders
@@ -125,10 +126,16 @@ function parseReminderOverrides(
125126
}
126127
}
127128

128-
if (isRecordLike(parsed) && Array.isArray(parsed.overrides)) {
129-
parsed = parsed.overrides
129+
if (isRecordLike(parsed) && !Array.isArray(parsed)) {
130+
if (parsed.useDefault === true) return { useDefault: true }
131+
const overrides = parsed.overrides === undefined ? [] : parsed.overrides
132+
return { useDefault: false, overrides: validateReminderOverrides(overrides) }
130133
}
131134

135+
return { useDefault: false, overrides: validateReminderOverrides(parsed) }
136+
}
137+
138+
function validateReminderOverrides(parsed: unknown): GoogleCalendarReminderOverride[] {
132139
if (!Array.isArray(parsed)) {
133140
throw new Error('Reminders must be an array of { method, minutes } objects')
134141
}
@@ -173,8 +180,8 @@ export function applyEventOptions(
173180
if (params.transparency) body.transparency = params.transparency
174181
const colorId = params.colorId?.toString().trim()
175182
if (colorId) body.colorId = colorId
176-
const overrides = parseReminderOverrides(params.reminders)
177-
if (overrides) body.reminders = { useDefault: false, overrides }
183+
const reminders = parseReminders(params.reminders)
184+
if (reminders) body.reminders = reminders
178185
}
179186

180187
/** Fields shared by every event-shaped output beyond the core id/summary/time/people fields. */

‎apps/sim/tools/google_drive/search.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ export const searchTool: ToolConfig<GoogleDriveSearchParams, GoogleDriveSearchRe
8484
url.searchParams.append('supportsAllDrives', 'true')
8585
url.searchParams.append('includeItemsFromAllDrives', 'true')
8686
const orderBy = params.orderBy?.trim()
87-
if (orderBy && !/\bfullText\b/.test(params.query ?? '')) {
87+
const queryWithoutLiterals = (params.query ?? '').replace(/'(?:[^'\\]|\\.)*'/g, "''")
88+
if (orderBy && !/\bfullText\b/.test(queryWithoutLiterals)) {
8889
url.searchParams.append('orderBy', orderBy)
8990
}
9091

‎apps/sim/tools/google_tasks/types.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ interface TaskLink {
126126

127127
/** Builds the `lists/{tasklist}` path segment, defaulting to the primary list. */
128128
export function taskListPath(taskListId: string | undefined): string {
129-
return `lists/${safeUrlPathSegment(taskListId?.trim() || '@default', 'taskListId', { allowSeparators: true })}`
129+
return `lists/${safeUrlPathSegment(String(taskListId ?? '').trim() || '@default', 'taskListId', { allowSeparators: true })}`
130130
}
131131

132132
/** Builds the `lists/{tasklist}/tasks/{task}` path. */

0 commit comments

Comments
 (0)