Agenda refactor
This commit is contained in:
parent
9904370ac8
commit
d9c78d8125
@ -178,9 +178,7 @@ export default async function CalendarPage() {
|
|||||||
// For each Infomaniak account, ensure there's a synced calendar
|
// For each Infomaniak account, ensure there's a synced calendar
|
||||||
// Skip if no Infomaniak accounts exist (user may only have Microsoft accounts)
|
// Skip if no Infomaniak accounts exist (user may only have Microsoft accounts)
|
||||||
if (infomaniakAccounts.length > 0) {
|
if (infomaniakAccounts.length > 0) {
|
||||||
console.log(`[AGENDA] Processing ${infomaniakAccounts.length} Infomaniak account(s)`);
|
|
||||||
for (const account of infomaniakAccounts) {
|
for (const account of infomaniakAccounts) {
|
||||||
console.log(`[AGENDA] Processing Infomaniak account: ${account.email}, hasPassword: ${!!account.password}, passwordLength: ${account.password?.length || 0}`);
|
|
||||||
// Check if a calendar sync already exists for this account (enabled or disabled)
|
// Check if a calendar sync already exists for this account (enabled or disabled)
|
||||||
// This prevents creating duplicate calendars for the same account
|
// This prevents creating duplicate calendars for the same account
|
||||||
let existingSync = await prisma.calendarSync.findFirst({
|
let existingSync = await prisma.calendarSync.findFirst({
|
||||||
@ -341,21 +339,11 @@ export default async function CalendarPage() {
|
|||||||
// No sync exists for this account - try to discover and create calendar
|
// No sync exists for this account - try to discover and create calendar
|
||||||
// Only create calendar if discovery succeeds
|
// Only create calendar if discovery succeeds
|
||||||
try {
|
try {
|
||||||
// Verify password is available
|
|
||||||
if (!account.password) {
|
|
||||||
console.log(`[AGENDA] Skipping Infomaniak account ${account.email} - no password available`);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(`[AGENDA] Attempting to discover calendars for Infomaniak account ${account.email} (password length: ${account.password.length})`);
|
|
||||||
|
|
||||||
const { discoverInfomaniakCalendars } = await import('@/lib/services/caldav-sync');
|
const { discoverInfomaniakCalendars } = await import('@/lib/services/caldav-sync');
|
||||||
const externalCalendars = await discoverInfomaniakCalendars(
|
const externalCalendars = await discoverInfomaniakCalendars(
|
||||||
account.email,
|
account.email,
|
||||||
account.password
|
account.password!
|
||||||
);
|
);
|
||||||
|
|
||||||
console.log(`[AGENDA] Discovered ${externalCalendars.length} calendars for Infomaniak account ${account.email}`);
|
|
||||||
|
|
||||||
if (externalCalendars.length > 0) {
|
if (externalCalendars.length > 0) {
|
||||||
// Use the first calendar (usually the main calendar)
|
// Use the first calendar (usually the main calendar)
|
||||||
|
|||||||
@ -27,19 +27,8 @@ export async function getInfomaniakCalDAVClient(
|
|||||||
password: string
|
password: string
|
||||||
): Promise<WebDAVClient> {
|
): Promise<WebDAVClient> {
|
||||||
// Infomaniak CalDAV base URL (from Infomaniak sync assistant)
|
// Infomaniak CalDAV base URL (from Infomaniak sync assistant)
|
||||||
// The actual CalDAV endpoint is at /caldav path
|
// Base URL is https://sync.infomaniak.com, CalDAV endpoint is accessed via /caldav path
|
||||||
const baseUrl = 'https://sync.infomaniak.com/caldav';
|
const baseUrl = 'https://sync.infomaniak.com';
|
||||||
|
|
||||||
if (!password || password.trim() === '') {
|
|
||||||
throw new Error('Password is required for Infomaniak CalDAV authentication');
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug('Creating Infomaniak CalDAV client', {
|
|
||||||
email,
|
|
||||||
baseUrl,
|
|
||||||
hasPassword: !!password,
|
|
||||||
passwordLength: password.length,
|
|
||||||
});
|
|
||||||
|
|
||||||
const client = createClient(baseUrl, {
|
const client = createClient(baseUrl, {
|
||||||
username: email,
|
username: email,
|
||||||
@ -57,49 +46,10 @@ export async function discoverInfomaniakCalendars(
|
|||||||
password: string
|
password: string
|
||||||
): Promise<CalDAVCalendar[]> {
|
): Promise<CalDAVCalendar[]> {
|
||||||
try {
|
try {
|
||||||
logger.debug('Starting Infomaniak calendar discovery', {
|
|
||||||
email,
|
|
||||||
hasPassword: !!password,
|
|
||||||
passwordLength: password?.length || 0,
|
|
||||||
});
|
|
||||||
|
|
||||||
const client = await getInfomaniakCalDAVClient(email, password);
|
const client = await getInfomaniakCalDAVClient(email, password);
|
||||||
|
|
||||||
logger.debug('CalDAV client created, attempting to list directory contents');
|
// List all calendars using PROPFIND on /caldav path
|
||||||
|
const items = await client.getDirectoryContents('/caldav');
|
||||||
// List all calendars using PROPFIND on root
|
|
||||||
let items;
|
|
||||||
try {
|
|
||||||
items = await client.getDirectoryContents('/');
|
|
||||||
logger.debug(`Successfully retrieved ${items.length} items from CalDAV server`);
|
|
||||||
} catch (dirError: any) {
|
|
||||||
// Log more details about the error
|
|
||||||
const errorDetails: any = {
|
|
||||||
email,
|
|
||||||
error: dirError?.message || String(dirError),
|
|
||||||
status: dirError?.status,
|
|
||||||
statusText: dirError?.statusText,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Try to extract more details from the error
|
|
||||||
if (dirError?.response) {
|
|
||||||
errorDetails.responseStatus = dirError.response.status;
|
|
||||||
errorDetails.responseStatusText = dirError.response.statusText;
|
|
||||||
errorDetails.responseHeaders = dirError.response.headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if it's a 401 error specifically
|
|
||||||
if (dirError?.status === 401 || dirError?.response?.status === 401) {
|
|
||||||
logger.error('CalDAV authentication failed (401 Unauthorized)', {
|
|
||||||
...errorDetails,
|
|
||||||
hint: 'This usually means: 1) Password is incorrect, 2) Password has changed, 3) 2FA is enabled and requires an app-specific password, 4) Account credentials are invalid',
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
logger.error('Error listing directory contents', errorDetails);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw dirError;
|
|
||||||
}
|
|
||||||
|
|
||||||
const calendars: CalDAVCalendar[] = [];
|
const calendars: CalDAVCalendar[] = [];
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user