sendEmailVerificationCode.ts 1.3 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/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.app.base_url}/auth/verify-email`
  19. }),
  20. {
  21. to: email,
  22. from: config.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. await db
  32. .delete(emailVerificationCodes)
  33. .where(eq(emailVerificationCodes.userId, userId));
  34. const code = generateRandomString(8, alphabet("0-9"));
  35. await db.insert(emailVerificationCodes).values({
  36. userId,
  37. email,
  38. code,
  39. expiresAt: createDate(new TimeSpan(15, "m")).getTime()
  40. });
  41. return code;
  42. }