Ver código fonte

feat: add mark-read endpoint

KernelDeimos 11 meses atrás
pai
commit
0101f425d4

+ 37 - 5
packages/backend/src/services/NotificationService.js

@@ -1,3 +1,6 @@
+const APIError = require("../api/APIError");
+const auth2 = require("../middleware/auth2");
+const { Endpoint } = require("../util/expressutil");
 const BaseService = require("./BaseService");
 const { DB_WRITE } = require("./database/consts");
 
@@ -10,6 +13,7 @@ const UsernameNotifSelector = username => async (self) => {
 class NotificationService extends BaseService {
     static MODULES = {
         uuidv4: require('uuid').v4,
+        express: require('express'),
     }
 
     async _init () {
@@ -29,6 +33,39 @@ class NotificationService extends BaseService {
         });
     }
     
+    ['__on_install.routes'] (_, { app }) {
+        const require = this.require;
+        const express = require('express');
+        const router = express.Router();
+        app.use('/notif', router);
+        
+        router.use(auth2);
+        
+        Endpoint({
+            route: '/mark-read',
+            methods: ['POST'],
+            handler: async (req, res) => {
+                // TODO: validate uid
+                if ( typeof req.body.uid !== 'string' ) {
+                    throw APIError.create('field_invalid', null, {
+                        key: 'uid',
+                        expected: 'a valid UUID',
+                        got: 'non-string value'
+                    })
+                }
+                
+                await this.db.write(
+                    'UPDATE `notification` SET read=1 ' +
+                    'WHERE uid = ? AND user_id = ? ' +
+                    'LIMIT 1',
+                    [req.body.uid, req.user.id],
+                );
+                
+                res.json({});
+            }
+        }).attach(router);
+    }
+    
     async on_user_connected ({ user }) {
         // query the users unread notifications
         const notifications = await this.db.read(
@@ -74,11 +111,6 @@ class NotificationService extends BaseService {
             },
         });
         
-        const ll = o => {
-            this.log.noticeme('debug: ' + require('node:util').inspect(o));
-            return o;
-        };
-        
         (async () => {
             for ( const user_id of user_id_list ) {
                 await this.db.write(...ll([

+ 24 - 1
src/UI/UIDesktop.js

@@ -124,8 +124,31 @@ async function UIDesktop(options){
 
         for ( const notif_info of unreads ) {
             const notification = notif_info.notification;
+            const icon = (sys => {
+                if ( sys === 'share' ) return window.icons['shared.svg'];
+                if ( sys === 'puter' ) return window.icons['logo-fill.svg'];
+                return notification.builtin_icon
+                    ? window.icons[notification.builtin_icon]
+                    : notification.icon || window.icons['bell.svg'];
+            })(notification.subsystem);
+            
             UINotification({
-                content: notification.summary
+                // icon: window.icons['shared.svg'],
+                icon,
+                title: notification.summary,
+                text: notification.text ?? notification.summary,
+                click: async () => {
+                    await fetch(`${window.api_origin}/notif/mark-read`, {
+                        method: 'POST',
+                        headers: {
+                            Authorization: `Bearer ${puter.authToken}`,
+                            'Content-Type': 'application/json',
+                        },
+                        body: JSON.stringify({
+                            uid: notif_info.uid,
+                        }),
+                    });
+                },
             });
         }
     });