Procházet zdrojové kódy

started sub-document support

Tomislav Cvetic před 8 roky
rodič
revize
7c7461db31

+ 16 - 7
core/RESTController.js

@@ -1,7 +1,5 @@
 /**
  * @module RESTController
- *
- * RESTController for MongoDB.
  */
 import * as debugStuff from 'debug'
 const debug = debugStuff.debug('dbApiRESTCtrl')
@@ -22,7 +20,7 @@ class RESTController {
    * @param  {key} Key to use as index. Default is '_id'
    * @return {null}
    */
-  constructor (model, key = '_id') {
+  constructor (model, key = '_id', subDocuments = {}) {
     this.model = model
     this.modelName = model.modelName.toLowerCase()
     this.key = key
@@ -30,6 +28,7 @@ class RESTController {
     this.findCriteria = {}
     this.extendData = (data) => data
     this.updateExtendedData = (data) => data
+    this.subDocuments = subDocuments
     debug('created RESTController', this.modelName)
   }
 
@@ -142,13 +141,16 @@ class RESTController {
     return p
   }
 
-  route () {
-    const router = new Router()
+  route (parent = undefined) {
+    const router = new Router({mergeParams: true})
 
     router.get('/', (req, res) => {
       this
         .list()
-        .then(data => res.json(data))
+        .then(data => {
+          debug('params, query', parent, req.params, req.query)
+          res.json(data)
+        })
         .catch(error => res.status(404).send(error))
     })
 
@@ -162,7 +164,10 @@ class RESTController {
     router.get('/:key', (req, res) => {
       this
         .read(req.params.key)
-        .then(data => res.json(data))
+        .then(data => {
+          debug('params, query', parent, req.params, req.query)
+          res.json(data)
+        })
         .catch(error => res.status(404).send(error))
     })
 
@@ -180,6 +185,10 @@ class RESTController {
         .catch(error => res.status(404).send(error))
     })
 
+    Object.keys(this.subDocuments).forEach(key => {
+      router.use(`/:pKey/${key}`, this.subDocuments[key].route())
+    })
+
     return router
   }
 }

+ 4 - 1
core/RESTController.test.js

@@ -21,7 +21,10 @@ describe('REST Controller', () => {
   let createdId = null
 
   beforeAll(() => {
-    return mongoose.connect('mongodb://localhost/rest-controller')
+    return mongoose.connect('mongodb://localhost/__test_rest-controller__')
+    Model.remove({}, err => {
+      console.log(err)
+    })
   })
   afterAll(() => {
     Model.remove({}, err => {

+ 12 - 9
core/RestControllerVersioned.js

@@ -1,7 +1,5 @@
 /**
- * @module RESTControllerVersionned
- *
- * RESTController with revision control for MongoDB.
+ * @module RESTControllerVersioned
  */
 import * as debugStuff from 'debug'
 const debug = debugStuff.debug('dbApiRESTCtrlVer')
@@ -13,8 +11,8 @@ const MAX_RESULTS = 100
  * REST controller for MongoDB backend.
  */
 class RESTControllerVersioned extends RESTController {
-  constructor (model, key) {
-    super(model, key)
+  constructor (model, key = '_id', subDocuments = {}) {
+    super(model, key, subDocuments)
     this.filterOptions = { limit: MAX_RESULTS, skip: 0 }
     this.filterCriteria = { '_history.head': true }
     debug('created RESTControllerVersioned', this.modelName)
@@ -23,11 +21,15 @@ class RESTControllerVersioned extends RESTController {
   /**
    * Override create function to support versioning.
    *
+   * This function generates a history object to allow revision control
+   * of the data elements.
+   *
    * @param  {object} data object
    * @return {Promise}
    */
-  create (data, author, version = '', comment = '') {
+  create (data) {
     debug('create data item', data)
+    const { author, version, comment, ...newData } = data
     const history = {
       author,
       created: new Date(),
@@ -36,7 +38,7 @@ class RESTControllerVersioned extends RESTController {
       head: true,
       reference: []
     }
-    const newData = { ...data, _history: history }
+    newData._history = history
     const p = this.model
       .create(newData)
       .then(instance => {
@@ -95,7 +97,7 @@ class RESTControllerVersioned extends RESTController {
    * @param  {String} data
    * @return {Promise}
    */
-  update (tag, data, author, version = '', comment = '') {
+  update (tag, data) {
     if (typeof tag === 'string') {
       tag = { tag: tag }
     }
@@ -112,7 +114,8 @@ class RESTControllerVersioned extends RESTController {
       .then(instance => {
         const { _id, __v, _history, ...oldData } = instance._doc
         debug('creating new data instance', oldData)
-        const newData = { ...oldData, ...data }
+        const { author, version, comment, ...newItems } = data
+        const newData = { ...oldData, ...newItems }
         newData._history = {
           author,
           created: new Date(),

+ 4 - 1
core/RestControllerVersioned.test.js

@@ -34,12 +34,15 @@ describe('REST Controller Versioned', () => {
   let createdId = null
 
   beforeAll(() => {
-    return mongoose.connect('mongodb://localhost/rest-controller')
+    return mongoose.connect('mongodb://localhost/__test_rest-controller_versioned__')
     Model.remove({}, err => {
       console.log(err)
     })
   })
   afterAll(() => {
+    Model.remove({}, err => {
+      console.log(err)
+    })
   })
 
   it('creates an element', () => {

+ 1 - 1
package.json

@@ -6,7 +6,7 @@
   "scripts": {
     "start": "nodemon index.js",
     "test": "jest --watch --env=jsdom .",
-    "doc": "jsdoc -c jsdoc.json -d code_docu -r ."
+    "doc": "jsdoc -c jsdoc.json -d code_docu -r core/"
   },
   "author": "Tomi Cvetic",
   "license": "GPL-3.0",

+ 1 - 12
routeGenModel.js

@@ -16,6 +16,7 @@ const jobSchema = new mongoose.Schema({
 const modelSchema = new mongoose.Schema({
   name: String,
   tag: String,
+  jobs: [jobSchema],
   _history: historySchema
 })
 
@@ -24,15 +25,3 @@ const Job = mongoose.model('Job', jobSchema)
 const Model = mongoose.model('Model', modelSchema)
 
 export { Agency, Job, Model }
-
-export class AgencyController extends RESTController {
-  constructor () {
-    super(Agency, '_id')
-  }
-}
-
-export class ModelController extends RESTController {
-  constructor () {
-    super(Model, 'name')
-  }
-}

+ 7 - 3
server.js

@@ -41,11 +41,15 @@ app.use(bodyParser.json())
 app.use(bodyParser.urlencoded({ extended: true }))
 
 /** Load the submodules */
-// import projects from './projects/route'
-import routeGenModel from './routeGenModel'
+import RESTControllerVersioned from './core/RESTControllerVersioned'
+import RESTController from './core/RESTController'
+import { Model, Job } from './routeGenModel'
+const JobController = new RESTController(Job)
+const ModelController = new RESTControllerVersioned(Model, '_id', { jobs: JobController })
+const modelRouter = ModelController.route()
 
 app.get('/', welcomeRouter)
-// app.use('/projects', projects)
+app.use('/model', modelRouter)
 app.use(/.*/, errorRouter)
 debug('Configured app')