style(11-04): apply prettier to phase-11 modified files
- apps/pwa/src/components/EventForm.tsx (Task 2)
- apps/api/src/broker/{expand,reminderScheduler,sync,vevent}.ts (Plans 11-01/11-03)
- apps/api/tests/broker/{reminderScheduler,sync}.test.ts (Plans 11-01/11-03)
This commit is contained in:
@@ -243,9 +243,7 @@ export function expandOccurrences(
|
||||
// classifyValarms wraps ICAL.parse in try/catch (T-11-07 safe); safe on parse failure → null.
|
||||
const alarmClass = classifyValarms(rawVevent);
|
||||
const reminderLeadMinutes: number | null =
|
||||
alarmClass.kind === 'preset' || alarmClass.kind === 'offlist'
|
||||
? alarmClass.leadMinutes
|
||||
: null;
|
||||
alarmClass.kind === 'preset' || alarmClass.kind === 'offlist' ? alarmClass.leadMinutes : null;
|
||||
|
||||
// --- 4. Non-recurring event: single occurrence check ---
|
||||
if (!isRecurring) {
|
||||
|
||||
@@ -183,8 +183,8 @@ export async function runReminderCheck(now = new Date()): Promise<void> {
|
||||
{
|
||||
uid: string;
|
||||
title: string | null;
|
||||
dtstartMs: number; // key component — used for compound dedup key
|
||||
pruneMs: number; // when to prune: dtstartUtc for timed; end-of-event-date for all-day
|
||||
dtstartMs: number; // key component — used for compound dedup key
|
||||
pruneMs: number; // when to prune: dtstartUtc for timed; end-of-event-date for all-day
|
||||
reminderLeadMinutes: number;
|
||||
dateStr: string;
|
||||
subs: SubRow[];
|
||||
@@ -233,7 +233,7 @@ export async function runReminderCheck(now = new Date()): Promise<void> {
|
||||
const serverTz = process.env.TZ ?? Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||
for (const row of allDayRows) {
|
||||
// Drizzle's date() column type is Date|null in TS but mysql2 returns ISO string at runtime
|
||||
const dtstartDate = (row.dtstartDate as unknown) as string; // 'YYYY-MM-DD'
|
||||
const dtstartDate = row.dtstartDate as unknown as string; // 'YYYY-MM-DD'
|
||||
const lead = row.reminderLeadMinutes as number;
|
||||
// D-06: all-day 0 is valid (same-day 9 AM) — do NOT skip
|
||||
|
||||
|
||||
@@ -136,9 +136,7 @@ export async function syncCalendar(
|
||||
// none → null (no VALARM present).
|
||||
const alarmClass = classifyValarms(obj.data as string);
|
||||
const reminderLeadMinutesValue: number | null =
|
||||
alarmClass.kind === 'preset' || alarmClass.kind === 'offlist'
|
||||
? alarmClass.leadMinutes
|
||||
: null;
|
||||
alarmClass.kind === 'preset' || alarmClass.kind === 'offlist' ? alarmClass.leadMinutes : null;
|
||||
|
||||
// NOTIF-03: look up the existing row so we can classify add vs update.
|
||||
// One indexed lookup on (calendarId, uid) — cheap, covered by uniq_calendar_uid.
|
||||
|
||||
@@ -230,11 +230,7 @@ export function extractValarms(rawVevent: string): ICAL.Component[] {
|
||||
* @param leadDays — days before event date (0 = same day, 1 = 1 day before, etc.)
|
||||
* @param tz — IANA timezone identifier (e.g. 'America/New_York')
|
||||
*/
|
||||
export function computeAlertInstantUtc(
|
||||
eventDateStr: string,
|
||||
leadDays: number,
|
||||
tz: string,
|
||||
): Date {
|
||||
export function computeAlertInstantUtc(eventDateStr: string, leadDays: number, tz: string): Date {
|
||||
// Parse event date as UTC midnight, then subtract lead days to get alert date
|
||||
const [y, m, d] = eventDateStr.split('-').map(Number) as [number, number, number];
|
||||
const alertDateUtcMs = Date.UTC(y, m - 1, d - leadDays);
|
||||
|
||||
@@ -97,7 +97,8 @@ function makeEventRow(overrides: {
|
||||
dtstartDate: overrides.dtstartDate !== undefined ? overrides.dtstartDate : null,
|
||||
allDay: overrides.allDay ?? false,
|
||||
isShared: overrides.isShared ?? true,
|
||||
reminderLeadMinutes: overrides.reminderLeadMinutes !== undefined ? overrides.reminderLeadMinutes : 15,
|
||||
reminderLeadMinutes:
|
||||
overrides.reminderLeadMinutes !== undefined ? overrides.reminderLeadMinutes : 15,
|
||||
subId: overrides.subId ?? 1,
|
||||
subUserId: overrides.subUserId ?? 1,
|
||||
subEndpoint: overrides.subEndpoint ?? 'https://push.example.com/1',
|
||||
|
||||
@@ -477,9 +477,11 @@ describe('syncCalendar — reminderLeadMinutes from VALARM (Phase 11 Plan 03 Tas
|
||||
].join('\r\n');
|
||||
|
||||
const mockClient = {
|
||||
fetchCalendarObjects: vi.fn().mockResolvedValue([
|
||||
{ data: rawVeventWithValarm, etag: '"etag-valarm"', url: '/cal/valarm.ics' },
|
||||
]),
|
||||
fetchCalendarObjects: vi
|
||||
.fn()
|
||||
.mockResolvedValue([
|
||||
{ data: rawVeventWithValarm, etag: '"etag-valarm"', url: '/cal/valarm.ics' },
|
||||
]),
|
||||
};
|
||||
|
||||
await syncCalendar(mockClient as never, MOCK_DAV_CAL as never, 1);
|
||||
@@ -505,9 +507,11 @@ describe('syncCalendar — reminderLeadMinutes from VALARM (Phase 11 Plan 03 Tas
|
||||
].join('\r\n');
|
||||
|
||||
const mockClient = {
|
||||
fetchCalendarObjects: vi.fn().mockResolvedValue([
|
||||
{ data: rawVeventNoValarm, etag: '"etag-no-valarm"', url: '/cal/no-valarm.ics' },
|
||||
]),
|
||||
fetchCalendarObjects: vi
|
||||
.fn()
|
||||
.mockResolvedValue([
|
||||
{ data: rawVeventNoValarm, etag: '"etag-no-valarm"', url: '/cal/no-valarm.ics' },
|
||||
]),
|
||||
};
|
||||
|
||||
await syncCalendar(mockClient as never, MOCK_DAV_CAL as never, 1);
|
||||
@@ -619,9 +623,11 @@ describe('syncCalendar — reminderLeadMinutes from VALARM (Phase 11 Plan 03 Tas
|
||||
].join('\r\n');
|
||||
|
||||
const mockClient = {
|
||||
fetchCalendarObjects: vi.fn().mockResolvedValue([
|
||||
{ data: rawVeventWithValarm, etag: '"etag-upsert"', url: '/cal/upsert.ics' },
|
||||
]),
|
||||
fetchCalendarObjects: vi
|
||||
.fn()
|
||||
.mockResolvedValue([
|
||||
{ data: rawVeventWithValarm, etag: '"etag-upsert"', url: '/cal/upsert.ics' },
|
||||
]),
|
||||
};
|
||||
|
||||
await syncCalendar(mockClient as never, MOCK_DAV_CAL as never, 1);
|
||||
|
||||
Reference in New Issue
Block a user