Explorar el Código

Refactor sanitize, bug fixes

Alan Colon hace 7 años
padre
commit
7e6cdf730a
Se han modificado 4 ficheros con 40 adiciones y 21 borrados
  1. 19 10
      app/crud/pages/details.js
  2. 1 1
      auto-crud/app-factory.js
  3. 9 9
      lib/crud/controller.js
  4. 11 1
      lib/util.js

+ 19 - 10
app/crud/pages/details.js

@@ -7,24 +7,24 @@ const { dollarIcon, dropdownIcon } = require('../../assets')
  */
 const details = (opts) => {
 
-  const hideCriteria = column => column.routeParam ? `ctrl.$routeParams.${column.routeParam} !== '${opts.paramAll}'` : 'false'
+  const hideCriteria = column => column.routeParam ? `$ctrl.$routeParams.${column.routeParam} !== '${opts.paramAll}'` : 'false'
 
   const autocompleteInput = column => {
     if (!column.apiPrefix) throw new Error('apiPrefix is required for autocomplete fields')
 
     return html`
       <md-autocomplete flex
-        md-selected-item="ctrl.autocomplete.${raw(column.camelName)}.selectedItem"
-        md-search-text="ctrl.autocomplete.${raw(column.camelName)}.searchText"
-        md-items="item in ctrl.autocomplete.${raw(column.camelName)}.getItems(ctrl.autocomplete.${raw(column.camelName)}.searchText)"
+        md-selected-item="$ctrl.autocomplete.${raw(column.camelName)}.selectedItem"
+        md-search-text="$ctrl.autocomplete.${raw(column.camelName)}.searchText"
+        md-items="item in $ctrl.autocomplete.${raw(column.camelName)}.getItems($ctrl.autocomplete.${raw(column.camelName)}.searchText)"
         md-item-text="item.name || item.key || item.id"
         md-require-match="true"
-        md-selected-item-change="ctrl.autocomplete.${raw(column.camelName)}.onChange()"
+        md-selected-item-change="$ctrl.autocomplete.${raw(column.camelName)}.onChange()"
         md-min-length="0"
         placeholder="${column.titleName}"
         ng-hide="${hideCriteria(column)}">
         <md-item-template>
-          <span md-highlight-text="ctrl.searchText.${raw(column.camelName)}" md-highlight-flags="^i">{{item.name || item.key || item.id}}</span>
+          <span md-highlight-text="$ctrl.searchText.${raw(column.camelName)}" md-highlight-flags="^i">{{item.name || item.key || item.id}}</span>
         </md-item-template>
       </md-autocomplete>
     `
@@ -37,7 +37,7 @@ const details = (opts) => {
       <md-input-container>
         <label>${column.titleName}</label>
         <md-select ng-model="model.${raw(column.camelName)}" multiple>
-          <md-option ng-repeat="item in ::ctrl.multiSelect.${raw(column.camelName)}.items" value="{{item.key}}">
+          <md-option ng-repeat="item in ::$ctrl.multiSelect.${raw(column.camelName)}.items" value="{{item.key}}">
             {{item.name || item.key}}
           </md-option>
         </md-select>
@@ -106,8 +106,8 @@ const details = (opts) => {
   }
 
   const template = html`
-      <app-user-area title-text="${opts.titles && opts.titles.details ? `{{ctrl.titleFn(ctrl)}}` : `${opts.titleName} Details`}">
-        <form name="form" ng-submit="ctrl.submit()" layout="column" layout-margin
+      <app-user-area title-text="${opts.titles && opts.titles.details ? `{{$ctrl.titleFn($ctrl)}}` : `${opts.titleName} Details`}">
+        <form name="form" ng-submit="$ctrl.submit()" layout="column" layout-margin
           flex-xs="100"
           flex-sm="100"
           flex-md="70"
@@ -126,9 +126,14 @@ const details = (opts) => {
   app.component(`app${opts.pascalName}DetailsPage`, {
 
     template,
-    controllerAs: 'ctrl',
     controller: function(api, $scope, $routeParams, $mdToast, $location, $q, util) {
       this.titleFn = opts.titles && opts.titles.details
+      this.$scope = $scope
+      this.$mdToast = $mdToast
+      this.$location = $location
+      this.$q = $q
+      this.util = util
+      this.api = api
       this.$routeParams = $routeParams
       this.template = template // For inspection purposes
 
@@ -228,6 +233,10 @@ const details = (opts) => {
         ms.toggle = (key) =>
           ms.set.has(key) ? ms.remove(key) : ms.add(key)
       })
+
+      if (opts.controllers && opts.controllers.details) {
+        opts.controllers.details.apply(this)
+      }
     }
   })
 }

+ 1 - 1
auto-crud/app-factory.js

@@ -12,7 +12,7 @@ const appFactory = () => {
       if (crud.addRoutes !== false) {
         $routeProvider.crudRoutes(crud)
       }
-   })
+    })
   })
 
   app.service('cruds', function() {

+ 9 - 9
lib/crud/controller.js

@@ -1,7 +1,7 @@
 const _ = require('lodash')
 const defaults = require('./defaults')
 const { Op } = require('sequelize')
-const { diffBy } = require('../util')
+const { diffBy, sanitize } = require('../util')
 const { sequelize } = require('../database')
 
 const crudController = (opts) => {
@@ -34,14 +34,14 @@ const crudController = (opts) => {
         [field.fieldName]: { [Op.like]: `%${req.query.q}%` }
       }))
       const where = { ...subset, [Op.or]: or }
-      const data = (await Type.findAll({ where })).map(d => d.sanitize ? d.sanitize() : d)
+      const data = await sanitize(req, await Type.findAll({ where }))
       res.status(200).send(data)
     } else if (res.query && res.query.ids) {
       const ids = res.query.ids.split(',')
-      const data = (await Type.findAll({where: { ...(await subset(req)), id: { [Op.in]: ids }}})).map(d => d.sanitize ? d.sanitize() : d)
+      const data = await sanitize(req, await Type.findAll({where: { ...(await subset(req)), id: { [Op.in]: ids }}}))
       res.status(200).send(data)
     } else {
-      const data = (await Type.findAll({where: { ...(await subset(req)) }})).map(d => d.sanitize ? d.sanitize() : d)
+      const data = await sanitize(req, await Type.findAll({where: { ...(await subset(req)) }}))
       res.status(200).send(data)
     }
   }
@@ -82,7 +82,7 @@ const crudController = (opts) => {
       const data = (await Type.create(record, {transaction}))
       await setAssociations(record, data, transaction)
       await transaction.commit()
-      res.status(200).send(data && data.sanitize ? data.sanitize() : data)
+      res.status(200).send(await sanitize(req, data))
     } catch (err) {
       await transaction.rollback()
       throw err
@@ -90,7 +90,7 @@ const crudController = (opts) => {
   }
   const read = async (req, res) => {
     const data = (await Type.findOne({where: {id: req.params[opts.routeParam]}}))
-    const json = data && (data.sanitize ? data.sanitize() : data.toJSON())
+    const json = await sanitize(req, data)
     await getAssociations(data, json)
     res.status(200).send(json)
   }
@@ -100,7 +100,7 @@ const crudController = (opts) => {
       const record = _.omit(req.body, _.keys(await subset(req)))
       const updated = (await Type.update(record, { where: { id: req.params[opts.routeParam] }, transaction }))
       const data = (await Type.findOne({where: { id: req.params[opts.routeParam] }}))
-      const json = data && (data.sanitize ? data.sanitize() : data.toJSON())
+      const json = await sanitize(req, data)
 
       await setAssociations(record, data, transaction)
       await transaction.commit()
@@ -124,14 +124,14 @@ const crudController = (opts) => {
         deletedAt: { [Op.ne]: null }
       }
     }))
-    res.status(200).send(data && data.sanitize ? data.sanitize() : data)
+    res.status(200).send(await sanitize(req, data))
   }
   const undelete = async (req, res) => {
     const data = (await Type.update({ deletedAt: null }, {
       paranoid: false,
       where: { id: req.params[opts.routeParam] }
     }))
-    res.status(200).send(data && data.sanitize ? data.sanitize() : data)
+    res.status(200).send(await sanitize(req, data))
   }
   // TODO: Create, Read, Update, Delete
 

+ 11 - 1
lib/util.js

@@ -21,7 +21,17 @@ const diffBy = (before, after, selector) => {
   }
 }
 
+const sanitize = _.curry(async (req, data) => {
+  if (data) {
+    if (Array.isArray(data)) return Promise.all(data.map(sanitize(req)))
+    if (data.sanitize) return await data.sanitize(req)
+    if (data.toJSON) return data.toJSON()
+  }
+  return data
+})
+
 module.exports = {
   fillPath,
-  diffBy
+  diffBy,
+  sanitize
 }