mailship/src/actions.ts
Agent 21e7058862 Initial mailship fork from anchor
Fork anchor, strip all push notification code (APNs, FCM, WebPush),
rename from anchor to mailship, add new database schema for
subscriptions + events tables, and add HTTP API for email
notification registration and NIP-9a relay push callbacks.

- POST /subscription/email — register for email digests
- DELETE /subscription/:key — unsubscribe
- POST /notify/:id — NIP-9a relay push callback
- GET /confirm?token=... — confirm email
- GET /unsubscribe?token=... — unsubscribe

Co-authored-by: mplorentz
2026-08-18 12:21:22 -04:00

63 lines
No EOL
1.5 KiB
TypeScript

import { instrument } from 'succinct-async'
import type { Subscription } from './alert.js'
import { getCronExpression } from './alert.js'
import * as mailer from './mailer.js'
import * as worker from './worker/index.js'
import * as db from './database.js'
export class ActionError extends Error {
toString() {
return this.message
}
}
export type RegisterSubscriptionParams = {
pubkey: string
email: string
frequency: string
}
export const registerSubscription = instrument(
'actions.registerSubscription',
async ({ pubkey, email, frequency }: RegisterSubscriptionParams) => {
const sub = await db.insertSubscription(pubkey, email, frequency)
const callback = `${process.env.BASE_URL}/notify/${sub.id}`
// Send confirmation email
await mailer.sendConfirm(sub)
return { key: sub.key, callback }
},
)
export type ConfirmSubscriptionParams = {
token: string
}
export const confirmSubscriptionAction = instrument(
'actions.confirmSubscription',
async ({ token }: ConfirmSubscriptionParams) => {
const sub = await db.confirmSubscription(token)
if (!sub) {
throw new ActionError('That confirmation code is invalid or has expired.')
}
worker.registerSubscription(sub)
},
)
export type UnsubscribeParams = {
token: string
}
export const unsubscribeAction = instrument(
'actions.unsubscribe',
async ({ token }: UnsubscribeParams) => {
const sub = await db.unsubscribeSubscription(token)
if (sub) {
worker.unregisterSubscription(sub)
}
},
)