summaryrefslogtreecommitdiff
path: root/node_modules/revalidator/example/webservice.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/revalidator/example/webservice.js')
-rw-r--r--node_modules/revalidator/example/webservice.js204
1 files changed, 204 insertions, 0 deletions
diff --git a/node_modules/revalidator/example/webservice.js b/node_modules/revalidator/example/webservice.js
new file mode 100644
index 0000000..33d5f0e
--- /dev/null
+++ b/node_modules/revalidator/example/webservice.js
@@ -0,0 +1,204 @@
+//
+// (C) 2011, Nodejitsu Inc.
+// MIT License
+//
+// A simple web service for storing JSON data via REST
+//
+// GET - View Object
+// POST - Create Object
+// PUT - Update Object
+// DELETE - Delete Object
+//
+
+var revalidator = require('../'),
+ http = require('http'),
+//
+// Keep our objects in a simple memory store
+//
+ memoryStore = {},
+//
+// Set up our request schema
+//
+ schema = {
+ properties: {
+ url: {
+ description: 'the url the object should be stored at',
+ type: 'string',
+ pattern: '^/[^#%&*{}\\:<>?\/+]+$',
+ required: true
+ },
+ challenge: {
+ description: 'a means of protecting data (insufficient for production, used as example)',
+ type: 'string',
+ minLength: 5
+ },
+ body: {
+ description: 'what to store at the url',
+ type: 'any',
+ default: null
+ }
+ }
+ }
+
+var server = http.createServer(function validateRestRequest (req, res) {
+ req.method = req.method.toUpperCase();
+
+ //
+ // Log the requests
+ //
+ console.log(req.method, req.url);
+
+ //
+ // Buffer the request so it can be parsed as JSON
+ //
+ var requestBody = [];
+ req.on('data', function addDataToBody (data) {
+ requestBody.push(data);
+ });
+
+ //
+ // Once the request has ended work with the body
+ //
+ req.on('end', function dealWithRest () {
+
+ //
+ // Parse the JSON
+ //
+ requestBody = requestBody.join('');
+ if ({POST: 1, PUT: 1}[req.method]) {
+ try {
+ requestBody = JSON.parse(requestBody);
+ }
+ catch (e) {
+ res.writeHead(400);
+ res.end(e);
+ return;
+ }
+ }
+ else {
+ requestBody = {};
+ }
+
+ //
+ // If this was sent to a url but the body url was not declared
+ // Make sure the body get the requested url so that our schema
+ // validates before we work on it
+ //
+ if (!requestBody.url) {
+ requestBody.url = req.url;
+ }
+
+ //
+ // Don't let users override the main API endpoint
+ //
+ if (requestBody.url === '/') {
+ res.writeHead(400);
+ res.end('Cannot override the API endpoint "/"');
+ return;
+ }
+
+ //
+ // See if our request and target are out of sync
+ // This lets us double check the url we are about to take up
+ // if we choose to send the request to the url directly
+ //
+ if (req.url !== '/' && requestBody.url !== req.url) {
+ res.writeHead(400);
+ res.end('Requested url and actual url do not match');
+ return;
+ }
+
+ //
+ // Validate the schema
+ //
+ var validation = revalidator.validate(requestBody, schema);
+ if (!validation.valid) {
+ res.writeHead(400);
+ res.end(validation.errors.join('\n'));
+ return;
+ }
+
+ //
+ // Grab the current value from storage and
+ // check if it is a valid state for REST
+ //
+ var storedValue = memoryStore[requestBody.url];
+ if (req.method === 'POST') {
+ if (storedValue) {
+ res.writeHead(400);
+ res.end('ALREADY EXISTS');
+ return;
+ }
+ }
+ else if (!storedValue) {
+ res.writeHead(404);
+ res.end('DOES NOT EXIST');
+ return;
+ }
+
+ //
+ // Check our challenge
+ //
+ if (storedValue && requestBody.challenge != storedValue.challenge) {
+ res.writeHead(403);
+ res.end('NOT AUTHORIZED');
+ return;
+ }
+
+ //
+ // Since revalidator only checks and does not manipulate
+ // our object we need to set up the defaults our selves
+ // For an easier solution to this please look at Flatiron's
+ // `Resourceful` project
+ //
+ if (requestBody.body === undefined) {
+ requestBody.body = schema.properties.body.default;
+ }
+
+ //
+ // Use REST to determine how to manipulate the stored
+ // values
+ //
+ switch (req.method) {
+
+ case "GET":
+ res.writeHead(200);
+ var result = storedValue.body;
+ res.end(JSON.stringify(result));
+ return;
+
+ case "POST":
+ res.writeHead(201);
+ res.end();
+ memoryStore[requestBody.url] = requestBody;
+ return;
+
+ case "DELETE":
+ delete memoryStore[requestBody.url];
+ res.writeHead(200);
+ res.end();
+ return;
+
+ case "PUT":
+ memoryStore[requestBody.url] = requestBody;
+ res.writeHead(200);
+ res.end();
+ return;
+
+ default:
+ res.writeHead(400);
+ res.end('Invalid Http Verb');
+ return;
+ }
+ });
+})
+//
+// Listen to various ports depending on environment we are being run on
+//
+server.listen(process.env.PORT || process.env.C9_PORT || 1337, function reportListening () {
+
+ console.log('JSON REST Service listening on port', this.address().port);
+ console.log('Requests can be sent via REST to "/" if they conform to the following schema:');
+ console.log(JSON.stringify(schema, null, ' '));
+
+}); \ No newline at end of file