sendEmailVerificationCode.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { TimeSpan, createDate } from "oslo";
  2. import { generateRandomString, alphabet } from "oslo/crypto";
  3. import db from "@server/db";
  4. import { users, emailVerificationCodes } from "@server/db/schema";
  5. import { eq } from "drizzle-orm";
  6. import { sendEmail } from "@server/emails";
  7. import config from "@server/lib/config";
  8. import { VerifyEmail } from "@server/emails/templates/VerifyEmailCode";
  9. export async function sendEmailVerificationCode(
  10. email: string,
  11. userId: string
  12. ): Promise<void> {
  13. const code = await generateEmailVerificationCode(userId, email);
  14. await sendEmail(
  15. VerifyEmail({
  16. username: email,
  17. verificationCode: code,
  18. verifyLink: `${config.getRawConfig().app.dashboard_url}/auth/verify-email`
  19. }),
  20. {
  21. to: email,
  22. from: config.getRawConfig().email?.no_reply,
  23. subject: "Verify your email address"
  24. }
  25. );
  26. }
  27. async function generateEmailVerificationCode(
  28. userId: string,
  29. email: string
  30. ): Promise<string> {
  31. const code = generateRandomString(8, alphabet("0-9"));
  32. await db.transaction(async (trx) => {
  33. await trx
  34. .delete(emailVerificationCodes)
  35. .where(eq(emailVerificationCodes.userId, userId));
  36. await trx.insert(emailVerificationCodes).values({
  37. userId,
  38. email,
  39. code,
  40. expiresAt: createDate(new TimeSpan(15, "m")).getTime()
  41. });
  42. });
  43. return code;
  44. }