Server: add requests stats endpoint
authorChocobozzz <florian.bigard@gmail.com>
Mon, 19 Sep 2016 19:33:46 +0000 (21:33 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Mon, 19 Sep 2016 19:33:46 +0000 (21:33 +0200)
server/controllers/api/v1/index.js
server/controllers/api/v1/requests.js [new file with mode: 0644]
server/initializers/constants.js
server/models/request.js
server/tests/api/check-params.js
server/tests/api/requests.js [new file with mode: 0644]

index af41bc280d06001b09b8de6c0c23e7d030056b61..2e4fb2dab5bebff8f09ce0b94a408c517341d6e0 100644 (file)
@@ -7,12 +7,14 @@ const router = express.Router()
 const clientsController = require('./clients')
 const podsController = require('./pods')
 const remoteController = require('./remote')
+const requestsController = require('./requests')
 const usersController = require('./users')
 const videosController = require('./videos')
 
 router.use('/clients', clientsController)
 router.use('/pods', podsController)
 router.use('/remote', remoteController)
+router.use('/requests', requestsController)
 router.use('/users', usersController)
 router.use('/videos', videosController)
 router.use('/*', badRequest)
diff --git a/server/controllers/api/v1/requests.js b/server/controllers/api/v1/requests.js
new file mode 100644 (file)
index 0000000..6018bb4
--- /dev/null
@@ -0,0 +1,38 @@
+'use strict'
+
+const express = require('express')
+const mongoose = require('mongoose')
+
+const constants = require('../../../initializers/constants')
+const middlewares = require('../../../middlewares')
+const admin = middlewares.admin
+const oAuth = middlewares.oauth
+
+const Request = mongoose.model('Request')
+
+const router = express.Router()
+
+router.get('/stats',
+  oAuth.authenticate,
+  admin.ensureIsAdmin,
+  getStatsRequests
+)
+
+// ---------------------------------------------------------------------------
+
+module.exports = router
+
+// ---------------------------------------------------------------------------
+
+function getStatsRequests (req, res, next) {
+  Request.list(function (err, requests) {
+    if (err) return next(err)
+
+    const remainingMilliSeconds = constants.REQUESTS_INTERVAL - (Date.now() % constants.REQUESTS_INTERVAL)
+
+    return res.json({
+      requests: requests,
+      remainingMilliSeconds: remainingMilliSeconds
+    })
+  })
+}
index dd4eff493eff068a18382f3f437262e42191312d..76ebb8681d971c7c595cf11954988b4a3566d7de 100644 (file)
@@ -55,7 +55,7 @@ const FRIEND_SCORE = {
 }
 
 // Time to wait between requests to the friends (10 min)
-let INTERVAL = 600000
+let REQUESTS_INTERVAL = 600000
 
 const OAUTH_LIFETIME = {
   ACCESS_TOKEN: 3600 * 4, // 4 hours
@@ -109,7 +109,7 @@ const USER_ROLES = {
 // Special constants for a test instance
 if (isTestInstance() === true) {
   FRIEND_SCORE.BASE = 20
-  INTERVAL = 10000
+  REQUESTS_INTERVAL = 10000
   CONSTRAINTS_FIELDS.VIDEOS.DURATION.max = 14
 }
 
@@ -121,7 +121,7 @@ module.exports = {
   CONFIG: CONFIG,
   CONSTRAINTS_FIELDS: CONSTRAINTS_FIELDS,
   FRIEND_SCORE: FRIEND_SCORE,
-  INTERVAL: INTERVAL,
+  REQUESTS_INTERVAL: REQUESTS_INTERVAL,
   OAUTH_LIFETIME: OAUTH_LIFETIME,
   PAGINATION_COUNT_DEFAULT: PAGINATION_COUNT_DEFAULT,
   PODS_SCORE: PODS_SCORE,
index 4d521919a11185fd4cb3c522bd1f99be1e6061f3..4e510e18aec84d040aeea42092f63374369e5d11 100644 (file)
@@ -19,14 +19,15 @@ let timer = null
 
 const RequestSchema = mongoose.Schema({
   request: mongoose.Schema.Types.Mixed,
-  to: [ { type: mongoose.Schema.Types.ObjectId, ref: 'users' } ]
+  to: [ { type: mongoose.Schema.Types.ObjectId, ref: 'Pod' } ]
 })
 
 RequestSchema.statics = {
   activate,
   deactivate,
   flush,
-  forceSend
+  forceSend,
+  list
 }
 
 RequestSchema.pre('save', function (next) {
@@ -53,7 +54,7 @@ mongoose.model('Request', RequestSchema)
 
 function activate () {
   logger.info('Requests scheduler activated.')
-  timer = setInterval(makeRequests.bind(this), constants.INTERVAL)
+  timer = setInterval(makeRequests.bind(this), constants.REQUESTS_INTERVAL)
 }
 
 function deactivate () {
@@ -72,6 +73,10 @@ function forceSend () {
   makeRequests.call(this)
 }
 
+function list (callback) {
+  this.find({ }, callback)
+}
+
 // ---------------------------------------------------------------------------
 
 // Make a requests to friends of a certain type
index f060b2ad4d97fca8b7655a31f9740f797de90a95..a696bc171795d512e14db6bf9856355b4ac07ee0 100644 (file)
@@ -13,6 +13,7 @@ const usersUtils = require('../utils/users')
 
 describe('Test parameters validator', function () {
   let server = null
+  let userAccessToken = null
 
   // ---------------------------------------------------------------
 
@@ -496,7 +497,6 @@ describe('Test parameters validator', function () {
   describe('Of the users API', function () {
     const path = '/api/v1/users/'
     let userId = null
-    let userAccessToken = null
 
     describe('When listing users', function () {
       it('Should fail with a bad start pagination', function (done) {
@@ -721,6 +721,25 @@ describe('Test parameters validator', function () {
     })
   })
 
+  describe('Of the requests API', function () {
+    const path = '/api/v1/requests/stats'
+
+    it('Should fail with an non authenticated user', function (done) {
+      request(server.url)
+        .get(path)
+        .set('Accept', 'application/json')
+        .expect(401, done)
+    })
+
+    it('Should fail with a non admin user', function (done) {
+      request(server.url)
+        .get(path)
+        .set('Authorization', 'Bearer ' + userAccessToken)
+        .set('Accept', 'application/json')
+        .expect(403, done)
+    })
+  })
+
   after(function (done) {
     process.kill(-server.app.pid)
 
diff --git a/server/tests/api/requests.js b/server/tests/api/requests.js
new file mode 100644 (file)
index 0000000..af36f6e
--- /dev/null
@@ -0,0 +1,128 @@
+'use strict'
+
+const chai = require('chai')
+const each = require('async/each')
+const expect = chai.expect
+const request = require('supertest')
+
+const loginUtils = require('../utils/login')
+const podsUtils = require('../utils/pods')
+const serversUtils = require('../utils/servers')
+const videosUtils = require('../utils/videos')
+
+describe('Test requests stats', function () {
+  const path = '/api/v1/requests/stats'
+  let servers = []
+
+  function uploadVideo (server, callback) {
+    const name = 'my super video'
+    const description = 'my super description'
+    const tags = [ 'tag1', 'tag2' ]
+    const fixture = 'video_short.webm'
+
+    videosUtils.uploadVideo(server.url, server.accessToken, name, description, tags, fixture, callback)
+  }
+
+  function getRequestsStats (server, callback) {
+    request(server.url)
+      .get(path)
+      .set('Accept', 'application/json')
+      .set('Authorization', 'Bearer ' + server.accessToken)
+      .expect(200)
+      .end(callback)
+  }
+
+  // ---------------------------------------------------------------
+
+  before(function (done) {
+    this.timeout(20000)
+    serversUtils.flushAndRunMultipleServers(2, function (serversRun, urlsRun) {
+      servers = serversRun
+
+      each(servers, function (server, callbackEach) {
+        loginUtils.loginAndGetAccessToken(server, function (err, accessToken) {
+          if (err) return callbackEach(err)
+
+          server.accessToken = accessToken
+          callbackEach()
+        })
+      }, function (err) {
+        if (err) throw err
+
+        const server1 = servers[0]
+        podsUtils.makeFriends(server1.url, server1.accessToken, done)
+      })
+    })
+  })
+
+  it('Should have a correct timer', function (done) {
+    const server = servers[0]
+
+    getRequestsStats(server, function (err, res) {
+      if (err) throw err
+
+      const body = res.body
+      expect(body.remainingMilliSeconds).to.be.at.least(0)
+      expect(body.remainingMilliSeconds).to.be.at.most(10000)
+
+      done()
+    })
+  })
+
+  it('Should have the correct request', function (done) {
+    this.timeout(15000)
+
+    const server = servers[0]
+    // Ensure the requests of pod 1 won't be made
+    servers[1].app.kill()
+
+    uploadVideo(server, function (err) {
+      if (err) throw err
+
+      getRequestsStats(server, function (err, res) {
+        if (err) throw err
+
+        const body = res.body
+        expect(body.requests).to.have.lengthOf(1)
+
+        const request = body.requests[0]
+        expect(request.to).to.have.lengthOf(1)
+        expect(request.request.type).to.equal('add')
+
+        // Wait one cycle
+        setTimeout(done, 10000)
+      })
+    })
+  })
+
+  it('Should have the correct requests', function (done) {
+    const server = servers[0]
+
+    uploadVideo(server, function (err) {
+      if (err) throw err
+
+      getRequestsStats(server, function (err, res) {
+        if (err) throw err
+
+        const body = res.body
+        expect(body.requests).to.have.lengthOf(2)
+
+        const request = body.requests[1]
+        expect(request.to).to.have.lengthOf(1)
+        expect(request.request.type).to.equal('add')
+
+        done()
+      })
+    })
+  })
+
+  after(function (done) {
+    process.kill(-servers[0].app.pid)
+
+    if (this.ok) {
+      serversUtils.flushTests(done)
+    } else {
+      done()
+    }
+  })
+})