feat: Equipment-System, Buchungsbearbeitung, Kundenadresse, LexOffice-Fix
- 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
This commit is contained in:
108
app/api/admin/sync-emails/route.ts
Normal file
108
app/api/admin/sync-emails/route.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
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 }
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user