81 lines
2.3 KiB
TypeScript
81 lines
2.3 KiB
TypeScript
|
|
/**
|
||
|
|
* Push subscriptions repository.
|
||
|
|
*
|
||
|
|
* Persists browser push subscription endpoints and keys per user.
|
||
|
|
*/
|
||
|
|
|
||
|
|
import { getConnection } from '@/modules/database/connection.js';
|
||
|
|
|
||
|
|
type PushSubscriptionLookupRow = {
|
||
|
|
endpoint: string;
|
||
|
|
keys_p256dh: string;
|
||
|
|
keys_auth: string;
|
||
|
|
};
|
||
|
|
|
||
|
|
export const pushSubscriptionsDb = {
|
||
|
|
/** Upserts a push subscription endpoint for a user. */
|
||
|
|
createPushSubscription(
|
||
|
|
userId: number,
|
||
|
|
endpoint: string,
|
||
|
|
keysP256dh: string,
|
||
|
|
keysAuth: string
|
||
|
|
): void {
|
||
|
|
const db = getConnection();
|
||
|
|
db.prepare(
|
||
|
|
`INSERT INTO push_subscriptions (user_id, endpoint, keys_p256dh, keys_auth)
|
||
|
|
VALUES (?, ?, ?, ?)
|
||
|
|
ON CONFLICT(endpoint) DO UPDATE SET
|
||
|
|
user_id = excluded.user_id,
|
||
|
|
keys_p256dh = excluded.keys_p256dh,
|
||
|
|
keys_auth = excluded.keys_auth`
|
||
|
|
).run(userId, endpoint, keysP256dh, keysAuth);
|
||
|
|
},
|
||
|
|
|
||
|
|
/** Returns all subscriptions for a user. */
|
||
|
|
getPushSubscriptions(userId: number): PushSubscriptionLookupRow[] {
|
||
|
|
const db = getConnection();
|
||
|
|
return db
|
||
|
|
.prepare(
|
||
|
|
'SELECT endpoint, keys_p256dh, keys_auth FROM push_subscriptions WHERE user_id = ?'
|
||
|
|
)
|
||
|
|
.all(userId) as PushSubscriptionLookupRow[];
|
||
|
|
},
|
||
|
|
|
||
|
|
/** Deletes one subscription by endpoint. */
|
||
|
|
deletePushSubscription(endpoint: string): void {
|
||
|
|
const db = getConnection();
|
||
|
|
db.prepare('DELETE FROM push_subscriptions WHERE endpoint = ?').run(endpoint);
|
||
|
|
},
|
||
|
|
|
||
|
|
/** Deletes all subscriptions for a user. */
|
||
|
|
deletePushSubscriptionsForUser(userId: number): void {
|
||
|
|
const db = getConnection();
|
||
|
|
db.prepare('DELETE FROM push_subscriptions WHERE user_id = ?').run(userId);
|
||
|
|
},
|
||
|
|
|
||
|
|
// Legacy aliases used by existing services/routes
|
||
|
|
saveSubscription(
|
||
|
|
userId: number,
|
||
|
|
endpoint: string,
|
||
|
|
keysP256dh: string,
|
||
|
|
keysAuth: string
|
||
|
|
): void {
|
||
|
|
pushSubscriptionsDb.createPushSubscription(
|
||
|
|
userId,
|
||
|
|
endpoint,
|
||
|
|
keysP256dh,
|
||
|
|
keysAuth
|
||
|
|
);
|
||
|
|
},
|
||
|
|
getSubscriptions(userId: number): PushSubscriptionLookupRow[] {
|
||
|
|
return pushSubscriptionsDb.getPushSubscriptions(userId);
|
||
|
|
},
|
||
|
|
removeSubscription(endpoint: string): void {
|
||
|
|
pushSubscriptionsDb.deletePushSubscription(endpoint);
|
||
|
|
},
|
||
|
|
removeAllForUser(userId: number): void {
|
||
|
|
pushSubscriptionsDb.deletePushSubscriptionsForUser(userId);
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|