Tweaking a bit to structure subscriptions
This commit is contained in:
58
src/db.ts
Normal file
58
src/db.ts
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import { Database } from 'sqlite3';
|
||||||
|
|
||||||
|
export class DBService {
|
||||||
|
private db: Database;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.db = new Database('subscriptions.db', (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error("Failed to connect to the database:", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("Connected to SQLite database");
|
||||||
|
this.createTable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private createTable() {
|
||||||
|
const createSubscriptionsTableSQL = `
|
||||||
|
CREATE TABLE IF NOT EXISTS subscriptions (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
endpoint TEXT NOT NULL,
|
||||||
|
keys_p256dh TEXT NOT NULL,
|
||||||
|
keys_auth TEXT NOT NULL
|
||||||
|
);
|
||||||
|
`;
|
||||||
|
|
||||||
|
this.db.run(createSubscriptionsTableSQL, (err) => {
|
||||||
|
if (err) throw err;
|
||||||
|
console.log("Subscriptions table ready");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
saveSubscription(endpoint: string, keys_p256dh: string, keys_auth: string) {
|
||||||
|
return new Promise<void>((resolve, reject) => {
|
||||||
|
const insertSQL = `INSERT INTO subscriptions (endpoint, keys_p256dh, keys_auth) VALUES (?, ?, ?)`;
|
||||||
|
this.db.run(insertSQL, [endpoint, keys_p256dh, keys_auth], function(err) {
|
||||||
|
if (err) {
|
||||||
|
reject(new Error(`Failed to insert subscription: ${err.message}`));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getSubscriptions(): Promise<Array<any>> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const selectSQL = `SELECT * FROM subscriptions`;
|
||||||
|
this.db.all(selectSQL, [], (err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
reject(new Error(`Failed to retrieve subscriptions: ${err.message}`));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(rows);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +1,22 @@
|
|||||||
import express from 'express';
|
import express from 'express';
|
||||||
import { saveSubscription, getSubscriptions } from './subscriptions.js';
|
import { SubscriptionService } from './subscriptionService.js';
|
||||||
import { WebPushService } from './webpush.js';
|
import { WebPushService } from './webpush.js';
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
router.post('/subscribe', (req, res) => {
|
router.post('/subscribe', async (req, res) => {
|
||||||
const subscription = req.body;
|
const subscription = req.body;
|
||||||
saveSubscription(subscription);
|
const subscriptionService = new SubscriptionService();
|
||||||
|
await subscriptionService.addSubscription(subscription);
|
||||||
res.status(201).send();
|
res.status(201).send();
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post('/sendNotification', (_, res) => {
|
router.post('/sendNotification', async (_, res) => {
|
||||||
const webPush = new WebPushService();
|
const webPush = new WebPushService();
|
||||||
const subscriptions = getSubscriptions();
|
|
||||||
|
const subscriptionService = new SubscriptionService();
|
||||||
|
const subscriptions = await subscriptionService.fetchSubscriptions();
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
title: "Notification Title",
|
title: "Notification Title",
|
||||||
message: "This is a message from your web push server"
|
message: "This is a message from your web push server"
|
||||||
|
|||||||
29
src/subscriptionService.ts
Normal file
29
src/subscriptionService.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { DBService } from './db.js';
|
||||||
|
|
||||||
|
export interface Subscription {
|
||||||
|
endpoint: string;
|
||||||
|
keys: {
|
||||||
|
p256dh: string;
|
||||||
|
auth: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SubscriptionService {
|
||||||
|
private dbService: DBService;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.dbService = new DBService();
|
||||||
|
}
|
||||||
|
|
||||||
|
async addSubscription(subscription: Subscription): Promise<void> {
|
||||||
|
await this.dbService.saveSubscription(
|
||||||
|
subscription.endpoint,
|
||||||
|
subscription.keys.p256dh,
|
||||||
|
subscription.keys.auth
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fetchSubscriptions(): Promise<Subscription[]> {
|
||||||
|
return this.dbService.getSubscriptions();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
export type Subscription = {
|
|
||||||
endpoint: string;
|
|
||||||
keys: {
|
|
||||||
p256dh: string;
|
|
||||||
auth: string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
let subscriptions: Subscription[] = [];
|
|
||||||
|
|
||||||
export function saveSubscription(sub: Subscription) {
|
|
||||||
subscriptions.push(sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getSubscriptions(): Subscription[] {
|
|
||||||
return subscriptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as http_ece from 'http_ece';
|
import * as http_ece from 'http_ece';
|
||||||
import { Subscription } from './subscriptions.js';
|
import { Subscription } from './subscriptionService.js';
|
||||||
import * as jwt from 'jsonwebtoken';
|
import * as jwt from 'jsonwebtoken';
|
||||||
import * as https from 'https';
|
import * as https from 'https';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user