diff --git a/src/snek/service/notification.py b/src/snek/service/notification.py index 3815c60..27c65f4 100644 --- a/src/snek/service/notification.py +++ b/src/snek/service/notification.py @@ -1,9 +1,17 @@ from snek.system.service import BaseService - +from snek.system.model import now class NotificationService(BaseService): mapper_name = "notification" + async def mark_as_read(self, user_uid, channel_message_uid): + model = await self.get(user_uid, object_uid=channel_message_uid) + model['read_at'] = now() + await self.save(model) + + async def get_unread_stats(self,user_uid): + records = await self.query("SELECT object_type, COUNT(*) as count FROM notification WHERE user_uid=:user_uid AND read_at IS NULL GROUP BY object_type",dict(user_uid=user_uid)) + async def create(self, object_uid, object_type, user_uid, message): model = await self.new() model["object_uid"] = object_uid diff --git a/src/snek/view/rpc.py b/src/snek/view/rpc.py index d98e53b..c197f24 100644 --- a/src/snek/view/rpc.py +++ b/src/snek/view/rpc.py @@ -39,6 +39,11 @@ class RPCView(BaseView): def is_logged_in(self): return self.view.session.get("logged_in", False) + async def mark_as_read(self, message_uid): + self._require_login() + await self.services.notification.mark_as_read(self.user_uid, message_uid) + return True + async def login(self, username, password): success = await self.services.user.validate_login(username, password) if not success: diff --git a/src/snek/view/web.py b/src/snek/view/web.py index 5a3b264..8fd5ddc 100644 --- a/src/snek/view/web.py +++ b/src/snek/view/web.py @@ -46,6 +46,9 @@ class WebView(BaseView): messages = [await self.app.services.channel_message.to_extended_dict(message) for message in await self.app.services.channel_message.offset( channel["uid"] )] + for message in messages: + await self.app.services.notification.mark_as_read(self.session.get("uid"),message["uid"]) + channels = [] async for subscribed_channel in self.app.services.channel_member.find(user_uid=self.session.get("uid"), deleted_at=None, is_banned=False): item = {}