feature: nodemailer set
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import { db, applications } from '@workspace/db';
|
||||
import { db, applications, students } from '@workspace/db';
|
||||
import { eq } from '@workspace/db/drizzle';
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
import { sendEmail } from '@/lib/mailer';
|
||||
import { statusUpdateHtml, statusUpdateSubject, statusUpdateText } from '@/lib/mail-templates';
|
||||
|
||||
export async function PATCH(req: NextRequest, { params }: { params: Promise<{ applicationId: string }> }) {
|
||||
const { applicationId: applicationIdParam } = await params;
|
||||
@@ -9,18 +11,63 @@ export async function PATCH(req: NextRequest, { params }: { params: Promise<{ ap
|
||||
return NextResponse.json({ error: 'Invalid applicationId' }, { status: 400 });
|
||||
}
|
||||
|
||||
const { status } = await req.json();
|
||||
const { status, studentId, notify } = await req.json();
|
||||
if (!status) {
|
||||
return NextResponse.json({ error: 'Missing status' }, { status: 400 });
|
||||
}
|
||||
|
||||
const result = await db.update(applications)
|
||||
.set({ status })
|
||||
.where(eq(applications.id, applicationId));
|
||||
let result;
|
||||
try {
|
||||
result = await db
|
||||
.update(applications)
|
||||
.set({ status })
|
||||
.where(eq(applications.id, applicationId));
|
||||
} catch (e) {
|
||||
const message = e instanceof Error ? e.message : 'Unknown database error';
|
||||
return NextResponse.json({ error: 'Database update failed', detail: message }, { status: 500 });
|
||||
}
|
||||
|
||||
if (result.rowCount === 0) {
|
||||
if (!result || result.rowCount === 0) {
|
||||
return NextResponse.json({ error: 'Application not found' }, { status: 404 });
|
||||
}
|
||||
|
||||
return NextResponse.json({ success: true });
|
||||
const shouldNotify = notify === undefined ? true : Boolean(notify);
|
||||
let emailError: string | undefined;
|
||||
let notified = false;
|
||||
try {
|
||||
if (shouldNotify) {
|
||||
// studentId is provided by client components; if missing, try to infer
|
||||
let effectiveStudentId: number | null = Number.isFinite(Number(studentId)) && Number(studentId) > 0 ? Number(studentId) : null;
|
||||
if (!effectiveStudentId) {
|
||||
const app = await db.query.applications.findFirst({
|
||||
where: eq(applications.id, applicationId),
|
||||
columns: { studentId: true },
|
||||
});
|
||||
effectiveStudentId = app?.studentId ?? null;
|
||||
}
|
||||
|
||||
if (effectiveStudentId) {
|
||||
const student = await db.query.students.findFirst({
|
||||
where: eq(students.id, effectiveStudentId),
|
||||
columns: { email: true, firstName: true, lastName: true },
|
||||
});
|
||||
|
||||
if (student?.email) {
|
||||
const name = `${student.firstName ?? ''} ${student.lastName ?? ''}`.trim() || 'Student';
|
||||
await sendEmail({
|
||||
to: student.email,
|
||||
subject: statusUpdateSubject(status),
|
||||
text: statusUpdateText(name, status),
|
||||
html: statusUpdateHtml(name, status),
|
||||
});
|
||||
notified = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
emailError = err instanceof Error ? err.message : 'Unknown email error';
|
||||
console.error('Failed to send status update email', { applicationId, status, error: emailError });
|
||||
}
|
||||
|
||||
return NextResponse.json({ success: true, emailError: emailError ?? null, notified });
|
||||
}
|
||||
Reference in New Issue
Block a user