"use node";
import { v } from "convex/values";
import { mutation } from "./_generated/server";
import { nanoid } from "nanoid";
import { Resend } from "resend";
import { VerificationEmail } from "../emails/verification-email";
import { ConfirmationEmail } from "../emails/confirmation-email";
import { TeamNotificationEmail } from "../emails/team-notification-email";
const TOKEN_EXPIRY = 5 * 60 * 1000; // 5 dakika
export const submitApplication = mutation({
args: {
email: v.string(),
name: v.string(),
experience: v.string(),
whyYou: v.string(),
resendApiKey: v.string(),
websiteUrl: v.string(),
},
handler: async (ctx, args) => {
const now = Date.now();
const verificationToken = nanoid(32);
const tokenExpiry = now + TOKEN_EXPIRY;
// Başvuruyu kaydet
const applicationId = await ctx.db.insert("testerApplications", {
email: args.email,
name: args.name,
experience: args.experience,
whyYou: args.whyYou,
status: "pending",
verificationToken,
tokenExpiry,
createdAt: now,
lastAttempt: now,
});
// Resend client'ı oluştur
const resend = new Resend(args.resendApiKey);
const verificationUrl = `${args.websiteUrl}/verify?token=${verificationToken}`;
// Doğrulama emaili gönder
await resend.emails.send({
to: [args.email],
subject: "Email Adresinizi Doğrulayın",
react: VerificationEmail({ name: args.name, verificationUrl }),
});
return { success: true, applicationId };
},
});
export const verifyApplication = mutation({
args: {
token: v.string(),
resendApiKey: v.string(),
},
handler: async (ctx, args) => {
const now = Date.now();
const application = await ctx.db
.query("testerApplications")
.filter((q) => q.eq(q.field("verificationToken"), args.token))
.first();
if (!application) {
throw new Error("Geçersiz doğrulama kodu");
}
if (application.tokenExpiry < now) {
await ctx.db.patch(application._id, { status: "expired" });
throw new Error("Doğrulama kodunun süresi dolmuş");
}
if (application.status !== "pending") {
throw new Error("Başvuru doğrulama beklemede değil");
}
// Başvuruyu onayla
await ctx.db.patch(application._id, { status: "verified" });
// Resend client'ı oluştur
const resend = new Resend(args.resendApiKey);
// Onay emaili gönder
await resend.emails.send({
to: application.email,
subject: "Lamron Studio Test Ekibine Hoş Geldiniz!",
react: ConfirmationEmail({ name: application.name, email: application.email }),
});
// Yöneticiye bildirim emaili gönder
await resend.emails.send({
subject: `Yeni Test Ekibi Başvurusu: ${application.name}`,
react: TeamNotificationEmail({
name: application.name,
email: application.email,
experience: application.experience,
whyYou: application.whyYou
}),
});
return { success: true };
},
});