atalay
atalay
Explore posts from servers
CCConvex Community
Created by atalay on 2/18/2025 in #support-community
Using Resend with Convex getting error
"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({
from: "Lamron Studio <[email protected]>",
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({
from: "Lamron Studio <[email protected]>",
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({
from: "Lamron Studio <[email protected]>",
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 };
},
});
"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({
from: "Lamron Studio <[email protected]>",
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({
from: "Lamron Studio <[email protected]>",
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({
from: "Lamron Studio <[email protected]>",
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 };
},
});
I'm getting this error: [CONVEX M(testerApplications:submitApplication)] [Request ID: 9839abbfc75c3f95] Server Error Uncaught Error: Failed to render React component. Make sure to install @react-email/render at throw [as throw] (<anonymous>) I'm adding to my next.config.ts this: serverExternalPackages: [ '@react-email/components', '@react-email/render', '@react-email/tailwind', ], but not helped me... Can you help me guys? Does convex structure allow tsx components?
2 replies
AAdmincraft
Created by atalay on 7/14/2023 in #questions
Bluemap Plugin
Hello guys I'm trying to bluemap rendering I just wondering how can disable 3D render so it's just render 2D textures.
7 replies
AAdmincraft
Created by atalay on 7/12/2023 in #questions
Dynmap not full rendering
No description
67 replies
AAdmincraft
Created by atalay on 7/9/2023 in #questions
Low CPU usge
No description
8 replies