summaryrefslogtreecommitdiff
path: root/app/node_modules/okadminview/index.js
diff options
context:
space:
mode:
authorSean Fridman <fridman@mail.sfsu.edu>2015-04-08 23:43:35 -0400
committerSean Fridman <fridman@mail.sfsu.edu>2015-04-08 23:44:17 -0400
commit62ee0595346e5254c10083e43346be40dbb96d70 (patch)
tree8c70d1256edcf64c844af702296a7c5f1252716f /app/node_modules/okadminview/index.js
parentf8f9c515cd9c413323f64692fd0528877a8fceed (diff)
Properly handle and display form errors
Diffstat (limited to 'app/node_modules/okadminview/index.js')
-rw-r--r--app/node_modules/okadminview/index.js67
1 files changed, 29 insertions, 38 deletions
diff --git a/app/node_modules/okadminview/index.js b/app/node_modules/okadminview/index.js
index 1dcc0d6..8b17995 100644
--- a/app/node_modules/okadminview/index.js
+++ b/app/node_modules/okadminview/index.js
@@ -1,3 +1,4 @@
+var assign = require('object-assign')
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
var Q = require('q');
@@ -108,7 +109,6 @@ function OKAdminView(options) {
}
});
-
router.get('/:type/:id/', function readResource(req, res, next) {
var type = req.params.type || '';
var id = req.params.id || '';
@@ -120,7 +120,7 @@ function OKAdminView(options) {
resource: resource,
query: id
});
- fetchResourceTemplateData(meta, query, transform).then(function(data) {
+ fetchResourceTemplateData(meta, query, getResourceTemplateData).then(function(data) {
if (!data) {
resourceMissingHandler(req, res)()
} else {
@@ -129,25 +129,6 @@ function OKAdminView(options) {
}).fail(errorHandler(req, res));
}
- function transform(meta, resource, data) {
- meta = meta || {};
- resource = resource || {};
- data = data || {};
- var spec = Object.keys(resource.spec).reduce(function(cache, prop) {
- var propSpec = resource.spec[prop];
- var value = data[prop];
- cache[prop].id = data[resource.idField];
- cache[prop].value = value;
- return cache;
- }, resource.spec);
- return {
- meta: meta,
- resource: {
- type: resource.type,
- spec: spec
- }
- };
- }
});
router.post('/:type/', function createResource(req, res, next) {
@@ -158,21 +139,14 @@ function OKAdminView(options) {
errorHandler(req, res)(new Error('No such resource ' + type));
} else {
meta.get().then(function(metadata) {
- var templateData = {
- meta: metadata,
- resource: {
- type: resource.type,
- spec: resource.spec,
- data: data
- }
- };
try {
resource.assertValid(data);
resource.create(data).then(function(created) {
res.redirect(303, data[resource.idField]);
}).fail(errorHandler(req, res));
} catch (errors) {
- view.renderResource(req, res, templateData);
+ var templateData = getResourceTemplateData(metadata, resource, data);
+ view.renderResource(req, res, assign(templateData, {errors: errors}));
}
}).fail(errorHandler(req, res));;
}
@@ -188,20 +162,14 @@ function OKAdminView(options) {
} else {
// TODO Prob should make metadata synchronous...
meta.get().then(function(metadata) {
- var templateData = {
- meta: metadata,
- resource: {
- spec: resource.spec,
- data: data
- }
- };
try {
resource.assertValid(data);
resource.update(id, data).then(function(updated) {
res.redirect(303, '../' + updated[resource.idField]);
}).fail(errorHandler(req, res));
} catch (errors) {
- view.renderResource(req, res, templateData);
+ var templateData = getResourceTemplateData(metadata, resource, data);
+ view.renderResource(req, res, assign(templateData, {errors: errors}));
}
}).fail(errorHandler(req, res));
}
@@ -211,6 +179,29 @@ function OKAdminView(options) {
}
}
+/**
+ * Get template data for a single resource
+ */
+function getResourceTemplateData(meta, resource, data) {
+ meta = meta || {};
+ resource = resource || {};
+ data = data || {};
+ var spec = Object.keys(resource.spec).reduce(function(cache, prop) {
+ var propSpec = resource.spec[prop];
+ var value = data[prop];
+ cache[prop].id = data[resource.idField];
+ cache[prop].value = value;
+ return cache;
+ }, resource.spec);
+ return {
+ meta: meta,
+ resource: {
+ type: resource.type,
+ spec: spec
+ }
+ };
+}
+
OKAdminView.prototype.middleware = function() {
return this._middleware;
};