|
|
@@ -11,104 +11,120 @@
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
*/
|
|
|
-let Notifications;
|
|
|
-const Settings = require('settings-sharelatex');
|
|
|
-const logger = require('logger-sharelatex');
|
|
|
-const mongojs = require('mongojs');
|
|
|
-const db = mongojs(Settings.mongo != null ? Settings.mongo.url : undefined, ['notifications']);
|
|
|
-const { ObjectId } = require("mongojs");
|
|
|
-const metrics = require('metrics-sharelatex');
|
|
|
+let Notifications
|
|
|
+const Settings = require('settings-sharelatex')
|
|
|
+const logger = require('logger-sharelatex')
|
|
|
+const mongojs = require('mongojs')
|
|
|
+const db = mongojs(Settings.mongo != null ? Settings.mongo.url : undefined, [
|
|
|
+ 'notifications'
|
|
|
+])
|
|
|
+const { ObjectId } = require('mongojs')
|
|
|
+const metrics = require('metrics-sharelatex')
|
|
|
|
|
|
-module.exports = (Notifications = {
|
|
|
+module.exports = Notifications = {
|
|
|
+ getUserNotifications(user_id, callback) {
|
|
|
+ if (callback == null) {
|
|
|
+ callback = function(err, notifications) {}
|
|
|
+ }
|
|
|
+ const query = {
|
|
|
+ user_id: ObjectId(user_id),
|
|
|
+ templateKey: { $exists: true }
|
|
|
+ }
|
|
|
+ return db.notifications.find(query, (err, notifications) =>
|
|
|
+ callback(err, notifications)
|
|
|
+ )
|
|
|
+ },
|
|
|
|
|
|
- getUserNotifications(user_id, callback){
|
|
|
- if (callback == null) { callback = function(err, notifications){}; }
|
|
|
- const query = {
|
|
|
- user_id: ObjectId(user_id),
|
|
|
- templateKey: {"$exists":true}
|
|
|
- };
|
|
|
- return db.notifications.find(query, (err, notifications)=> callback(err, notifications));
|
|
|
- },
|
|
|
+ _countExistingNotifications(user_id, notification, callback) {
|
|
|
+ if (callback == null) {
|
|
|
+ callback = function(err, count) {}
|
|
|
+ }
|
|
|
+ const query = {
|
|
|
+ user_id: ObjectId(user_id),
|
|
|
+ key: notification.key
|
|
|
+ }
|
|
|
+ return db.notifications.count(query, function(err, count) {
|
|
|
+ if (err != null) {
|
|
|
+ return callback(err)
|
|
|
+ }
|
|
|
+ return callback(null, count)
|
|
|
+ })
|
|
|
+ },
|
|
|
|
|
|
+ addNotification(user_id, notification, callback) {
|
|
|
+ return this._countExistingNotifications(user_id, notification, function(
|
|
|
+ err,
|
|
|
+ count
|
|
|
+ ) {
|
|
|
+ if (err != null) {
|
|
|
+ return callback(err)
|
|
|
+ }
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return db.notifications.update(
|
|
|
+ { user_id: doc.user_id, key: notification.key },
|
|
|
+ doc,
|
|
|
+ { upsert: true },
|
|
|
+ callback
|
|
|
+ )
|
|
|
+ })
|
|
|
+ },
|
|
|
|
|
|
- _countExistingNotifications(user_id, notification, callback){
|
|
|
- if (callback == null) { callback = function(err, count){}; }
|
|
|
- const query = {
|
|
|
- user_id: ObjectId(user_id),
|
|
|
- key: notification.key
|
|
|
- };
|
|
|
- return db.notifications.count(query, function(err, count){
|
|
|
- if (err != null) { return callback(err); }
|
|
|
- return callback(null, count);
|
|
|
- });
|
|
|
- },
|
|
|
+ removeNotificationId(user_id, notification_id, callback) {
|
|
|
+ const searchOps = {
|
|
|
+ user_id: ObjectId(user_id),
|
|
|
+ _id: ObjectId(notification_id)
|
|
|
+ }
|
|
|
+ const updateOperation = { $unset: { templateKey: true, messageOpts: true } }
|
|
|
+ return db.notifications.update(searchOps, updateOperation, callback)
|
|
|
+ },
|
|
|
|
|
|
- addNotification(user_id, notification, callback){
|
|
|
- return this._countExistingNotifications(user_id, notification, function(err, count){
|
|
|
- if (err != null) { return callback(err); }
|
|
|
- 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);
|
|
|
- }
|
|
|
- }
|
|
|
- return db.notifications.update({user_id: doc.user_id, key: notification.key}, doc, {upsert: true}, callback);
|
|
|
- });
|
|
|
- },
|
|
|
+ removeNotificationKey(user_id, notification_key, callback) {
|
|
|
+ const searchOps = {
|
|
|
+ user_id: ObjectId(user_id),
|
|
|
+ key: notification_key
|
|
|
+ }
|
|
|
+ const updateOperation = { $unset: { templateKey: true } }
|
|
|
+ return db.notifications.update(searchOps, updateOperation, callback)
|
|
|
+ },
|
|
|
|
|
|
- removeNotificationId(user_id, notification_id, callback){
|
|
|
- const searchOps = {
|
|
|
- user_id:ObjectId(user_id),
|
|
|
- _id:ObjectId(notification_id)
|
|
|
- };
|
|
|
- const updateOperation =
|
|
|
- {"$unset": {templateKey:true, messageOpts: true}};
|
|
|
- return db.notifications.update(searchOps, updateOperation, callback);
|
|
|
- },
|
|
|
+ removeNotificationByKeyOnly(notification_key, callback) {
|
|
|
+ const searchOps = { key: notification_key }
|
|
|
+ const updateOperation = { $unset: { templateKey: true } }
|
|
|
+ return db.notifications.update(searchOps, updateOperation, callback)
|
|
|
+ },
|
|
|
|
|
|
- removeNotificationKey(user_id, notification_key, callback){
|
|
|
- const searchOps = {
|
|
|
- user_id:ObjectId(user_id),
|
|
|
- key: notification_key
|
|
|
- };
|
|
|
- const updateOperation =
|
|
|
- {"$unset": {templateKey:true}};
|
|
|
- return db.notifications.update(searchOps, updateOperation, callback);
|
|
|
- },
|
|
|
+ // hard delete of doc, rather than removing the templateKey
|
|
|
+ deleteNotificationByKeyOnly(notification_key, callback) {
|
|
|
+ const searchOps = { key: notification_key }
|
|
|
+ return db.notifications.remove(searchOps, { justOne: true }, callback)
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- removeNotificationByKeyOnly(notification_key, callback){
|
|
|
- const searchOps =
|
|
|
- {key: notification_key};
|
|
|
- const updateOperation =
|
|
|
- {"$unset": {templateKey:true}};
|
|
|
- return db.notifications.update(searchOps, updateOperation, callback);
|
|
|
- },
|
|
|
-
|
|
|
- // hard delete of doc, rather than removing the templateKey
|
|
|
- deleteNotificationByKeyOnly(notification_key, callback){
|
|
|
- const searchOps =
|
|
|
- {key: notification_key};
|
|
|
- return db.notifications.remove(searchOps, {justOne: true}, callback);
|
|
|
- }
|
|
|
-});
|
|
|
-
|
|
|
-
|
|
|
-[
|
|
|
- 'getUserNotifications',
|
|
|
- 'addNotification'
|
|
|
-].map(method => metrics.timeAsyncMethod(Notifications, method, 'mongo.Notifications', logger));
|
|
|
+;['getUserNotifications', 'addNotification'].map(method =>
|
|
|
+ metrics.timeAsyncMethod(Notifications, method, 'mongo.Notifications', logger)
|
|
|
+)
|