Skip to content

Commit 0101f42

Browse files
committed
feat: add mark-read endpoint
1 parent 02fc4d8 commit 0101f42

File tree

2 files changed

+61
-6
lines changed

2 files changed

+61
-6
lines changed

packages/backend/src/services/NotificationService.js

+37-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
const APIError = require("../api/APIError");
2+
const auth2 = require("../middleware/auth2");
3+
const { Endpoint } = require("../util/expressutil");
14
const BaseService = require("./BaseService");
25
const { DB_WRITE } = require("./database/consts");
36

@@ -10,6 +13,7 @@ const UsernameNotifSelector = username => async (self) => {
1013
class NotificationService extends BaseService {
1114
static MODULES = {
1215
uuidv4: require('uuid').v4,
16+
express: require('express'),
1317
}
1418

1519
async _init () {
@@ -29,6 +33,39 @@ class NotificationService extends BaseService {
2933
});
3034
}
3135

36+
['__on_install.routes'] (_, { app }) {
37+
const require = this.require;
38+
const express = require('express');
39+
const router = express.Router();
40+
app.use('/notif', router);
41+
42+
router.use(auth2);
43+
44+
Endpoint({
45+
route: '/mark-read',
46+
methods: ['POST'],
47+
handler: async (req, res) => {
48+
// TODO: validate uid
49+
if ( typeof req.body.uid !== 'string' ) {
50+
throw APIError.create('field_invalid', null, {
51+
key: 'uid',
52+
expected: 'a valid UUID',
53+
got: 'non-string value'
54+
})
55+
}
56+
57+
await this.db.write(
58+
'UPDATE `notification` SET read=1 ' +
59+
'WHERE uid = ? AND user_id = ? ' +
60+
'LIMIT 1',
61+
[req.body.uid, req.user.id],
62+
);
63+
64+
res.json({});
65+
}
66+
}).attach(router);
67+
}
68+
3269
async on_user_connected ({ user }) {
3370
// query the users unread notifications
3471
const notifications = await this.db.read(
@@ -74,11 +111,6 @@ class NotificationService extends BaseService {
74111
},
75112
});
76113

77-
const ll = o => {
78-
this.log.noticeme('debug: ' + require('node:util').inspect(o));
79-
return o;
80-
};
81-
82114
(async () => {
83115
for ( const user_id of user_id_list ) {
84116
await this.db.write(...ll([

src/UI/UIDesktop.js

+24-1
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,31 @@ async function UIDesktop(options){
124124

125125
for ( const notif_info of unreads ) {
126126
const notification = notif_info.notification;
127+
const icon = (sys => {
128+
if ( sys === 'share' ) return window.icons['shared.svg'];
129+
if ( sys === 'puter' ) return window.icons['logo-fill.svg'];
130+
return notification.builtin_icon
131+
? window.icons[notification.builtin_icon]
132+
: notification.icon || window.icons['bell.svg'];
133+
})(notification.subsystem);
134+
127135
UINotification({
128-
content: notification.summary
136+
// icon: window.icons['shared.svg'],
137+
icon,
138+
title: notification.summary,
139+
text: notification.text ?? notification.summary,
140+
click: async () => {
141+
await fetch(`${window.api_origin}/notif/mark-read`, {
142+
method: 'POST',
143+
headers: {
144+
Authorization: `Bearer ${puter.authToken}`,
145+
'Content-Type': 'application/json',
146+
},
147+
body: JSON.stringify({
148+
uid: notif_info.uid,
149+
}),
150+
});
151+
},
129152
});
130153
}
131154
});

0 commit comments

Comments
 (0)