Jelajahi Sumber

working on subdoc rest controller.

Tomi Cvetic 8 tahun lalu
induk
melakukan
433bc0a801

+ 3 - 11
core/RESTController.js

@@ -3,8 +3,6 @@
  */
 import * as debugStuff from 'debug'
 const debug = debugStuff.debug('dbApiRESTCtrl')
-import mongoose from 'mongoose'
-mongoose.Promise = Promise
 import { Router } from 'express'
 
 const MAX_RESULTS = 100
@@ -147,10 +145,7 @@ class RESTController {
     router.get('/', (req, res) => {
       this
         .list()
-        .then(data => {
-          debug('params, query', parent, req.params, req.query)
-          res.json(data)
-        })
+        .then(data => res.json(data))
         .catch(error => res.status(404).send(error))
     })
 
@@ -164,10 +159,7 @@ class RESTController {
     router.get('/:key', (req, res) => {
       this
         .read(req.params.key)
-        .then(data => {
-          debug('params, query', parent, req.params, req.query)
-          res.json(data)
-        })
+        .then(data => res.json(data))
         .catch(error => res.status(404).send(error))
     })
 
@@ -186,7 +178,7 @@ class RESTController {
     })
 
     Object.keys(this.subDocuments).forEach(key => {
-      router.use(`/:pKey/${key}`, this.subDocuments[key].route())
+      router.use(`/:parentKey/${key}`, this.subDocuments[key].route())
     })
 
     return router

+ 1 - 0
core/RESTController.test.js

@@ -1,6 +1,7 @@
 import * as dotenv from 'dotenv'
 dotenv.config()
 import mongoose from 'mongoose'
+mongoose.Promise = Promise
 import RESTController from './RESTController'
 import { Model } from '../routeGenModel'
 

+ 141 - 0
core/RESTControllerSubdoc.js

@@ -0,0 +1,141 @@
+/**
+ * @module RESTControllerSubdoc
+ */
+import * as debugStuff from 'debug'
+const debug = debugStuff.debug('dbApiRESTCtrlSubdoc')
+
+const MAX_RESULTS = 100
+
+/**
+ * REST controller for MongoDB sub-documents.
+ */
+class RESTControllerSubdoc {
+  /**
+   * Generates a controller for a model type.
+   *
+   * @param  {mongoose.Model} mongoose model to use
+   * @param  {key} Key to use as index. Default is '_id'
+   * @return {null}
+   */
+  constructor (model, key = '_id') {
+    this.model = model
+    this.modelName = model.modelName.toLowerCase()
+    this.key = key
+    this.findOptions = {}
+    this.findCriteria = {}
+    this.extendData = (data) => data
+    this.updateExtendedData = (data) => data
+    debug('created RESTController', this.modelName)
+  }
+
+  /**
+   * Creates a DB item.
+   *
+   * @param  {object} data object
+   * @return {Promise}
+   */
+  create (data) {
+    debug('create data item', data)
+    const newData = this.extendData(data)
+    const p = this.model
+      .create(newData)
+      .then(instance => {
+        debug('created instance', instance)
+        return instance
+      })
+    // debug('create return value', p)
+    return p
+  }
+
+  /**
+   * Read a DB item.
+   *
+   * @param  {String} id
+   * @return {Promise}
+   */
+  read (id) {
+    debug('reading data item', id)
+    const filter = {}
+    filter[this.key] = id
+
+    const p = this.model
+      .findOne(filter)
+      .then(instance => {
+        debug('read instance', instance)
+        return instance
+      })
+    // debug('read return value', p)
+    return p
+  }
+
+  /**
+   * Get a list of all DB items.
+   *
+   * @return {Promise}
+   */
+  list () {
+    debug('reading data list')
+    const p = this.model
+      .find({})
+      .limit(MAX_RESULTS)
+      .then(instance => {
+        debug('read list instance', instance)
+        return instance
+      })
+    // debug('read return value', p)
+    return p
+  }
+
+  /**
+   * Update a DB item.
+   *
+   * @param  {String} id
+   * @param  {String} data
+   * @return {Promise}
+   */
+  update (id, data) {
+    debug('update data item', id, data)
+    const filter = {}
+    filter[this.key] = id
+
+    const p = this.model
+      .findOne(filter)
+      .then(instance => {
+        debug('found data instance', instance)
+        for (let attribute in data) {
+          if (data.hasOwnProperty(attribute) && attribute !== this.key && attribute !== '_id') {
+            instance[attribute] = data[attribute]
+          }
+        }
+        return instance.save()
+      })
+      .then(instance => {
+        debug('updated data instance', instance)
+        return instance
+      })
+    // debug('read return value', p)
+    return p
+  }
+
+  /**
+   * Delete a DB item.
+   *
+   * @param  {String} id
+   * @return {Promise}
+   */
+  delete (id) {
+    debug('delete data item')
+    const filter = {}
+    filter[this.key] = id
+
+    const p = this.model
+      .remove(filter)
+      .then(() => {
+        return {}
+      })
+    // debug('read return value', p)
+    return p
+  }
+}
+
+export default RESTControllerSubdoc

+ 0 - 0
core/RestControllerVersioned.js → core/RESTControllerVersioned.js


+ 1 - 0
core/RestControllerVersioned.test.js → core/RESTControllerVersioned.test.js

@@ -1,6 +1,7 @@
 import * as dotenv from 'dotenv'
 dotenv.config()
 import mongoose from 'mongoose'
+mongoose.Promise = Promise
 import RESTControllerVersioned from './RESTControllerVersioned'
 import { Model } from '../routeGenModel'
 

+ 2 - 1
server.js

@@ -9,6 +9,7 @@ const http = require('http')
 debug(' - Loaded http')
 // const oauthserver = require('oauth2-server')
 const mongoose = require('mongoose')
+mongoose.Promise = Promise
 debug(' - Loaded mongoose')
 
 /** Create the express app */
@@ -29,7 +30,7 @@ debug('Connected DB')
 
 function welcomeRouter (req, res) {
   res.status(200)
-  res.json({ message: 'Welcome to the AutoMate DB API!' })
+  res.json({ message: 'Welcome to the MongoDB API!' })
 }
 function errorRouter (req, res) {
   res.status(404)