feat(cloud): email unsubscribe (#258)

* feat(cloud): add email unsubscribe

* chore: add translations
This commit is contained in:
Henry
2025-11-27 21:44:51 +00:00
committed by GitHub
parent 56e4c43cfa
commit c5d85cdb2d
27 changed files with 769 additions and 653 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)}`;
}