fix(api): improve error handling and auth check in smtp settings route
This commit is contained in:
@@ -1,96 +1,76 @@
|
|||||||
// API route for getting and updating SMTP settings (protected by admin check)
|
// API route for getting and updating SMTP settings (protected by admin check)
|
||||||
import { NextResponse } from 'next/server';
|
import { NextResponse } from 'next/server';
|
||||||
import { createServerClient } from '@supabase/ssr';
|
import { verifyAdmin } from '@/lib/actions/auth';
|
||||||
import { cookies } from 'next/headers';
|
import { createAdminClient } from '@/lib/supabase/admin';
|
||||||
|
import { createClient } from '@/lib/supabase/server';
|
||||||
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
const cookieStore = await cookies();
|
|
||||||
|
|
||||||
const supabaseUrl = process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL || '';
|
|
||||||
const supabase = createServerClient(
|
|
||||||
supabaseUrl,
|
|
||||||
process.env.SUPABASE_SERVICE_ROLE_KEY ?? '',
|
|
||||||
{
|
|
||||||
cookies: {
|
|
||||||
getAll() {
|
|
||||||
return cookieStore.getAll()
|
|
||||||
},
|
|
||||||
setAll(cookiesToSet) {
|
|
||||||
try {
|
try {
|
||||||
cookiesToSet.forEach(({ name, value, options }) =>
|
await verifyAdmin();
|
||||||
cookieStore.set(name, value, options)
|
} catch (err: any) {
|
||||||
)
|
return NextResponse.json({ error: err.message || 'Not authenticated' }, { status: 401 });
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
let client: any;
|
||||||
|
try {
|
||||||
|
client = createAdminClient();
|
||||||
} catch {
|
} catch {
|
||||||
// Kann in einer API-Route ignoriert werden, wenn nur gelesen wird
|
client = await createClient();
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
cookieOptions: {
|
|
||||||
name: "webshop-auth-token",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const { data: { user: authUser }, error: authError } = await supabase.auth.getUser();
|
|
||||||
if (authError || !authUser) {
|
|
||||||
return NextResponse.json({ error: 'Not authenticated' }, { status: 401 });
|
|
||||||
}
|
|
||||||
const { data: user } = await supabase.from('users').select('role').eq('id', authUser.id).single();
|
|
||||||
if (!user || user.role !== 'admin') {
|
|
||||||
return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data, error } = await supabase.from('settings').select('*').maybeSingle();
|
const { data, error } = await client
|
||||||
|
.from('settings')
|
||||||
|
.select('*')
|
||||||
|
.eq('id', 'smtp')
|
||||||
|
.maybeSingle();
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return NextResponse.json({ error: error.message }, { status: 500 });
|
console.error('Error fetching SMTP settings:', error);
|
||||||
|
return NextResponse.json({
|
||||||
|
settings: { host: '', port: 587, secure: false, user: '', pass: '' }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return NextResponse.json({
|
return NextResponse.json({
|
||||||
settings: data || { host: '', port: 587, secure: false, user: '', pass: '' }
|
settings: data || { host: '', port: 587, secure: false, user: '', pass: '' }
|
||||||
});
|
});
|
||||||
|
} catch (err: any) {
|
||||||
|
console.error('SMTP settings GET error:', err);
|
||||||
|
return NextResponse.json({
|
||||||
|
settings: { host: '', port: 587, secure: false, user: '', pass: '' }
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
const cookieStore = await cookies();
|
|
||||||
|
|
||||||
const supabaseUrl = process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL || '';
|
|
||||||
const supabase = createServerClient(
|
|
||||||
supabaseUrl,
|
|
||||||
process.env.SUPABASE_SERVICE_ROLE_KEY ?? '',
|
|
||||||
{
|
|
||||||
cookies: {
|
|
||||||
getAll() {
|
|
||||||
return cookieStore.getAll()
|
|
||||||
},
|
|
||||||
setAll(cookiesToSet) {
|
|
||||||
try {
|
try {
|
||||||
cookiesToSet.forEach(({ name, value, options }) =>
|
await verifyAdmin();
|
||||||
cookieStore.set(name, value, options)
|
} catch (err: any) {
|
||||||
)
|
return NextResponse.json({ error: err.message || 'Not authenticated' }, { status: 401 });
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
let client: any;
|
||||||
|
try {
|
||||||
|
client = createAdminClient();
|
||||||
} catch {
|
} catch {
|
||||||
// Kann in einer API-Route ignoriert werden, wenn nur gelesen wird
|
client = await createClient();
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
cookieOptions: {
|
|
||||||
name: "webshop-auth-token",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const { data: { user: authUser }, error: authError } = await supabase.auth.getUser();
|
|
||||||
if (authError || !authUser) {
|
|
||||||
return NextResponse.json({ error: 'Not authenticated' }, { status: 401 });
|
|
||||||
}
|
|
||||||
const { data: user } = await supabase.from('users').select('role').eq('id', authUser.id).single();
|
|
||||||
if (!user || user.role !== 'admin') {
|
|
||||||
return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = await request.json(); // expect {host, port, secure, user, pass}
|
const payload = await request.json();
|
||||||
const { error } = await supabase
|
const { error } = await client
|
||||||
.from('settings')
|
.from('settings')
|
||||||
.upsert({ id: 'smtp', ...payload });
|
.upsert({ id: 'smtp', ...payload });
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
console.error('Error saving SMTP settings:', error);
|
||||||
return NextResponse.json({ error: error.message }, { status: 500 });
|
return NextResponse.json({ error: error.message }, { status: 500 });
|
||||||
}
|
}
|
||||||
|
|
||||||
return NextResponse.json({ message: 'SMTP settings saved' });
|
return NextResponse.json({ message: 'SMTP settings saved' });
|
||||||
|
} catch (err: any) {
|
||||||
|
console.error('SMTP settings POST error:', err);
|
||||||
|
return NextResponse.json({ error: err.message || 'Fehler beim Speichern' }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user