2020-01-13 19:00:40 +00:00
|
|
|
/* eslint-disable
|
|
|
|
camelcase,
|
|
|
|
no-unused-vars,
|
|
|
|
*/
|
|
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
|
|
// Fix any style issues and re-enable lint.
|
2020-01-13 19:00:33 +00:00
|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
|
*/
|
2020-01-13 19:00:49 +00:00
|
|
|
let Notifications
|
2021-12-14 13:00:35 +00:00
|
|
|
const logger = require('@overleaf/logger')
|
2020-08-31 08:58:47 +00:00
|
|
|
const { db, ObjectId } = require('./mongodb')
|
2020-11-25 11:57:20 +00:00
|
|
|
const metrics = require('@overleaf/metrics')
|
2016-01-14 12:35:16 +00:00
|
|
|
|
2020-01-13 19:00:49 +00:00
|
|
|
module.exports = Notifications = {
|
|
|
|
getUserNotifications(user_id, callback) {
|
|
|
|
if (callback == null) {
|
2021-10-27 09:49:18 +00:00
|
|
|
callback = function () {}
|
2020-01-13 19:00:49 +00:00
|
|
|
}
|
|
|
|
const query = {
|
|
|
|
user_id: ObjectId(user_id),
|
2021-07-13 11:04:44 +00:00
|
|
|
templateKey: { $exists: true },
|
2020-01-13 19:00:49 +00:00
|
|
|
}
|
2020-08-31 08:58:47 +00:00
|
|
|
db.notifications.find(query).toArray(callback)
|
2020-01-13 19:00:49 +00:00
|
|
|
},
|
2016-01-14 12:35:16 +00:00
|
|
|
|
2020-01-13 19:00:49 +00:00
|
|
|
_countExistingNotifications(user_id, notification, callback) {
|
|
|
|
if (callback == null) {
|
2021-10-27 09:49:18 +00:00
|
|
|
callback = function () {}
|
2020-01-13 19:00:49 +00:00
|
|
|
}
|
|
|
|
const query = {
|
|
|
|
user_id: ObjectId(user_id),
|
2021-07-13 11:04:44 +00:00
|
|
|
key: notification.key,
|
2020-01-13 19:00:49 +00:00
|
|
|
}
|
2020-06-04 07:50:05 +00:00
|
|
|
return db.notifications.count(query, function (err, count) {
|
2020-01-13 19:00:49 +00:00
|
|
|
if (err != null) {
|
|
|
|
return callback(err)
|
|
|
|
}
|
|
|
|
return callback(null, count)
|
|
|
|
})
|
|
|
|
},
|
2016-01-14 12:35:16 +00:00
|
|
|
|
2020-01-13 19:00:49 +00:00
|
|
|
addNotification(user_id, notification, callback) {
|
2021-07-13 11:04:44 +00:00
|
|
|
return this._countExistingNotifications(
|
|
|
|
user_id,
|
|
|
|
notification,
|
|
|
|
function (err, count) {
|
|
|
|
if (err != null) {
|
2020-01-13 19:00:49 +00:00
|
|
|
return callback(err)
|
|
|
|
}
|
2021-07-13 11:04:44 +00:00
|
|
|
if (count !== 0 && !notification.forceCreate) {
|
|
|
|
return callback()
|
|
|
|
}
|
|
|
|
const doc = {
|
|
|
|
user_id: ObjectId(user_id),
|
|
|
|
key: notification.key,
|
|
|
|
messageOpts: notification.messageOpts,
|
|
|
|
templateKey: notification.templateKey,
|
|
|
|
}
|
|
|
|
// TTL index on the optional `expires` field, which should arrive as an iso date-string, corresponding to
|
|
|
|
// a datetime in the future when the document should be automatically removed.
|
|
|
|
// in Mongo, TTL indexes only work on date fields, and ignore the document when that field is missing
|
|
|
|
// see `README.md` for instruction on creating TTL index
|
|
|
|
if (notification.expires != null) {
|
|
|
|
try {
|
|
|
|
doc.expires = new Date(notification.expires)
|
|
|
|
const _testValue = doc.expires.toISOString()
|
|
|
|
} catch (error) {
|
|
|
|
err = error
|
|
|
|
logger.error(
|
|
|
|
{ user_id, expires: notification.expires },
|
|
|
|
'error converting `expires` field to Date'
|
|
|
|
)
|
|
|
|
return callback(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
db.notifications.updateOne(
|
|
|
|
{ user_id: doc.user_id, key: notification.key },
|
|
|
|
{ $set: doc },
|
|
|
|
{ upsert: true },
|
|
|
|
callback
|
|
|
|
)
|
2020-01-13 19:00:49 +00:00
|
|
|
}
|
2021-07-13 11:04:44 +00:00
|
|
|
)
|
2020-01-13 19:00:49 +00:00
|
|
|
},
|
2016-08-17 09:52:35 +00:00
|
|
|
|
2020-01-13 19:00:49 +00:00
|
|
|
removeNotificationId(user_id, notification_id, callback) {
|
|
|
|
const searchOps = {
|
|
|
|
user_id: ObjectId(user_id),
|
2021-07-13 11:04:44 +00:00
|
|
|
_id: ObjectId(notification_id),
|
2020-01-13 19:00:49 +00:00
|
|
|
}
|
|
|
|
const updateOperation = { $unset: { templateKey: true, messageOpts: true } }
|
2020-08-31 08:58:47 +00:00
|
|
|
db.notifications.updateOne(searchOps, updateOperation, callback)
|
2020-01-13 19:00:49 +00:00
|
|
|
},
|
2016-08-17 09:52:35 +00:00
|
|
|
|
2020-01-13 19:00:49 +00:00
|
|
|
removeNotificationKey(user_id, notification_key, callback) {
|
|
|
|
const searchOps = {
|
|
|
|
user_id: ObjectId(user_id),
|
2021-07-13 11:04:44 +00:00
|
|
|
key: notification_key,
|
2020-01-13 19:00:49 +00:00
|
|
|
}
|
|
|
|
const updateOperation = { $unset: { templateKey: true } }
|
2020-08-31 08:58:47 +00:00
|
|
|
db.notifications.updateOne(searchOps, updateOperation, callback)
|
2020-01-13 19:00:49 +00:00
|
|
|
},
|
2016-01-14 12:35:16 +00:00
|
|
|
|
2020-01-13 19:00:49 +00:00
|
|
|
removeNotificationByKeyOnly(notification_key, callback) {
|
|
|
|
const searchOps = { key: notification_key }
|
|
|
|
const updateOperation = { $unset: { templateKey: true } }
|
2020-08-31 08:58:47 +00:00
|
|
|
db.notifications.updateOne(searchOps, updateOperation, callback)
|
2020-01-13 19:00:49 +00:00
|
|
|
},
|
2016-02-05 09:38:32 +00:00
|
|
|
|
2021-10-20 10:18:14 +00:00
|
|
|
countNotificationsByKeyOnly(notificationKey, callback) {
|
|
|
|
const searchOps = { key: notificationKey, templateKey: { $exists: true } }
|
|
|
|
db.notifications.count(searchOps, callback)
|
|
|
|
},
|
|
|
|
|
|
|
|
deleteUnreadNotificationsByKeyOnlyBulk(notificationKey, callback) {
|
|
|
|
if (typeof notificationKey !== 'string') {
|
|
|
|
throw new Error('refusing to bulk delete arbitrary notifications')
|
|
|
|
}
|
|
|
|
const searchOps = { key: notificationKey, templateKey: { $exists: true } }
|
|
|
|
db.notifications.deleteMany(searchOps, (err, result) => {
|
|
|
|
if (err) return callback(err)
|
|
|
|
callback(null, result.deletedCount)
|
|
|
|
})
|
|
|
|
},
|
|
|
|
|
2020-01-13 19:00:49 +00:00
|
|
|
// hard delete of doc, rather than removing the templateKey
|
|
|
|
deleteNotificationByKeyOnly(notification_key, callback) {
|
|
|
|
const searchOps = { key: notification_key }
|
2020-08-31 08:58:47 +00:00
|
|
|
db.notifications.deleteOne(searchOps, callback)
|
2021-07-13 11:04:44 +00:00
|
|
|
},
|
2020-01-13 19:00:49 +00:00
|
|
|
}
|
2021-07-13 11:04:44 +00:00
|
|
|
;['getUserNotifications', 'addNotification'].map(method =>
|
2020-01-13 19:00:49 +00:00
|
|
|
metrics.timeAsyncMethod(Notifications, method, 'mongo.Notifications', logger)
|
|
|
|
)
|