From 2f113b3b0f74a86ee2eadbf5a1328ee6e339479e Mon Sep 17 00:00:00 2001 From: bender Date: Fri, 6 Mar 2026 08:25:00 +0000 Subject: [PATCH] Switch to version 11: modified src/app/api/waitlist/route.ts --- src/app/api/waitlist/route.ts | 108 +++++++++++----------------------- 1 file changed, 35 insertions(+), 73 deletions(-) diff --git a/src/app/api/waitlist/route.ts b/src/app/api/waitlist/route.ts index 20d69e4..fd22071 100644 --- a/src/app/api/waitlist/route.ts +++ b/src/app/api/waitlist/route.ts @@ -1,5 +1,4 @@ import { NextRequest, NextResponse } from 'next/server'; -import nodemailer from 'nodemailer'; interface WaitlistEntry { email: string; @@ -8,16 +7,8 @@ interface WaitlistEntry { createdAt: string; } -const transporter = nodemailer.createTransport({ - host: process.env.SMTP_HOST || 'smtp.gmail.com', - port: parseInt(process.env.SMTP_PORT || '587'), - secure: process.env.SMTP_SECURE === 'true', - auth: { - user: process.env.SMTP_USER, - pass: process.env.SMTP_PASSWORD, - }, -}); - +// In-memory storage for demonstration +// In production, replace with actual database (MongoDB, PostgreSQL, etc.) const waitlistEntries: WaitlistEntry[] = []; export async function POST(request: NextRequest) { @@ -26,17 +17,17 @@ export async function POST(request: NextRequest) { const { email, instagram, tiktok } = body; // Validate email - if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { + if (!email || typeof email !== 'string' || !email.includes('@')) { return NextResponse.json( - { error: 'Invalid email address' }, + { error: 'Valid email is required' }, { status: 400 } ); } - // Check if email already exists + // Check for duplicate email if (waitlistEntries.some(entry => entry.email === email)) { return NextResponse.json( - { error: 'Email already on waitlist' }, + { error: 'Email already registered' }, { status: 409 } ); } @@ -46,79 +37,50 @@ export async function POST(request: NextRequest) { email, instagram: instagram || undefined, tiktok: tiktok || undefined, - createdAt: new Date().toISOString(), + createdAt: new Date().toISOString() }; + // Add to in-memory storage waitlistEntries.push(entry); - // Send confirmation email to user - const userEmailHtml = ` -
-

Welcome to Clearance Waitlist!

-

Hi ${email.split('@')[0]},

-

Thank you for joining the Clearance waitlist! We're excited to have you on board.

-

We'll be reaching out soon with early access to our platform. In the meantime, here's what you can expect:

- -

If you have any questions, feel free to reply to this email.

-

Best regards,
The Clearance Team

-
- `; + // TODO: In production, save to database here + // Example for MongoDB: + // await db.collection('waitlist').insertOne(entry); + + // TODO: Send confirmation email + // Example: + // await sendEmail({ + // to: email, + // subject: 'Welcome to Clearance Waitlist', + // template: 'waitlist-confirmation' + // }); - try { - await transporter.sendMail({ - from: process.env.SMTP_FROM || process.env.SMTP_USER, - to: email, - subject: 'Welcome to Clearance Waitlist - Early Access Confirmed', - html: userEmailHtml, - }); - } catch (emailError) { - console.error('Error sending confirmation email:', emailError); - // Continue even if email fails - user still added to waitlist - } - - // Send notification email to admin - const adminEmailHtml = ` -
-

New Waitlist Submission

-

Email: ${email}

-

Instagram: ${instagram || 'Not provided'}

-

TikTok: ${tiktok || 'Not provided'}

-

Submitted: ${new Date().toLocaleString()}

-
- `; - - try { - await transporter.sendMail({ - from: process.env.SMTP_FROM || process.env.SMTP_USER, - to: process.env.ADMIN_EMAIL || process.env.SMTP_USER, - subject: `New Clearance Waitlist Submission: ${email}`, - html: adminEmailHtml, - }); - } catch (emailError) { - console.error('Error sending admin notification:', emailError); - // Continue even if email fails - } + console.log('Waitlist entry created:', entry); return NextResponse.json( - { success: true, message: 'Successfully joined waitlist', entry }, + { + success: true, + message: 'Successfully joined the waitlist', + data: entry + }, { status: 201 } ); } catch (error) { - console.error('Waitlist submission error:', error); + console.error('Waitlist API error:', error); return NextResponse.json( - { error: 'Failed to process submission' }, + { error: 'Internal server error' }, { status: 500 } ); } } export async function GET() { - return NextResponse.json({ - count: waitlistEntries.length, - entries: waitlistEntries, - }); + // Optional: Get all waitlist entries (add authentication in production) + return NextResponse.json( + { + count: waitlistEntries.length, + entries: waitlistEntries + }, + { status: 200 } + ); }