Fixed some routes.
This commit is contained in:
parent
081d66695c
commit
bdee3e844f
@ -1,23 +1,25 @@
|
|||||||
# services/forum.py
|
# services/forum.py
|
||||||
from snek.system.service import BaseService
|
from snek.system.service import BaseService
|
||||||
import re
|
import re
|
||||||
|
import uuid
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from typing import Any, Awaitable, Callable, Dict, List
|
from typing import Any, Awaitable, Callable, Dict, List
|
||||||
|
|
||||||
EventListener = Callable[[str, Any], Awaitable[None]] | Callable[[str, Any], None]
|
EventListener = Callable[[str, Any], Awaitable[None]] | Callable[[str, Any], None]
|
||||||
|
|
||||||
|
|
||||||
class BaseForumService(BaseService):
|
class BaseForumService(BaseService):
|
||||||
"""
|
"""
|
||||||
Base mix-in that gives a service `add_notification_listener`
|
Base mix-in that gives a service `add_notification_listener`,
|
||||||
and an internal `_dispatch_event` helper.
|
an internal `_dispatch_event` helper, and a public `notify` method.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self,*args, **kwargs) -> None:
|
def generate_uid(self):
|
||||||
|
return str(uuid.uuid4())
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs) -> None:
|
||||||
# Map event name -> list of listener callables
|
# Map event name -> list of listener callables
|
||||||
self._listeners: Dict[str, List[EventListener]] = defaultdict(list)
|
self._listeners: Dict[str, List[EventListener]] = defaultdict(list)
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
def add_notification_listener(
|
def add_notification_listener(
|
||||||
self, event_name: str, listener: EventListener
|
self, event_name: str, listener: EventListener
|
||||||
) -> None:
|
) -> None:
|
||||||
@ -36,11 +38,6 @@ class BaseForumService(BaseService):
|
|||||||
|
|
||||||
self._listeners[event_name].append(listener)
|
self._listeners[event_name].append(listener)
|
||||||
|
|
||||||
# -----------------------------------------------------------------
|
|
||||||
# The piece below is optional but makes the service fully usable.
|
|
||||||
# Call `_dispatch_event` whenever the service actually performs an
|
|
||||||
# action that should notify listeners.
|
|
||||||
# -----------------------------------------------------------------
|
|
||||||
async def _dispatch_event(self, event_name: str, data: Any) -> None:
|
async def _dispatch_event(self, event_name: str, data: Any) -> None:
|
||||||
"""Invoke every listener for the given event."""
|
"""Invoke every listener for the given event."""
|
||||||
for listener in self._listeners.get(event_name, []):
|
for listener in self._listeners.get(event_name, []):
|
||||||
@ -49,7 +46,18 @@ class BaseForumService(BaseService):
|
|||||||
else: # plain sync function
|
else: # plain sync function
|
||||||
listener(event_name, data)
|
listener(event_name, data)
|
||||||
|
|
||||||
|
async def notify(self, event_name: str, data: Any) -> None:
|
||||||
|
"""
|
||||||
|
Public method to trigger notification to all listeners of an event.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
event_name : str
|
||||||
|
The name of the event to notify listeners about.
|
||||||
|
data : Any
|
||||||
|
The data to pass to the listeners.
|
||||||
|
"""
|
||||||
|
await self._dispatch_event(event_name, data)
|
||||||
|
|
||||||
|
|
||||||
class ForumService(BaseForumService):
|
class ForumService(BaseForumService):
|
||||||
@ -60,7 +68,7 @@ class ForumService(BaseForumService):
|
|||||||
slug = self.generate_slug(name)
|
slug = self.generate_slug(name)
|
||||||
|
|
||||||
# Check if slug exists
|
# Check if slug exists
|
||||||
existing = await self.find_one(slug=slug)
|
existing = await self.get(slug=slug)
|
||||||
if existing:
|
if existing:
|
||||||
slug = f"{slug}-{self.generate_uid()[:8]}"
|
slug = f"{slug}-{self.generate_uid()[:8]}"
|
||||||
|
|
||||||
@ -105,7 +113,7 @@ class ThreadService(BaseForumService):
|
|||||||
slug = self.services.forum.generate_slug(title)
|
slug = self.services.forum.generate_slug(title)
|
||||||
|
|
||||||
# Check if slug exists in this forum
|
# Check if slug exists in this forum
|
||||||
existing = await self.find_one(forum_uid=forum_uid, slug=slug)
|
existing = await self.get(forum_uid=forum_uid, slug=slug)
|
||||||
if existing:
|
if existing:
|
||||||
slug = f"{slug}-{self.generate_uid()[:8]}"
|
slug = f"{slug}-{self.generate_uid()[:8]}"
|
||||||
|
|
||||||
@ -255,7 +263,7 @@ class PostLikeService(BaseForumService):
|
|||||||
|
|
||||||
async def toggle_like(self, post_uid, user_uid):
|
async def toggle_like(self, post_uid, user_uid):
|
||||||
# Check if already liked
|
# Check if already liked
|
||||||
existing = await self.find_one(post_uid=post_uid, user_uid=user_uid)
|
existing = await self.get(post_uid=post_uid, user_uid=user_uid)
|
||||||
|
|
||||||
if existing:
|
if existing:
|
||||||
# Unlike
|
# Unlike
|
||||||
|
@ -439,12 +439,12 @@ class ForumView(BaseView):
|
|||||||
class ForumWebSocketView(BaseView):
|
class ForumWebSocketView(BaseView):
|
||||||
"""WebSocket view for real-time forum updates"""
|
"""WebSocket view for real-time forum updates"""
|
||||||
|
|
||||||
async def websocket_handler(self):
|
async def get(self):
|
||||||
ws = web.WebSocketResponse()
|
ws = web.WebSocketResponse()
|
||||||
await ws.prepare(self.request)
|
await ws.prepare(self.request)
|
||||||
|
|
||||||
# Store WebSocket connection
|
# Store WebSocket connection
|
||||||
ws_id = self.services.generate_uid()
|
ws_id = self.services.forum.generate_uid()
|
||||||
if not hasattr(self.app, 'forum_websockets'):
|
if not hasattr(self.app, 'forum_websockets'):
|
||||||
self.app.forum_websockets = {}
|
self.app.forum_websockets = {}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user