You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2019/07/25 15:27:58 UTC

[sling-whiteboard] 01/04: Default renderers

This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit 625b57c580c42e93ad6da06f577f02e135a88f45
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 25 11:24:18 2019 +0200

    Default renderers
---
 serverless-microsling/lib/render.js          | 57 ++++++++++++++++++++++++----
 serverless-microsling/lib/resolve-content.js |  6 ++-
 serverless-microsling/microsling.js          | 13 ++++---
 3 files changed, 61 insertions(+), 15 deletions(-)

diff --git a/serverless-microsling/lib/render.js b/serverless-microsling/lib/render.js
index 74f6c3f..72cb2eb 100644
--- a/serverless-microsling/lib/render.js
+++ b/serverless-microsling/lib/render.js
@@ -16,10 +16,33 @@
 
  /* eslint-disable no-console */
 
-async function render(context) {
-  const resource = context.content.resource.content;
-  console.log(resource);
-  const markup = `
+const defaultTextRenderer = {
+  contentType: 'text/plain',
+  appliesTo : (resourceType, extension) => {
+    return extension == 'txt';
+  },
+  render : (resource) => {
+    return `${resource.title}\n${resource.body}\n`;
+  },
+}
+
+const defaultJsonRenderer = {
+  contentType: 'application/json',
+  appliesTo : (resourceType, extension) => {
+    return extension == 'json';
+  },
+  render : (resource) => {
+    return JSON.stringify(resource, 2, null);
+  },
+}
+
+const defaultHtmlRenderer = {
+  contentType: 'text/html',
+  appliesTo : (resourceType, extension) => {
+    return extension == 'html';
+  },
+  render : (resource) => {
+    return `
     <html>
     <head>
     <title>${resource.title}</title>
@@ -32,10 +55,28 @@ async function render(context) {
     </body>
     </html>
   `;
-  context.response.body = markup;
-  context.response.headers = {
-    'Content-Type': 'text/html',
-  };
+  },
+}
+
+const renderers = [
+  defaultTextRenderer,
+  defaultHtmlRenderer,
+  defaultJsonRenderer
+];
+
+async function render(context) {
+  const resource = context.content.resource.content;
+  if(context.debug) {
+    console.log(`rendering for resourceType ${resource.resourceType} extension ${context.request.extension}`);
+  }
+  renderers
+  .filter(r => r.appliesTo(resource.resourceType, context.request.extension))
+  .forEach(r => {
+    context.response.body = r.render(resource);
+    context.response.headers = {
+      'Content-Type': r.contentType
+    };
+  });
   return context;
 }
 
diff --git a/serverless-microsling/lib/resolve-content.js b/serverless-microsling/lib/resolve-content.js
index d40a894..dc1ad3c 100644
--- a/serverless-microsling/lib/resolve-content.js
+++ b/serverless-microsling/lib/resolve-content.js
@@ -17,9 +17,13 @@
 /* eslint-disable no-console */
 
 const fs = require('fs');
+const localFileSuffix = '.json';
 
 async function resolveContent(context) {
-  const filePath = `../content${context.request.path}`;
+  const parts = context.request.path.split('.');
+  context.request.extension = parts.pop();
+  context.request.resourcePath = parts.join('.');
+  const filePath = `../content${context.request.resourcePath}${localFileSuffix}`;
   return new Promise(resolve => {
     try {
       fs.readFile(require.resolve(filePath), (err, text) => {
diff --git a/serverless-microsling/microsling.js b/serverless-microsling/microsling.js
index cb7943c..c9de1b9 100644
--- a/serverless-microsling/microsling.js
+++ b/serverless-microsling/microsling.js
@@ -20,24 +20,24 @@ const { resolveContent } = require('./lib/resolve-content.js');
 const { render } = require('./lib/render.js');
 
 function main (params) {
-  const { debug } = params;
   const context = {
     request : {
       path: params.__ow_path,
     },
     response: {},
-    content: {}
+    content: {},
+    debug: params.debug
   };
 
   return new Promise(function (resolvePromise) {
-    if(debug) console.log(`start: ${JSON.stringify(context, 2, null)}`);
+    if(context.debug) console.log(`start: ${JSON.stringify(context, 2, null)}`);
     resolveContent(context)
     .then(context => {
-      if(debug) console.log(`pre-render: ${JSON.stringify(context, 2, null)}`);
+      if(context.debug) console.log(`pre-render: ${JSON.stringify(context, 2, null)}`);
       return render(context);
     })
     .then(context => {
-      if(debug) console.log(`pre-resolve: ${JSON.stringify(context, 2, null)}`);
+      if(context.debug) console.log(`pre-resolve: ${JSON.stringify(context, 2, null)}`);
       return resolvePromise(context.response);
     })
     .catch(e => {
@@ -60,9 +60,10 @@ const shellExec= async (input) => {
 if (require.main === module) {
   shellExec({
     // eslint-disable-next-line no-undef
+    debug: process.argv[3] || false,
+    // eslint-disable-next-line no-undef
     __ow_path: process.argv[2],
     __ow_method: 'get',
-    debug: false
   });
 }