mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-07 20:31:06 -05:00
create scaffolding base on tags repo
This commit is contained in:
commit
1e60327f2e
11 changed files with 348 additions and 0 deletions
74
services/notifications/.gitignore
vendored
Normal file
74
services/notifications/.gitignore
vendored
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
Compiled source #
|
||||||
|
###################
|
||||||
|
*.com
|
||||||
|
*.class
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
*.o
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Packages #
|
||||||
|
############
|
||||||
|
# it's better to unpack these files and commit the raw source
|
||||||
|
# git has its own built in compression methods
|
||||||
|
*.7z
|
||||||
|
*.dmg
|
||||||
|
*.gz
|
||||||
|
*.iso
|
||||||
|
*.jar
|
||||||
|
*.rar
|
||||||
|
*.tar
|
||||||
|
*.zip
|
||||||
|
|
||||||
|
# Logs and databases #
|
||||||
|
######################
|
||||||
|
*.log
|
||||||
|
*.sql
|
||||||
|
*.sqlite
|
||||||
|
|
||||||
|
# OS generated files #
|
||||||
|
######################
|
||||||
|
.DS_Store?
|
||||||
|
ehthumbs.db
|
||||||
|
Icon?
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
node_modules/*
|
||||||
|
data/*
|
||||||
|
|
||||||
|
app.js
|
||||||
|
example.js
|
||||||
|
app/js/*
|
||||||
|
test/unit/js/*
|
||||||
|
test/smoke/js/*
|
||||||
|
cookies.txt
|
||||||
|
requestQueueWorker.js
|
||||||
|
TpdsWorker.js
|
||||||
|
BackgroundJobsWorker.js
|
||||||
|
UserAndProjectPopulator.coffee
|
||||||
|
|
||||||
|
public/js/history/versiondetail.js
|
||||||
|
!public/js/libs/
|
||||||
|
public/js/*
|
||||||
|
!public/js/ace/*
|
||||||
|
!public/js/libs/
|
||||||
|
public/js/libs/sharejs.js
|
||||||
|
public/js/editor.js
|
||||||
|
public/js/home.js
|
||||||
|
public/js/forms.js
|
||||||
|
public/js/gui.js
|
||||||
|
public/js/admin.js
|
||||||
|
public/js/history/*
|
||||||
|
public/stylesheets/style.css
|
||||||
|
public/brand/plans.css
|
||||||
|
public/minjs/
|
||||||
|
|
||||||
|
public/js/main.js
|
||||||
|
Gemfile.lock
|
||||||
|
|
||||||
|
*.swp
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
app/views/external
|
||||||
|
|
||||||
|
/modules/
|
52
services/notifications/Gruntfile.coffee
Normal file
52
services/notifications/Gruntfile.coffee
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
module.exports = (grunt) ->
|
||||||
|
grunt.initConfig
|
||||||
|
coffee:
|
||||||
|
app_src:
|
||||||
|
expand: true,
|
||||||
|
cwd: "app/coffee"
|
||||||
|
src: ['**/*.coffee'],
|
||||||
|
dest: 'app/js/',
|
||||||
|
ext: '.js'
|
||||||
|
|
||||||
|
app:
|
||||||
|
src: "app.coffee"
|
||||||
|
dest: "app.js"
|
||||||
|
|
||||||
|
unit_tests:
|
||||||
|
expand: true
|
||||||
|
cwd: "test/unit/coffee"
|
||||||
|
src: ["**/*.coffee"]
|
||||||
|
dest: "test/unit/js/"
|
||||||
|
ext: ".js"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
app: ["app/js/"]
|
||||||
|
unit_tests: ["test/unit/js"]
|
||||||
|
|
||||||
|
execute:
|
||||||
|
app:
|
||||||
|
src: "app.js"
|
||||||
|
|
||||||
|
mochaTest:
|
||||||
|
unit:
|
||||||
|
options:
|
||||||
|
reporter: grunt.option('reporter') or 'spec'
|
||||||
|
src: ["test/unit/js/**/*.js"]
|
||||||
|
|
||||||
|
grunt.loadNpmTasks 'grunt-contrib-coffee'
|
||||||
|
grunt.loadNpmTasks 'grunt-contrib-clean'
|
||||||
|
grunt.loadNpmTasks 'grunt-mocha-test'
|
||||||
|
grunt.loadNpmTasks 'grunt-execute'
|
||||||
|
grunt.loadNpmTasks 'grunt-bunyan'
|
||||||
|
|
||||||
|
grunt.registerTask 'compile:app', ['clean:app', 'coffee:app', 'coffee:app_src']
|
||||||
|
grunt.registerTask 'run', ['compile:app', 'bunyan', 'execute']
|
||||||
|
|
||||||
|
grunt.registerTask 'compile:unit_tests', ['clean:unit_tests', 'coffee:unit_tests']
|
||||||
|
grunt.registerTask 'test:unit', ['compile:app', 'compile:unit_tests', 'mochaTest:unit']
|
||||||
|
|
||||||
|
grunt.registerTask 'install', 'compile:app'
|
||||||
|
|
||||||
|
grunt.registerTask 'default', ['run']
|
||||||
|
|
||||||
|
|
4
services/notifications/README.md
Normal file
4
services/notifications/README.md
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
notifications-sharelatex
|
||||||
|
===============
|
||||||
|
|
||||||
|
An API for managing user notifications in ShareLaTeX
|
44
services/notifications/app.coffee
Normal file
44
services/notifications/app.coffee
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
Settings = require 'settings-sharelatex'
|
||||||
|
logger = require 'logger-sharelatex'
|
||||||
|
logger.initialize("notifications-sharelatex")
|
||||||
|
express = require('express')
|
||||||
|
app = express()
|
||||||
|
controller = require("./app/js/NotificationController")
|
||||||
|
mongojs = require('mongojs')
|
||||||
|
db = mongojs(Settings.mongo.url, ['notifications'])
|
||||||
|
Path = require("path")
|
||||||
|
metrics = require("metrics-sharelatex")
|
||||||
|
metrics.initialize("notifications")
|
||||||
|
metrics.mongodb.monitor(Path.resolve(__dirname + "/node_modules/mongojs/node_modules/mongodb"), logger)
|
||||||
|
metrics.memory.monitor(logger)
|
||||||
|
|
||||||
|
HealthCheckController = require("./app/js/HealthCheckController")
|
||||||
|
|
||||||
|
app.configure ()->
|
||||||
|
app.use express.methodOverride()
|
||||||
|
app.use express.bodyParser()
|
||||||
|
app.use metrics.http.monitor(logger)
|
||||||
|
app.use express.errorHandler()
|
||||||
|
|
||||||
|
app.post '/user/:user_id', controller.addNotification
|
||||||
|
app.get '/user/:user_id', controller.getUsersNotifications
|
||||||
|
app.del '/user/:user_id/notification_id/:notification_id', controller.removeNotification
|
||||||
|
|
||||||
|
app.get '/status', (req, res)->
|
||||||
|
res.send('notifications sharelatex up')
|
||||||
|
|
||||||
|
app.get '/health_check', (req, res)->
|
||||||
|
HealthCheckController.check (err)->
|
||||||
|
if err?
|
||||||
|
logger.err err:err, "error performing health check"
|
||||||
|
res.send 500
|
||||||
|
else
|
||||||
|
res.send 200
|
||||||
|
|
||||||
|
app.get '*', (req, res)->
|
||||||
|
res.send 404
|
||||||
|
|
||||||
|
host = Settings.internal?.notifications?.host || "localhost"
|
||||||
|
port = Settings.internal?.notifications?.port || 3033
|
||||||
|
app.listen port, host, ->
|
||||||
|
logger.info "notifications starting up, listening on #{host}:#{port}"
|
|
@ -0,0 +1,40 @@
|
||||||
|
ObjectId = require("mongojs").ObjectId
|
||||||
|
request = require("request")
|
||||||
|
async = require("async")
|
||||||
|
_ = require("underscore")
|
||||||
|
settings = require("settings-sharelatex")
|
||||||
|
port = settings.internal.notifications.port
|
||||||
|
logger = require "logger-sharelatex"
|
||||||
|
|
||||||
|
|
||||||
|
module.exports =
|
||||||
|
check : (callback)->
|
||||||
|
project_id = ObjectId()
|
||||||
|
user_id = ObjectId(settings.notifications.healthCheck.user_id)
|
||||||
|
notification_key = "smoke-test-notification"
|
||||||
|
getOpts = (endPath)-> {url:"http://localhost:#{port}/user/#{user_id}#{endPath}", timeout:3000}
|
||||||
|
logger.log user_id:user_id, opts:getOpts(), key:notification_key, user_id:user_id, "running health check"
|
||||||
|
jobs = [
|
||||||
|
(cb)->
|
||||||
|
opts = getOpts("/")
|
||||||
|
opts.json = {key: notification_key, messageOpts:'', templateKey:'', user_id:user_id}
|
||||||
|
request.post(opts, cb)
|
||||||
|
(cb)->
|
||||||
|
opts = getOpts("/")
|
||||||
|
opts.json = true
|
||||||
|
request.get opts, (err, res, body)->
|
||||||
|
if res.statusCode != 200
|
||||||
|
return cb("status code not 200, its #{res.statusCode}")
|
||||||
|
|
||||||
|
hasNotification = _.some body, (notification)->
|
||||||
|
notification.key == notification_key and _.contains(notification.user_id, user_id.toString())
|
||||||
|
if hasNotification
|
||||||
|
cb()
|
||||||
|
else
|
||||||
|
cb("notification not found in response")
|
||||||
|
]
|
||||||
|
async.series jobs, (err)->
|
||||||
|
if err?
|
||||||
|
callback(err)
|
||||||
|
opts = getOpts("/notification_id/#{notification_id}")
|
||||||
|
request.del opts, callback
|
26
services/notifications/app/coffee/Notifications.coffee
Normal file
26
services/notifications/app/coffee/Notifications.coffee
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
Settings = require 'settings-sharelatex'
|
||||||
|
logger = require('logger-sharelatex')
|
||||||
|
mongojs = require('mongojs')
|
||||||
|
db = mongojs(Settings.mongo?.url, ['notifications'])
|
||||||
|
|
||||||
|
module.exports =
|
||||||
|
|
||||||
|
getUserUnreadNotifications: (user_id, callback = (err, user)->)->
|
||||||
|
db.notifications.find {"user_id" : user_id}, (err, user)->
|
||||||
|
callback err, user
|
||||||
|
|
||||||
|
addNotification: (user_id, notification, callback)->
|
||||||
|
doc =
|
||||||
|
user_id: user_id
|
||||||
|
key: notification.key
|
||||||
|
messageOpts: notification.messageOpts
|
||||||
|
templateKey: notification.templateKey
|
||||||
|
db.notifications.insert(doc, callback)
|
||||||
|
|
||||||
|
removeNotification: (user_id, notification_key, callback)->
|
||||||
|
searchOps =
|
||||||
|
user_id:user_id
|
||||||
|
key:notification_key
|
||||||
|
updateOperation =
|
||||||
|
"$set": {read:true}
|
||||||
|
db.notifications.update searchOps, updateOperation, callback
|
|
@ -0,0 +1,19 @@
|
||||||
|
Notifications = require("./Notifications")
|
||||||
|
logger = require("logger-sharelatex")
|
||||||
|
|
||||||
|
module.exports =
|
||||||
|
|
||||||
|
getUserNotifications: (req, res)->
|
||||||
|
logger.log user_id: req.params.user_id, "getting user unread notifications"
|
||||||
|
Notifications.getUserUnreadNotifications req.params.user_id, (err, notifications)->
|
||||||
|
res.json(notifications)
|
||||||
|
|
||||||
|
addNotification: (req, res)->
|
||||||
|
logger.log user_id: req.params.user_id, notification:req.body, "adding notification"
|
||||||
|
Notifications.addNotification req.params.user_id, req.body, (err, notifications)->
|
||||||
|
res.send()
|
||||||
|
|
||||||
|
removeNotificacion: (req, res)->
|
||||||
|
logger.log user_id: req.params.user_id, notification_key:req.params.key "removing notification"
|
||||||
|
Notifications.removeNotification req.params.user_id, req.params.key, (err, notifications)->
|
||||||
|
res.send()
|
14
services/notifications/config/settings.defaults.coffee
Normal file
14
services/notifications/config/settings.defaults.coffee
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
module.exports = Settings =
|
||||||
|
internal:
|
||||||
|
notifications:
|
||||||
|
port: 3033
|
||||||
|
host: "localhost"
|
||||||
|
|
||||||
|
mongo:
|
||||||
|
url : 'mongodb://127.0.0.1/sharelatex'
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
healthCheck:
|
||||||
|
user_id: "5620bece05509b0a7a3cbc62"
|
||||||
|
|
||||||
|
|
34
services/notifications/package.json
Normal file
34
services/notifications/package.json
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"name": "notifications-sharelatex",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "An API to handle user notifications",
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"async": "^0.1.22",
|
||||||
|
"express": "3.1.0",
|
||||||
|
"logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.1.0",
|
||||||
|
"metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v1.3.0",
|
||||||
|
"mongojs": "1.3.0",
|
||||||
|
"node-statsd": "0.0.3",
|
||||||
|
"request": "^2.65.0",
|
||||||
|
"settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0",
|
||||||
|
"underscore": "1.4.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"bunyan": "^1.0.0",
|
||||||
|
"chai": "",
|
||||||
|
"grunt": "^0.4.5",
|
||||||
|
"grunt-bunyan": "^0.5.0",
|
||||||
|
"grunt-contrib-clean": "^0.6.0",
|
||||||
|
"grunt-contrib-coffee": "^0.11.0",
|
||||||
|
"grunt-execute": "^0.2.2",
|
||||||
|
"grunt-mocha-test": "^0.11.0",
|
||||||
|
"sandboxed-module": "",
|
||||||
|
"sinon": ""
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
sinon = require('sinon')
|
||||||
|
chai = require('chai')
|
||||||
|
should = chai.should()
|
||||||
|
modulePath = "../../../app/js/NotificationsController.js"
|
||||||
|
SandboxedModule = require('sandboxed-module')
|
||||||
|
assert = require('assert')
|
||||||
|
|
||||||
|
user_id = "51dc93e6fb625a261300003b"
|
||||||
|
notification_key = '123434'
|
||||||
|
|
||||||
|
describe 'Notifications controller', ->
|
|
@ -0,0 +1,30 @@
|
||||||
|
sinon = require('sinon')
|
||||||
|
chai = require('chai')
|
||||||
|
should = chai.should()
|
||||||
|
modulePath = "../../../app/js/Notifications.js"
|
||||||
|
SandboxedModule = require('sandboxed-module')
|
||||||
|
assert = require('assert')
|
||||||
|
|
||||||
|
user_id = "51dc93e6fb625a261300003b"
|
||||||
|
notification_key = '123434'
|
||||||
|
|
||||||
|
describe 'creating a user', ->
|
||||||
|
beforeEach ->
|
||||||
|
self = @
|
||||||
|
@findOneStub = sinon.stub()
|
||||||
|
@findStub = sinon.stub()
|
||||||
|
@saveStub = sinon.stub()
|
||||||
|
@updateStub = sinon.stub()
|
||||||
|
|
||||||
|
@mongojs = =>
|
||||||
|
notifications:
|
||||||
|
update: self.mongojsUpdate
|
||||||
|
find: @findStub
|
||||||
|
findOne: @findOneStub
|
||||||
|
save: @saveStub
|
||||||
|
update: @updateStub
|
||||||
|
|
||||||
|
@repository = SandboxedModule.require modulePath, requires:
|
||||||
|
'logger-sharelatex': log:->
|
||||||
|
'settings-sharelatex': {}
|
||||||
|
'mongojs':@mongojs
|
Loading…
Reference in a new issue