231 lines
5.7 KiB
TypeScript
231 lines
5.7 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { prisma } from '@/lib/db'
|
|
import { verifyAdminAuth } from '@/lib/admin-auth'
|
|
import { mailgunService } from '@/lib/mailgun'
|
|
|
|
export const runtime = 'nodejs'
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const adminUser = await verifyAdminAuth(request)
|
|
if (!adminUser) {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
|
|
}
|
|
|
|
const settings = await prisma.mailgunSettings.findFirst({
|
|
orderBy: { updatedAt: 'desc' },
|
|
select: {
|
|
id: true,
|
|
domain: true,
|
|
region: true,
|
|
fromEmail: true,
|
|
fromName: true,
|
|
replyToEmail: true,
|
|
isEnabled: true,
|
|
testMode: true,
|
|
webhookUrl: true,
|
|
createdAt: true,
|
|
updatedAt: true,
|
|
// Don't return the API key for security
|
|
apiKey: false
|
|
}
|
|
})
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
data: settings
|
|
})
|
|
} catch (error) {
|
|
console.error('Error fetching Mailgun settings:', error)
|
|
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
|
|
}
|
|
}
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const adminUser = await verifyAdminAuth(request)
|
|
if (!adminUser) {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
|
|
}
|
|
|
|
const body = await request.json()
|
|
const {
|
|
apiKey,
|
|
domain,
|
|
region = 'US',
|
|
fromEmail,
|
|
fromName,
|
|
replyToEmail,
|
|
isEnabled = false,
|
|
testMode = true,
|
|
webhookUrl
|
|
} = body
|
|
|
|
// Validate required fields
|
|
if (!apiKey || !domain || !fromEmail || !fromName) {
|
|
return NextResponse.json({
|
|
error: 'API key, domain, from email, and from name are required'
|
|
}, { status: 400 })
|
|
}
|
|
|
|
// Validate email format
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
if (!emailRegex.test(fromEmail)) {
|
|
return NextResponse.json({
|
|
error: 'Invalid from email format'
|
|
}, { status: 400 })
|
|
}
|
|
|
|
if (replyToEmail && !emailRegex.test(replyToEmail)) {
|
|
return NextResponse.json({
|
|
error: 'Invalid reply-to email format'
|
|
}, { status: 400 })
|
|
}
|
|
|
|
// Disable existing settings
|
|
await prisma.mailgunSettings.updateMany({
|
|
data: { isEnabled: false }
|
|
})
|
|
|
|
// Create new settings
|
|
const settings = await prisma.mailgunSettings.create({
|
|
data: {
|
|
apiKey,
|
|
domain,
|
|
region,
|
|
fromEmail,
|
|
fromName,
|
|
replyToEmail,
|
|
isEnabled,
|
|
testMode,
|
|
webhookUrl,
|
|
updatedBy: adminUser.id
|
|
}
|
|
})
|
|
|
|
// Clear service cache
|
|
mailgunService.clearCache()
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
data: {
|
|
id: settings.id,
|
|
domain: settings.domain,
|
|
region: settings.region,
|
|
fromEmail: settings.fromEmail,
|
|
fromName: settings.fromName,
|
|
replyToEmail: settings.replyToEmail,
|
|
isEnabled: settings.isEnabled,
|
|
testMode: settings.testMode,
|
|
webhookUrl: settings.webhookUrl,
|
|
createdAt: settings.createdAt,
|
|
updatedAt: settings.updatedAt
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error('Error creating Mailgun settings:', error)
|
|
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
|
|
}
|
|
}
|
|
|
|
export async function PUT(request: NextRequest) {
|
|
try {
|
|
const adminUser = await verifyAdminAuth(request)
|
|
if (!adminUser) {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
|
|
}
|
|
|
|
const body = await request.json()
|
|
const {
|
|
id,
|
|
apiKey,
|
|
domain,
|
|
region,
|
|
fromEmail,
|
|
fromName,
|
|
replyToEmail,
|
|
isEnabled,
|
|
testMode,
|
|
webhookUrl
|
|
} = body
|
|
|
|
if (!id) {
|
|
return NextResponse.json({ error: 'Settings ID is required' }, { status: 400 })
|
|
}
|
|
|
|
// Validate required fields
|
|
if (!domain || !fromEmail || !fromName) {
|
|
return NextResponse.json({
|
|
error: 'Domain, from email, and from name are required'
|
|
}, { status: 400 })
|
|
}
|
|
|
|
// Validate email format
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
if (!emailRegex.test(fromEmail)) {
|
|
return NextResponse.json({
|
|
error: 'Invalid from email format'
|
|
}, { status: 400 })
|
|
}
|
|
|
|
if (replyToEmail && !emailRegex.test(replyToEmail)) {
|
|
return NextResponse.json({
|
|
error: 'Invalid reply-to email format'
|
|
}, { status: 400 })
|
|
}
|
|
|
|
// If enabling this setting, disable others
|
|
if (isEnabled) {
|
|
await prisma.mailgunSettings.updateMany({
|
|
where: { id: { not: id } },
|
|
data: { isEnabled: false }
|
|
})
|
|
}
|
|
|
|
// Build update data
|
|
const updateData: any = {
|
|
domain,
|
|
region,
|
|
fromEmail,
|
|
fromName,
|
|
replyToEmail,
|
|
isEnabled,
|
|
testMode,
|
|
webhookUrl,
|
|
updatedBy: adminUser.id
|
|
}
|
|
|
|
// Only update API key if provided
|
|
if (apiKey) {
|
|
updateData.apiKey = apiKey
|
|
}
|
|
|
|
const settings = await prisma.mailgunSettings.update({
|
|
where: { id },
|
|
data: updateData
|
|
})
|
|
|
|
// Clear service cache
|
|
mailgunService.clearCache()
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
data: {
|
|
id: settings.id,
|
|
domain: settings.domain,
|
|
region: settings.region,
|
|
fromEmail: settings.fromEmail,
|
|
fromName: settings.fromName,
|
|
replyToEmail: settings.replyToEmail,
|
|
isEnabled: settings.isEnabled,
|
|
testMode: settings.testMode,
|
|
webhookUrl: settings.webhookUrl,
|
|
createdAt: settings.createdAt,
|
|
updatedAt: settings.updatedAt
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error('Error updating Mailgun settings:', error)
|
|
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
|
|
}
|
|
} |