Agenda refactor
This commit is contained in:
parent
b5c15964e7
commit
8d2f139e9d
@ -54,9 +54,10 @@ export function Calendar() {
|
|||||||
// Deduplicate events by externalEventId (if same event appears in multiple calendars)
|
// Deduplicate events by externalEventId (if same event appears in multiple calendars)
|
||||||
// Keep the first occurrence of each unique externalEventId
|
// Keep the first occurrence of each unique externalEventId
|
||||||
const seenExternalIds = new Set<string>();
|
const seenExternalIds = new Set<string>();
|
||||||
const seenEventKeys = new Set<string>(); // For events without externalEventId, use title+start as key
|
const seenEventKeys = new Set<string>(); // For events without externalEventId, use title+start+calendar as key
|
||||||
const deduplicatedEvents = allEvents.filter((event: any) => {
|
const deduplicatedEvents = allEvents.filter((event: any) => {
|
||||||
if (event.externalEventId) {
|
if (event.externalEventId) {
|
||||||
|
// For events with externalEventId, deduplicate strictly by externalEventId
|
||||||
if (seenExternalIds.has(event.externalEventId)) {
|
if (seenExternalIds.has(event.externalEventId)) {
|
||||||
console.log('Calendar Widget - Skipping duplicate by externalEventId:', {
|
console.log('Calendar Widget - Skipping duplicate by externalEventId:', {
|
||||||
title: event.title,
|
title: event.title,
|
||||||
@ -67,10 +68,11 @@ export function Calendar() {
|
|||||||
}
|
}
|
||||||
seenExternalIds.add(event.externalEventId);
|
seenExternalIds.add(event.externalEventId);
|
||||||
} else {
|
} else {
|
||||||
// For events without externalEventId, use title + start date as key to avoid duplicates
|
// For events without externalEventId, use title + start date + calendar as key
|
||||||
const eventKey = `${event.title}|${new Date(event.start).toISOString().split('T')[0]}`;
|
// This prevents false positives when same title/date appears in different calendars
|
||||||
|
const eventKey = `${event.title}|${new Date(event.start).toISOString().split('T')[0]}|${event.calendar}`;
|
||||||
if (seenEventKeys.has(eventKey)) {
|
if (seenEventKeys.has(eventKey)) {
|
||||||
console.log('Calendar Widget - Skipping duplicate by title+date:', {
|
console.log('Calendar Widget - Skipping duplicate by title+date+calendar:', {
|
||||||
title: event.title,
|
title: event.title,
|
||||||
start: event.start,
|
start: event.start,
|
||||||
calendar: event.calendar,
|
calendar: event.calendar,
|
||||||
|
|||||||
@ -1091,9 +1091,17 @@ export async function syncMicrosoftCalendar(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Re-fetch existing events to get any that were just created/updated
|
||||||
|
const allExistingEvents = await prisma.event.findMany({
|
||||||
|
where: {
|
||||||
|
calendarId: syncConfig.calendarId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
// Find events in DB that have externalEventId but are not in the synced list
|
// Find events in DB that have externalEventId but are not in the synced list
|
||||||
// Only delete events that have an externalEventId (to avoid deleting manually created events)
|
// Only delete events that have an externalEventId (to avoid deleting manually created events)
|
||||||
for (const existingEvent of existingEvents) {
|
// This ensures events deleted in Microsoft are also deleted locally
|
||||||
|
for (const existingEvent of allExistingEvents) {
|
||||||
const externalId = (existingEvent as any).externalEventId;
|
const externalId = (existingEvent as any).externalEventId;
|
||||||
if (externalId && !syncedMicrosoftIds.has(externalId)) {
|
if (externalId && !syncedMicrosoftIds.has(externalId)) {
|
||||||
// This event exists in DB but not in Microsoft - it was deleted in Microsoft
|
// This event exists in DB but not in Microsoft - it was deleted in Microsoft
|
||||||
@ -1101,15 +1109,35 @@ export async function syncMicrosoftCalendar(
|
|||||||
eventId: existingEvent.id,
|
eventId: existingEvent.id,
|
||||||
title: existingEvent.title,
|
title: existingEvent.title,
|
||||||
externalEventId: externalId,
|
externalEventId: externalId,
|
||||||
|
calendarId: syncConfig.calendarId,
|
||||||
});
|
});
|
||||||
|
|
||||||
await prisma.event.delete({
|
try {
|
||||||
where: { id: existingEvent.id },
|
await prisma.event.delete({
|
||||||
});
|
where: { id: existingEvent.id },
|
||||||
|
});
|
||||||
deleted++;
|
|
||||||
|
deleted++;
|
||||||
|
logger.debug('Successfully deleted event', {
|
||||||
|
eventId: existingEvent.id,
|
||||||
|
title: existingEvent.title,
|
||||||
|
});
|
||||||
|
} catch (deleteError) {
|
||||||
|
logger.error('Error deleting event', {
|
||||||
|
eventId: existingEvent.id,
|
||||||
|
error: deleteError instanceof Error ? deleteError.message : String(deleteError),
|
||||||
|
});
|
||||||
|
// Continue with other deletions
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (deleted > 0) {
|
||||||
|
logger.info('Deleted events that no longer exist in Microsoft', {
|
||||||
|
calendarSyncId,
|
||||||
|
deletedCount: deleted,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Update sync timestamp
|
// Update sync timestamp
|
||||||
await prisma.calendarSync.update({
|
await prisma.calendarSync.update({
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user