From 3c6acc9359c91838fca3529b3ca50b3c6b936f7f Mon Sep 17 00:00:00 2001 From: Sami Abuzakuk Date: Tue, 14 Oct 2025 20:23:21 +0200 Subject: [PATCH] Add unread indication to subscription cards --- .gitignore | 1 + backend/backend.py | 43 +++++++++++++++---- backend/get_notifications.py | 1 + backend/model.py | 5 ++- frontend/src/lib/api.ts | 3 +- frontend/src/routes/+layout.svelte | 1 - .../src/routes/notifications/+page.svelte | 5 ++- 7 files changed, 46 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 5971a14..3dc50ae 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__ *.db .envrc exec_folder/ +.env diff --git a/backend/backend.py b/backend/backend.py index 1534e1a..9d02a9b 100644 --- a/backend/backend.py +++ b/backend/backend.py @@ -52,15 +52,6 @@ def hello(): return {"message": "Welcome to the Project Monitor API"} -# Subscriptions API Endpoints -@app.get("/subscriptions") -def list_subscriptions(): - db = SessionLocal() - subscriptions = db.query(Subscription).all() - db.close() - return subscriptions - - class SubscriptionCreate(BaseModel): topic: str @@ -69,10 +60,33 @@ class SubscriptionResponse(BaseModel): id: int topic: str created_at: datetime + has_unread: bool model_config = {"from_attributes": True} +# Subscriptions API Endpoints +@app.get("/subscriptions", response_model=list[SubscriptionResponse]) +def list_subscriptions(): + db = SessionLocal() + subscriptions = db.query(Subscription).all() + + # TODO: find a better way to do this + for subscription in subscriptions: + not_viewed_count = ( + db.query(Notification) + .filter( + Notification.subscription_id == subscription.id, + ~Notification.viewed, + ) + .count() + ) + subscription.has_unread = not_viewed_count > 0 + + db.close() + return subscriptions + + @app.get("/subscriptions/{subscription_id}", response_model=SubscriptionResponse) def get_subscription(subscription_id: int): db = SessionLocal() @@ -82,6 +96,17 @@ def get_subscription(subscription_id: int): if not subscription: db.close() raise HTTPException(status_code=404, detail="Subscription not found") + + # checking if subscription has unread messages + subscription.has_unread = ( + db.query(Notification) + .filter( + Notification.subscription_id == subscription_id and not Notification.viewed + ) + .count() + > 0 + ) + db.close() return subscription diff --git a/backend/get_notifications.py b/backend/get_notifications.py index 0e2cb3c..271731a 100644 --- a/backend/get_notifications.py +++ b/backend/get_notifications.py @@ -18,6 +18,7 @@ def fetch_ntfy_notifications(base_url, subscriptions): notifications = [] for subscription in subscriptions: + print(f"Fetching notifications for {subscription.topic}") topic = subscription.topic last_message_id = subscription.last_message_id since_param = "all" if last_message_id is None else last_message_id diff --git a/backend/model.py b/backend/model.py index 188a648..38384f3 100644 --- a/backend/model.py +++ b/backend/model.py @@ -6,7 +6,10 @@ from sqlalchemy.sql.sqltypes import DateTime import os # Initialize the database -DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./project_monitor.db") +DATABASE_URL = os.getenv("DATABASE_URL") + +if not DATABASE_URL: + raise ValueError("DATABASE_URL environment variable is not set") # SQLAlchemy setup engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 89c873e..ede24b7 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -1,6 +1,6 @@ import { env } from '$env/dynamic/public'; -export const API_URL = env.PUBLIC_API_URL || 'http://localhost:8080'; +export const API_URL = env.PUBLIC_API_URL || 'http://localhost:8000'; /** * Type definitions for Subscriptions and Notifications @@ -9,6 +9,7 @@ export interface Subscription { id: number; topic: string; created_at: string; + has_unread: boolean; } export interface Notification { diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte index e53c3ee..4b5c479 100644 --- a/frontend/src/routes/+layout.svelte +++ b/frontend/src/routes/+layout.svelte @@ -41,7 +41,6 @@
Project Monitor