Initial commit: VKUS vitrina MVP (frontend + backend).
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from app.models import NotificationItem
|
||||
|
||||
|
||||
class NotificationStore:
|
||||
def __init__(self) -> None:
|
||||
self._items: list[NotificationItem] = []
|
||||
|
||||
def list_all(self) -> list[NotificationItem]:
|
||||
return sorted(self._items, key=lambda n: n.created_at, reverse=True)
|
||||
|
||||
def unread_count(self) -> int:
|
||||
return sum(1 for item in self._items if not item.read)
|
||||
|
||||
def add(self, title: str, text: str, link_tab: str | None = None) -> NotificationItem:
|
||||
item = NotificationItem(
|
||||
id=f"ntf-{int(datetime.now(timezone.utc).timestamp() * 1000)}",
|
||||
title=title,
|
||||
text=text,
|
||||
created_at=datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S"),
|
||||
read=False,
|
||||
link_tab=link_tab, # type: ignore[arg-type]
|
||||
)
|
||||
self._items.insert(0, item)
|
||||
return item
|
||||
|
||||
def mark_read(self, notification_id: str) -> bool:
|
||||
for item in self._items:
|
||||
if item.id == notification_id:
|
||||
item.read = True
|
||||
return True
|
||||
return False
|
||||
|
||||
def mark_all_read(self) -> int:
|
||||
count = 0
|
||||
for item in self._items:
|
||||
if not item.read:
|
||||
item.read = True
|
||||
count += 1
|
||||
return count
|
||||
|
||||
|
||||
notification_store = NotificationStore()
|
||||
Reference in New Issue
Block a user