From 4ed7271b1eca560fbad60c240cad23e85ac286f8 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Fri, 29 Jun 2012 10:36:01 +0200 Subject: o Adding examples from the specification. --- app.js | 4 ++ .../examples/from-spec/collection.collection+json | 66 ++++++++++++++++++++++ public/examples/from-spec/error.collection+json | 12 ++++ public/examples/from-spec/item.collection+json | 26 +++++++++ public/examples/from-spec/minimal.collection+json | 7 +++ public/examples/from-spec/queries.collection+json | 14 +++++ public/examples/from-spec/template.collection+json | 15 +++++ routes/index.js | 57 ++++++++++++------- views/index.jade | 17 +++++- 9 files changed, 196 insertions(+), 22 deletions(-) create mode 100644 public/examples/from-spec/collection.collection+json create mode 100644 public/examples/from-spec/error.collection+json create mode 100644 public/examples/from-spec/item.collection+json create mode 100644 public/examples/from-spec/minimal.collection+json create mode 100644 public/examples/from-spec/queries.collection+json create mode 100644 public/examples/from-spec/template.collection+json diff --git a/app.js b/app.js index 509fcef..788679d 100644 --- a/app.js +++ b/app.js @@ -2,6 +2,10 @@ var express = require('express') , routes = require('./routes') , http = require('http'); +express.mime.define({ + 'application/vnd.collection+json': ['collection+json'] +}); + var app = express(); app.configure(function(){ diff --git a/public/examples/from-spec/collection.collection+json b/public/examples/from-spec/collection.collection+json new file mode 100644 index 0000000..db57931 --- /dev/null +++ b/public/examples/from-spec/collection.collection+json @@ -0,0 +1,66 @@ +{ "collection" : + { + "version" : "1.0", + "href" : "http://example.org/friends/", + + "links" : [ + {"rel" : "feed", "href" : "http://example.org/friends/rss"} + ], + + "items" : [ + { + "href" : "http://example.org/friends/jdoe", + "data" : [ + {"name" : "full-name", "value" : "J. Doe", "prompt" : "Full Name"}, + {"name" : "email", "value" : "jdoe@example.org", "prompt" : "Email"} + ], + "links" : [ + {"rel" : "blog", "href" : "http://examples.org/blogs/jdoe", "prompt" : "Blog"}, + {"rel" : "avatar", "href" : "http://examples.org/images/jdoe", "prompt" : "Avatar", "render" : "image"} + ] + }, + + { + "href" : "http://example.org/friends/msmith", + "data" : [ + {"name" : "full-name", "value" : "M. Smith", "prompt" : "Full Name"}, + {"name" : "email", "value" : "msmith@example.org", "prompt" : "Email"} + ], + "links" : [ + {"rel" : "blog", "href" : "http://examples.org/blogs/msmith", "prompt" : "Blog"}, + {"rel" : "avatar", "href" : "http://examples.org/images/msmith", "prompt" : "Avatar", "render" : "image"} + ] + }, + + { + "href" : "http://example.org/friends/rwilliams", + "data" : [ + {"name" : "full-name", "value" : "R. Williams", "prompt" : "Full Name"}, + {"name" : "email", "value" : "rwilliams@example.org", "prompt" : "Email"} + ], + "links" : [ + {"rel" : "blog", "href" : "http://examples.org/blogs/rwilliams", "prompt" : "Blog"}, + {"rel" : "avatar", "href" : "http://examples.org/images/rwilliams", "prompt" : "Avatar", "render" : "image"} + ] + } + ], + + "queries" : [ + {"rel" : "search", "href" : "http://example.org/friends/search", "prompt" : "Search", + "data" : [ + {"name" : "search", "value" : ""} + ] + } + ], + + "template" : { + "data" : [ + {"name" : "full-name", "value" : "", "prompt" : "Full Name"}, + {"name" : "email", "value" : "", "prompt" : "Email"}, + {"name" : "blog", "value" : "", "prompt" : "Blog"}, + {"name" : "avatar", "value" : "", "prompt" : "Avatar"} + + ] + } + } +} diff --git a/public/examples/from-spec/error.collection+json b/public/examples/from-spec/error.collection+json new file mode 100644 index 0000000..bd67e3e --- /dev/null +++ b/public/examples/from-spec/error.collection+json @@ -0,0 +1,12 @@ +{ "collection" : + { + "version" : "1.0", + "href" : "http://example.org/friends/", + + "error" : { + "title" : "Server Error", + "code" : "X1C2", + "message" : "The server have encountered an error, please wait and try again." + } + } +} diff --git a/public/examples/from-spec/item.collection+json b/public/examples/from-spec/item.collection+json new file mode 100644 index 0000000..8f93af6 --- /dev/null +++ b/public/examples/from-spec/item.collection+json @@ -0,0 +1,26 @@ +{ "collection" : + { + "version" : "1.0", + "href" : "http://example.org/friends/", + + "links" : [ + {"rel" : "feed", "href" : "http://example.org/friends/rss"}, + {"rel" : "queries", "href" : "http://example.org/friends/?queries"}, + {"rel" : "template", "href" : "http://example.org/friends/?template"} + ], + + "items" : [ + { + "href" : "http://example.org/friends/jdoe", + "data" : [ + {"name" : "full-name", "value" : "J. Doe", "prompt" : "Full Name"}, + {"name" : "email", "value" : "jdoe@example.org", "prompt" : "Email"} + ], + "links" : [ + {"rel" : "blog", "href" : "http://examples.org/blogs/jdoe", "prompt" : "Blog"}, + {"rel" : "avatar", "href" : "http://examples.org/images/jdoe", "prompt" : "Avatar", "render" : "image"} + ] + } + ] + } +} diff --git a/public/examples/from-spec/minimal.collection+json b/public/examples/from-spec/minimal.collection+json new file mode 100644 index 0000000..2e2e65d --- /dev/null +++ b/public/examples/from-spec/minimal.collection+json @@ -0,0 +1,7 @@ +{ "collection" : + { + "version" : "1.0", + + "href" : "http://example.org/friends/" + } +} diff --git a/public/examples/from-spec/queries.collection+json b/public/examples/from-spec/queries.collection+json new file mode 100644 index 0000000..1a3227d --- /dev/null +++ b/public/examples/from-spec/queries.collection+json @@ -0,0 +1,14 @@ +{ "collection" : + { + "version" : "1.0", + "href" : "http://example.org/friends/", + + "queries" : [ + {"rel" : "search", "href" : "http://example.org/friends/search", "prompt" : "Search" + "data" : [ + {"name" : "search", "value" : ""} + ] + } + ] + } +} diff --git a/public/examples/from-spec/template.collection+json b/public/examples/from-spec/template.collection+json new file mode 100644 index 0000000..df16225 --- /dev/null +++ b/public/examples/from-spec/template.collection+json @@ -0,0 +1,15 @@ +{ "collection" : + { + "version" : "1.0", + "href" : "http://example.org/friends/", + + "template" : { + "data" : [ + {"name" : "full-name", "value" : "", "prompt" : "Full Name"}, + {"name" : "email", "value" : "", "prompt" : "Email"}, + {"name" : "blog", "value" : "", "prompt" : "Blog"}, + {"name" : "avatar", "value" : "", "prompt" : "Avatar"} + ] + } + } +} diff --git a/routes/index.js b/routes/index.js index 1a05e39..0bd432d 100644 --- a/routes/index.js +++ b/routes/index.js @@ -3,34 +3,53 @@ var http = require('http') , collection_json = require('collection_json'); exports.index = function(req, res){ - res.render('index', { title: 'Express' }); + res.render('index', { + title: 'Collection+JSON Explorer', + host: req.headers.host, + examples: [ + "minimal", + "collection", + "item", + "queries", + "template", + "error" + ] + }); }; exports.render = function(req, res){ - var options = url.parse(req.query.url); - options.method = 'GET'; - options.headers = { - accept: 'application/vnd.collection+json' - }; - var clientReq = http.request(options, function(clientRes) { - clientRes.setEncoding('utf8'); - var body = ''; - clientRes.on('data', function (chunk) { - body += chunk; - }); - clientRes.on('end', function (chunk) { + fetchCollection(req.query.url, function(err, headers, body) { + if(err) { + res.render('index', { title: 'Failed to render ' + req.query.url }); + } + else { var parsedBody = JSON.parse(body); var doc = collection_json.fromObject(parsedBody); res.render('data', { url: req.query.url, doc: doc, - headers: clientRes.headers, + headers: headers, raw: body, formattedRaw: JSON.stringify(parsedBody, null, ' ') }); - }); - }); - clientReq.on('error', function() { - res.render('index', { title: 'Failed to render ' + req.query.url }); + } }); - clientReq.end(); }; + +function fetchCollection(u, cb) { + var options = url.parse(u); + options.headers = { + accept: 'application/vnd.collection+json' + }; + var req = http.get(options, function(res) { + res.setEncoding('utf8'); + var body = ''; + res.on('data', function (chunk) { + body += chunk; + }); + res.on('end', function (chunk) { + cb(undefined, res.headers, body); + }); + }).on('error', function() { + cb('Unable to fetch ' + u); + }); +} diff --git a/views/index.jade b/views/index.jade index af774d4..86cfffa 100644 --- a/views/index.jade +++ b/views/index.jade @@ -3,8 +3,19 @@ extends layout block content h1 Collection+JSON Explorer - form(action="/render") + h2 Explore your own collection + form(action='/render') p label URL: - input(name="url", value="http://p2k12.bitraf.no/checkins-trygvis.php") - input(type="submit", value="Render") + input(name='url', value='http://p2k12.bitraf.no/checkins-trygvis.php') + input(type='submit', value='Render') + + h2 Examples + + p Taken from + a(url='http://amundsen.com/media-types/collection/examples/') Mike Admundsen's examples + + each example in examples + form(action='/render') + input(name='url', type='hidden', value='http://#{host}/examples/from-spec/#{example}.collection+json') + input(type='submit', value='#{example}') -- cgit v1.2.3