Add web push notification system for user engagement and updates
Implement a web push notification system, including service worker integration, user subscription management, and an admin interface for sending broadcast messages. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: f585829f-898b-492f-82a5-11f4a76c87fb Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/ICRgny1 Replit-Helium-Checkpoint-Created: true
This commit is contained in:
+28
-1
@@ -1,4 +1,4 @@
|
||||
import { type Article, type InsertArticle, articles, articleViews } from "@shared/schema";
|
||||
import { type Article, type InsertArticle, articles, articleViews, type InsertPushSubscription, type PushSubscription, pushSubscriptions } from "@shared/schema";
|
||||
import { db } from "./db";
|
||||
import { eq, desc, sql, count, and } from "drizzle-orm";
|
||||
import crypto from "crypto";
|
||||
@@ -15,6 +15,10 @@ export interface IStorage {
|
||||
updateArticle(id: number, article: Partial<InsertArticle>): Promise<Article | undefined>;
|
||||
incrementViews(id: number, ip: string): Promise<boolean>;
|
||||
deleteArticle(id: number): Promise<void>;
|
||||
savePushSubscription(sub: InsertPushSubscription): Promise<PushSubscription>;
|
||||
deletePushSubscription(endpoint: string): Promise<void>;
|
||||
getAllPushSubscriptions(): Promise<PushSubscription[]>;
|
||||
getPushSubscriptionCount(): Promise<number>;
|
||||
}
|
||||
|
||||
export class DatabaseStorage implements IStorage {
|
||||
@@ -76,6 +80,29 @@ export class DatabaseStorage implements IStorage {
|
||||
async deleteArticle(id: number): Promise<void> {
|
||||
await db.delete(articles).where(eq(articles.id, id));
|
||||
}
|
||||
|
||||
async savePushSubscription(sub: InsertPushSubscription): Promise<PushSubscription> {
|
||||
const [existing] = await db.select().from(pushSubscriptions).where(eq(pushSubscriptions.endpoint, sub.endpoint)).limit(1);
|
||||
if (existing) {
|
||||
const [updated] = await db.update(pushSubscriptions).set(sub).where(eq(pushSubscriptions.endpoint, sub.endpoint)).returning();
|
||||
return updated;
|
||||
}
|
||||
const [created] = await db.insert(pushSubscriptions).values(sub).returning();
|
||||
return created;
|
||||
}
|
||||
|
||||
async deletePushSubscription(endpoint: string): Promise<void> {
|
||||
await db.delete(pushSubscriptions).where(eq(pushSubscriptions.endpoint, endpoint));
|
||||
}
|
||||
|
||||
async getAllPushSubscriptions(): Promise<PushSubscription[]> {
|
||||
return db.select().from(pushSubscriptions);
|
||||
}
|
||||
|
||||
async getPushSubscriptionCount(): Promise<number> {
|
||||
const [result] = await db.select({ count: count() }).from(pushSubscriptions);
|
||||
return result.count;
|
||||
}
|
||||
}
|
||||
|
||||
export const storage = new DatabaseStorage();
|
||||
|
||||
Reference in New Issue
Block a user