- Vintage Modell hinzugefuegt - Equipment Multi-Select (Neue Buchung + Bearbeitung) - Kundenadresse in Formularen - Bearbeiten-Seite fuer Buchungen - Abbau-Zeiten in Formularen und Uebersicht - Vertrag PDF nur bei Privatkunden - LexOffice Kontakt-Erstellung Fix (BUSINESS) - Zurueck-Pfeil auf Touren-Seite
109 lines
3.1 KiB
TypeScript
109 lines
3.1 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { getServerSession } from 'next-auth';
|
|
import { authOptions } from '@/lib/auth';
|
|
import { emailSyncService } from '@/lib/email-sync';
|
|
import { prisma } from '@/lib/prisma';
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const session = await getServerSession(authOptions);
|
|
|
|
if (!session || session.user.role !== 'ADMIN') {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
|
|
const { locationId } = await request.json();
|
|
|
|
if (locationId) {
|
|
// Sync specific location
|
|
console.log(`🔄 Starte E-Mail-Sync für Location: ${locationId}`);
|
|
const result = await emailSyncService.syncLocationEmails(locationId);
|
|
|
|
return NextResponse.json({
|
|
success: result.success,
|
|
location: locationId,
|
|
newEmails: result.newEmails,
|
|
newBookings: result.newBookings,
|
|
errors: result.errors,
|
|
});
|
|
} else {
|
|
// Sync all locations
|
|
console.log('🔄 Starte E-Mail-Sync für alle Locations...');
|
|
|
|
const locations = await prisma.location.findMany({
|
|
where: { emailSyncEnabled: true },
|
|
select: { id: true, name: true },
|
|
});
|
|
|
|
const results = [];
|
|
|
|
for (const location of locations) {
|
|
console.log(`📍 Sync: ${location.name}`);
|
|
const result = await emailSyncService.syncLocationEmails(location.id);
|
|
results.push({
|
|
locationId: location.id,
|
|
locationName: location.name,
|
|
...result,
|
|
});
|
|
}
|
|
|
|
const totalNewEmails = results.reduce((sum, r) => sum + r.newEmails, 0);
|
|
const totalNewBookings = results.reduce((sum, r) => sum + r.newBookings, 0);
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
totalLocations: locations.length,
|
|
totalNewEmails,
|
|
totalNewBookings,
|
|
results,
|
|
});
|
|
}
|
|
} catch (error: any) {
|
|
console.error('❌ E-Mail-Sync Fehler:', error);
|
|
return NextResponse.json(
|
|
{ error: error.message || 'E-Mail-Sync fehlgeschlagen' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const session = await getServerSession(authOptions);
|
|
|
|
if (!session || session.user.role !== 'ADMIN') {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
|
|
// Get sync status for all locations
|
|
const locations = await prisma.location.findMany({
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
slug: true,
|
|
emailSyncEnabled: true,
|
|
lastEmailSync: true,
|
|
imapHost: true,
|
|
imapUser: true,
|
|
},
|
|
});
|
|
|
|
const status = locations.map(loc => ({
|
|
id: loc.id,
|
|
name: loc.name,
|
|
slug: loc.slug,
|
|
syncEnabled: loc.emailSyncEnabled,
|
|
configured: !!(loc.imapHost && loc.imapUser),
|
|
lastSync: loc.lastEmailSync,
|
|
}));
|
|
|
|
return NextResponse.json({ locations: status });
|
|
} catch (error: any) {
|
|
console.error('❌ Fehler beim Abrufen des Sync-Status:', error);
|
|
return NextResponse.json(
|
|
{ error: error.message || 'Fehler beim Abrufen des Status' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|