소스 검색

Convert files to ES modules

GitOrigin-RevId: 713430521d60f37ee20906bb2d5d0a56849a729d
Andrew Rumble 1 년 전
부모
커밋
f295bbc3be

+ 33 - 33
services/notifications/app.js

@@ -1,38 +1,40 @@
 // Metrics must be initialized before importing anything else
-require('@overleaf/metrics/initialize')
+import '@overleaf/metrics/initialize.js'
+import metrics from '@overleaf/metrics'
+import Settings from '@overleaf/settings'
+import logger from '@overleaf/logger'
+import express from 'express'
+import methodOverride from 'method-override'
+import { mongoClient } from './app/js/mongodb.js'
+import NotificationsController from './app/js/NotificationsController.js'
+import HealthCheckController from './app/js/HealthCheckController.js'
 
-const metrics = require('@overleaf/metrics')
-const Settings = require('@overleaf/settings')
-const logger = require('@overleaf/logger')
-logger.initialize('notifications')
-const express = require('express')
 const app = express()
-const methodOverride = require('method-override')
-const bodyParser = require('body-parser')
-const { mongoClient } = require('./app/js/mongodb')
-const controller = require('./app/js/NotificationsController')
+
+logger.initialize('notifications')
 
 metrics.memory.monitor(logger)
 metrics.open_sockets.monitor()
 
-const HealthCheckController = require('./app/js/HealthCheckController')
-
 app.use(methodOverride())
-app.use(bodyParser())
+app.use(express.json())
 app.use(metrics.http.monitor(logger))
 
 metrics.injectMetricsRoute(app)
 
-app.post('/user/:user_id', controller.addNotification)
-app.get('/user/:user_id', controller.getUserNotifications)
+app.post('/user/:user_id', NotificationsController.addNotification)
+app.get('/user/:user_id', NotificationsController.getUserNotifications)
 app.delete(
   '/user/:user_id/notification/:notification_id',
-  controller.removeNotificationId
+  NotificationsController.removeNotificationId
+)
+app.delete('/user/:user_id', NotificationsController.removeNotificationKey)
+app.delete('/key/:key', NotificationsController.removeNotificationByKeyOnly)
+app.get('/key/:key/count', NotificationsController.countNotificationsByKeyOnly)
+app.delete(
+  '/key/:key/bulk',
+  NotificationsController.deleteUnreadNotificationsByKeyOnlyBulk
 )
-app.delete('/user/:user_id', controller.removeNotificationKey)
-app.delete('/key/:key', controller.removeNotificationByKeyOnly)
-app.get('/key/:key/count', controller.countNotificationsByKeyOnly)
-app.delete('/key/:key/bulk', controller.deleteUnreadNotificationsByKeyOnlyBulk)
 
 app.get('/status', (req, res) => res.send('notifications is up'))
 
@@ -49,17 +51,15 @@ app.get('/health_check', (req, res) =>
 
 app.get('*', (req, res) => res.sendStatus(404))
 
-const host = Settings.internal?.notifications?.host || '127.0.0.1'
-const port = Settings.internal?.notifications?.port || 3042
+const host = Settings.internal.notifications?.host || '127.0.0.1'
+const port = Settings.internal.notifications?.port || 3042
+try {
+  await mongoClient.connect()
+} catch (err) {
+  logger.fatal({ err }, 'Cannot connect to mongo. Exiting.')
+  process.exit(1)
+}
 
-mongoClient
-  .connect()
-  .then(() => {
-    app.listen(port, host, () =>
-      logger.debug(`notifications starting up, listening on ${host}:${port}`)
-    )
-  })
-  .catch(err => {
-    logger.fatal({ err }, 'Cannot connect to mongo. Exiting.')
-    process.exit(1)
-  })
+app.listen(port, host, () =>
+  logger.debug({}, `notifications starting up, listening on ${host}:${port}`)
+)

+ 8 - 10
services/notifications/app/js/HealthCheckController.js

@@ -1,6 +1,3 @@
-/* eslint-disable
-    no-dupe-keys,
-*/
 // TODO: This file was created by bulk-decaffeinate.
 // Fix any style issues and re-enable lint.
 /*
@@ -9,14 +6,15 @@
  * DS207: Consider shorter variations of null checks
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const { db, ObjectId } = require('./mongodb')
-const request = require('request')
-const async = require('async')
-const settings = require('@overleaf/settings')
+import { db, ObjectId } from './mongodb.js'
+import request from 'request'
+import async from 'async'
+import settings from '@overleaf/settings'
+import logger from '@overleaf/logger'
+
 const { port } = settings.internal.notifications
-const logger = require('@overleaf/logger')
 
-module.exports = {
+export default {
   check(callback) {
     const userId = new ObjectId()
     const cleanupNotifications = callback =>
@@ -28,7 +26,7 @@ module.exports = {
       timeout: 5000,
     })
     logger.debug(
-      { userId, opts: getOpts(), key: notificationKey, userId },
+      { opts: getOpts(), key: notificationKey, userId },
       'Health Check: running'
     )
     const jobs = [

+ 3 - 14
services/notifications/app/js/Notifications.js

@@ -1,18 +1,7 @@
-/* eslint-disable
-    no-unused-vars,
-*/
-// TODO: This file was created by bulk-decaffeinate.
-// Fix any style issues and re-enable lint.
-/*
- * 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
- */
-const logger = require('@overleaf/logger')
-const { db, ObjectId } = require('./mongodb')
+import logger from '@overleaf/logger'
+import { db, ObjectId } from './mongodb.js'
 
-module.exports = {
+export default {
   getUserNotifications(userId, callback) {
     if (callback == null) {
       callback = function () {}

+ 4 - 4
services/notifications/app/js/NotificationsController.js

@@ -6,11 +6,11 @@
  * DS207: Consider shorter variations of null checks
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const Notifications = require('./Notifications')
-const logger = require('@overleaf/logger')
-const metrics = require('@overleaf/metrics')
+import logger from '@overleaf/logger'
+import metrics from '@overleaf/metrics'
+import Notifications from './Notifications.js'
 
-module.exports = {
+export default {
   getUserNotifications(req, res, next) {
     logger.debug(
       { userId: req.params.user_id },

+ 12 - 16
services/notifications/app/js/mongodb.js

@@ -1,26 +1,22 @@
-// @ts-check
+import Metrics from '@overleaf/metrics'
+import MongoUtils from '@overleaf/mongo-utils'
+import Settings from '@overleaf/settings'
+import mongodb from 'mongodb-legacy'
 
-const Metrics = require('@overleaf/metrics')
-const MongoUtils = require('@overleaf/mongo-utils')
-const Settings = require('@overleaf/settings')
-const { MongoClient, ObjectId } = require('mongodb-legacy')
-
-const mongoClient = new MongoClient(Settings.mongo.url, Settings.mongo.options)
+export const mongoClient = new mongodb.MongoClient(
+  Settings.mongo.url,
+  Settings.mongo.options
+)
 const mongoDb = mongoClient.db()
 
-const db = {
+export const db = {
   notifications: mongoDb.collection('notifications'),
 }
 
+export const ObjectId = mongodb.ObjectId
+
 Metrics.mongodb.monitor(mongoClient)
 
-async function cleanupTestDatabase() {
+export async function cleanupTestDatabase() {
   await MongoUtils.cleanupTestDatabase(mongoClient)
 }
-
-module.exports = {
-  db,
-  mongoClient,
-  ObjectId,
-  cleanupTestDatabase,
-}

+ 0 - 0
services/notifications/config/settings.defaults.js → services/notifications/config/settings.defaults.cjs


+ 1 - 0
services/notifications/package.json

@@ -3,6 +3,7 @@
   "description": "An API to handle user notifications",
   "private": true,
   "main": "app.js",
+  "type": "module",
   "scripts": {
     "start": "node app.js",
     "test:acceptance:_run": "mocha --recursive --reporter spec --timeout 15000 --exit $@ test/acceptance/js",

+ 15 - 15
services/notifications/test/unit/js/NotificationsControllerTest.js

@@ -9,11 +9,11 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const sinon = require('sinon')
-const modulePath = '../../../app/js/NotificationsController.js'
-const SandboxedModule = require('sandboxed-module')
-const assert = require('node:assert')
+import { stub } from 'sinon'
+import { require as _require } from 'sandboxed-module'
+import assert from 'node:assert'
 
+const modulePath = '../../../app/js/NotificationsController.js'
 const userId = '51dc93e6fb625a261300003b'
 const notificationId = 'fb625a26f09d'
 const notificationKey = 'my-notification-key'
@@ -22,11 +22,11 @@ describe('Notifications Controller', function () {
   beforeEach(function () {
     const self = this
     this.notifications = {}
-    this.controller = SandboxedModule.require(modulePath, {
+    this.controller = _require(modulePath, {
       requires: {
         './Notifications': this.notifications,
         '@overleaf/metrics': {
-          inc: sinon.stub(),
+          inc: stub(),
         },
       },
     })
@@ -42,9 +42,11 @@ describe('Notifications Controller', function () {
 
   describe('getUserNotifications', function () {
     return it('should ask the notifications for the users notifications', function (done) {
-      this.notifications.getUserNotifications = sinon
-        .stub()
-        .callsArgWith(1, null, this.stubbedNotification)
+      this.notifications.getUserNotifications = stub().callsArgWith(
+        1,
+        null,
+        this.stubbedNotification
+      )
       const req = {
         params: {
           user_id: userId,
@@ -64,7 +66,7 @@ describe('Notifications Controller', function () {
 
   describe('addNotification', function () {
     return it('should tell the notifications to add the notification for the user', function (done) {
-      this.notifications.addNotification = sinon.stub().callsArgWith(2)
+      this.notifications.addNotification = stub().callsArgWith(2)
       const req = {
         params: {
           user_id: userId,
@@ -85,7 +87,7 @@ describe('Notifications Controller', function () {
 
   describe('removeNotificationId', function () {
     return it('should tell the notifications to mark the notification Id as read', function (done) {
-      this.notifications.removeNotificationId = sinon.stub().callsArgWith(2)
+      this.notifications.removeNotificationId = stub().callsArgWith(2)
       const req = {
         params: {
           user_id: userId,
@@ -106,7 +108,7 @@ describe('Notifications Controller', function () {
 
   describe('removeNotificationKey', function () {
     return it('should tell the notifications to mark the notification Key as read', function (done) {
-      this.notifications.removeNotificationKey = sinon.stub().callsArgWith(2)
+      this.notifications.removeNotificationKey = stub().callsArgWith(2)
       const req = {
         params: {
           user_id: userId,
@@ -127,9 +129,7 @@ describe('Notifications Controller', function () {
 
   return describe('removeNotificationByKeyOnly', function () {
     return it('should tell the notifications to mark the notification Key as read', function (done) {
-      this.notifications.removeNotificationByKeyOnly = sinon
-        .stub()
-        .callsArgWith(1)
+      this.notifications.removeNotificationByKeyOnly = stub().callsArgWith(1)
       const req = {
         params: {
           key: notificationKey,

+ 25 - 25
services/notifications/test/unit/js/NotificationsTests.js

@@ -10,24 +10,24 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const sinon = require('sinon')
-const { expect } = require('chai')
-const modulePath = '../../../app/js/Notifications.js'
-const SandboxedModule = require('sandboxed-module')
-const assert = require('node:assert')
-const { ObjectId } = require('mongodb-legacy')
+import { stub, assert as _assert } from 'sinon'
+import { expect } from 'chai'
+import { require as _require } from 'sandboxed-module'
+import { deepEqual } from 'node:assert'
+import { ObjectId } from 'mongodb-legacy'
 
+const modulePath = '../../../app/js/Notifications.js'
 const userId = '51dc93e6fb625a261300003b'
 const notificationId = '574ee8d6f40c3a244e704249'
 const notificationKey = 'notification-key'
 
 describe('Notifications Tests', function () {
   beforeEach(function () {
-    this.findToArrayStub = sinon.stub()
-    this.findStub = sinon.stub().returns({ toArray: this.findToArrayStub })
-    this.countStub = sinon.stub()
-    this.updateOneStub = sinon.stub()
-    this.deleteOneStub = sinon.stub()
+    this.findToArrayStub = stub()
+    this.findStub = stub().returns({ toArray: this.findToArrayStub })
+    this.countStub = stub()
+    this.updateOneStub = stub()
+    this.deleteOneStub = stub()
     this.db = {
       notifications: {
         find: this.findStub,
@@ -37,7 +37,7 @@ describe('Notifications Tests', function () {
       },
     }
 
-    this.notifications = SandboxedModule.require(modulePath, {
+    this.notifications = _require(modulePath, {
       requires: {
         '@overleaf/settings': {},
         './mongodb': { db: this.db, ObjectId },
@@ -61,7 +61,7 @@ describe('Notifications Tests', function () {
         (err, notifications) => {
           if (err) return done(err)
           notifications.should.equal(this.stubbedNotificationArray)
-          assert.deepEqual(this.findStub.args[0][0], {
+          deepEqual(this.findStub.args[0][0], {
             user_id: new ObjectId(userId),
             templateKey: { $exists: true },
           })
@@ -99,7 +99,7 @@ describe('Notifications Tests', function () {
         this.stubbedNotification,
         err => {
           expect(err).not.to.exist
-          sinon.assert.calledWith(
+          _assert.calledWith(
             this.updateOneStub,
             this.expectedQuery,
             { $set: this.expectedDocument },
@@ -121,7 +121,7 @@ describe('Notifications Tests', function () {
           this.stubbedNotification,
           err => {
             expect(err).not.to.exist
-            sinon.assert.notCalled(this.updateOneStub)
+            _assert.notCalled(this.updateOneStub)
             return done()
           }
         )
@@ -134,7 +134,7 @@ describe('Notifications Tests', function () {
           this.stubbedNotification,
           err => {
             expect(err).not.to.exist
-            sinon.assert.calledWith(
+            _assert.calledWith(
               this.updateOneStub,
               this.expectedQuery,
               { $set: this.expectedDocument },
@@ -174,7 +174,7 @@ describe('Notifications Tests', function () {
           this.stubbedNotification,
           err => {
             expect(err).not.to.exist
-            sinon.assert.calledWith(
+            _assert.calledWith(
               this.updateOneStub,
               this.expectedQuery,
               { $set: this.expectedDocument },
@@ -210,7 +210,7 @@ describe('Notifications Tests', function () {
           this.stubbedNotification,
           err => {
             ;(err instanceof Error).should.equal(true)
-            sinon.assert.notCalled(this.updateOneStub)
+            _assert.notCalled(this.updateOneStub)
             return done()
           }
         )
@@ -234,8 +234,8 @@ describe('Notifications Tests', function () {
           const updateOperation = {
             $unset: { templateKey: true, messageOpts: true },
           }
-          assert.deepEqual(this.updateOneStub.args[0][0], searchOps)
-          assert.deepEqual(this.updateOneStub.args[0][1], updateOperation)
+          deepEqual(this.updateOneStub.args[0][0], searchOps)
+          deepEqual(this.updateOneStub.args[0][1], updateOperation)
           return done()
         }
       )
@@ -258,8 +258,8 @@ describe('Notifications Tests', function () {
           const updateOperation = {
             $unset: { templateKey: true },
           }
-          assert.deepEqual(this.updateOneStub.args[0][0], searchOps)
-          assert.deepEqual(this.updateOneStub.args[0][1], updateOperation)
+          deepEqual(this.updateOneStub.args[0][0], searchOps)
+          deepEqual(this.updateOneStub.args[0][1], updateOperation)
           return done()
         }
       )
@@ -276,8 +276,8 @@ describe('Notifications Tests', function () {
           if (err) return done(err)
           const searchOps = { key: notificationKey }
           const updateOperation = { $unset: { templateKey: true } }
-          assert.deepEqual(this.updateOneStub.args[0][0], searchOps)
-          assert.deepEqual(this.updateOneStub.args[0][1], updateOperation)
+          deepEqual(this.updateOneStub.args[0][0], searchOps)
+          deepEqual(this.updateOneStub.args[0][1], updateOperation)
           return done()
         }
       )
@@ -293,7 +293,7 @@ describe('Notifications Tests', function () {
         err => {
           if (err) return done(err)
           const searchOps = { key: notificationKey }
-          assert.deepEqual(this.deleteOneStub.args[0][0], searchOps)
+          deepEqual(this.deleteOneStub.args[0][0], searchOps)
           return done()
         }
       )

+ 9 - 0
services/notifications/vitest.config.cjs

@@ -0,0 +1,9 @@
+const { defineConfig } = require('vitest/config')
+
+module.exports = defineConfig({
+  test: {
+    include: ['test/unit/js/**/*.test.js'],
+    setupFiles: ['./test/setup.js'],
+    isolate: false,
+  },
+})