feat(cloud): add email unsubscribe

This commit is contained in:
Henry
2025-11-27 21:40:03 +00:00
parent 56e4c43cfa
commit eb3288336f
10 changed files with 275 additions and 1 deletions

View File

@@ -0,0 +1,31 @@
import { SignJWT } from "jose";
const encoder = new TextEncoder();
/**
* Creates a longlived unsubscribe link for a given user/subscriber.
*
* `${NEXT_PUBLIC_BASE_URL}/unsubscribe?token=<jwt>`
*
* The JWT payload only contains the subscriberId. There is no expiry
* on purpose unsubscribe links should remain valid indefinitely.
*
*/
export async function createEmailUnsubscribeLink(
userId: string,
): Promise<string | null> {
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL;
const secret = process.env.EMAIL_UNSUBSCRIBE_SECRET;
if (!baseUrl || !secret) {
// Environment not configured for unsubscribe links.
return null;
}
const token = await new SignJWT({ subscriberId: userId })
.setProtectedHeader({ alg: "HS256" })
// No expiration on purpose; unsubscribe links are longlived.
.sign(encoder.encode(secret));
return `${baseUrl}/unsubscribe?token=${encodeURIComponent(token)}`;
}

View File

@@ -1,3 +1,4 @@
export * from "./generateUID";
export * from "./generateSlug";
export * from "./subscriptions";
export * from "./email";