Files
overleaf-cep/services/web/app/src/Features/Notifications/NotificationsHandler.mjs
T
Andrew Rumble 912324f560 Convert to ESM
GitOrigin-RevId: b58b02f9e9c8d47909e95c3ade8e1bf33ed46c80
2025-11-06 09:05:47 +00:00

143 lines
3.4 KiB
JavaScript

import settings from '@overleaf/settings'
import request from 'request'
import logger from '@overleaf/logger'
import _ from 'lodash'
import { promisifyAll } from '@overleaf/promise-utils'
const notificationsApi = _.get(settings, ['apis', 'notifications', 'url'])
const oneSecond = 1000
const makeRequest = function (opts, callback) {
if (notificationsApi) {
request(opts, callback)
} else {
callback(null, { statusCode: 200 })
}
}
const NotificationsHandler = {
getUserNotifications(userId, callback) {
const opts = {
uri: `${notificationsApi}/user/${userId}`,
json: true,
timeout: oneSecond,
method: 'GET',
}
makeRequest(opts, function (err, res, unreadNotifications) {
const statusCode = res ? res.statusCode : 500
if (err || statusCode !== 200) {
logger.err(
{ err, statusCode },
'something went wrong getting notifications'
)
callback(null, [])
} else {
if (unreadNotifications == null) {
unreadNotifications = []
}
callback(null, unreadNotifications)
}
})
},
createNotification(
userId,
key,
templateKey,
messageOpts,
expiryDateTime,
forceCreate,
callback
) {
if (!callback) {
callback = forceCreate
forceCreate = true
}
const payload = {
key,
messageOpts,
templateKey,
forceCreate,
}
if (expiryDateTime) {
payload.expires = expiryDateTime
}
const opts = {
uri: `${notificationsApi}/user/${userId}`,
timeout: oneSecond,
method: 'POST',
json: payload,
}
makeRequest(opts, callback)
},
markAsReadWithKey(userId, key, callback) {
const opts = {
uri: `${notificationsApi}/user/${userId}`,
method: 'DELETE',
timeout: oneSecond,
json: {
key,
},
}
makeRequest(opts, callback)
},
markAsRead(userId, notificationId, callback) {
const opts = {
method: 'DELETE',
uri: `${notificationsApi}/user/${userId}/notification/${notificationId}`,
timeout: oneSecond,
}
makeRequest(opts, callback)
},
// removes notification by key, without regard for user_id,
// should not be exposed to user via ui/router
markAsReadByKeyOnly(key, callback) {
const opts = {
uri: `${notificationsApi}/key/${key}`,
method: 'DELETE',
timeout: oneSecond,
}
makeRequest(opts, callback)
},
previewMarkAsReadByKeyOnlyBulk(key, callback) {
const opts = {
uri: `${notificationsApi}/key/${key}/count`,
method: 'GET',
timeout: 10 * oneSecond,
json: true,
}
makeRequest(opts, (err, res, body) => {
if (err) return callback(err)
if (res.statusCode !== 200) {
return callback(
new Error('cannot preview bulk delete notification: ' + key)
)
}
callback(null, (body && body.count) || 0)
})
},
markAsReadByKeyOnlyBulk(key, callback) {
const opts = {
uri: `${notificationsApi}/key/${key}/bulk`,
method: 'DELETE',
timeout: 10 * oneSecond,
json: true,
}
makeRequest(opts, (err, res, body) => {
if (err) return callback(err)
if (res.statusCode !== 200) {
return callback(new Error('cannot bulk delete notification: ' + key))
}
callback(null, (body && body.count) || 0)
})
},
}
NotificationsHandler.promises = promisifyAll(NotificationsHandler)
export default NotificationsHandler