From 7137bf227e1490f5d356474b29885b22cb4a79a0 Mon Sep 17 00:00:00 2001 From: Lakshmi C Rajeev Date: Fri, 29 Nov 2019 12:30:07 +0530 Subject: [PATCH 1/6] Media-server --- package.json | 3 +- packages/media-server/db/data-model.cds | 13 ++++ packages/media-server/index.cds | 15 ---- packages/media-server/package.json | 3 +- packages/media-server/srv/media-service.cds | 8 ++ packages/media-server/srv/media-service.js | 83 +++++++++++++++++++++ 6 files changed, 108 insertions(+), 17 deletions(-) create mode 100644 packages/media-server/db/data-model.cds delete mode 100644 packages/media-server/index.cds create mode 100644 packages/media-server/srv/media-service.cds create mode 100644 packages/media-server/srv/media-service.js diff --git a/package.json b/package.json index 08b90658..a9230648 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "bookshop": "cds watch packages/bookshop", "bookstore": "cds watch packages/bookstore", "products-service": "cds watch packages/products-service", - "reviews-service": "cds watch packages/reviews-service" + "reviews-service": "cds watch packages/reviews-service", + "media-server": "cds watch packages/media-server" }, "dependencies": { "@sap/cds": "latest", diff --git a/packages/media-server/db/data-model.cds b/packages/media-server/db/data-model.cds new file mode 100644 index 00000000..2ad6c28e --- /dev/null +++ b/packages/media-server/db/data-model.cds @@ -0,0 +1,13 @@ +namespace sap.capire.media; + +entity Media { + + key id:Integer; + @Core.MediaType: mediaType + content : LargeBinary ; + + @Core.IsMediaType: true + mediaType : String; + fileName : String; + applicationName:String; +} \ No newline at end of file diff --git a/packages/media-server/index.cds b/packages/media-server/index.cds deleted file mode 100644 index 552aaf97..00000000 --- a/packages/media-server/index.cds +++ /dev/null @@ -1,15 +0,0 @@ -namespace sap.capire.media; - -service MediaServer { - entity Images { - key url : URL; - type : String enum { jpeg; png; gif; }; - content : Image; - } -} - -type ImageURL : URL; -// type ImageURL : Association to MediaServer.Images; -//> would need Assotiations targeting off service to turn into references w/ foreign keys -type Image : LargeBinary @stream; -type URL : String(222); diff --git a/packages/media-server/package.json b/packages/media-server/package.json index 8c5de4d5..873ff5ea 100644 --- a/packages/media-server/package.json +++ b/packages/media-server/package.json @@ -6,6 +6,7 @@ "license": "SAP SAMPLE CODE LICENSE", "dependencies": { "@sap/cds": "latest", - "express": "*" + "express": "*", + "lokijs": "^1.5.6" } } diff --git a/packages/media-server/srv/media-service.cds b/packages/media-server/srv/media-service.cds new file mode 100644 index 00000000..09441897 --- /dev/null +++ b/packages/media-server/srv/media-service.cds @@ -0,0 +1,8 @@ +using { sap.capire.media as db } from '../db/data-model'; +namespace sap.capire.media; + +service MediaServer { + entity Media as projection on db.Media ; +} + + \ No newline at end of file diff --git a/packages/media-server/srv/media-service.js b/packages/media-server/srv/media-service.js new file mode 100644 index 00000000..5f62d865 --- /dev/null +++ b/packages/media-server/srv/media-service.js @@ -0,0 +1,83 @@ +module.exports = (srv) => { + + var loki = require('lokijs'); + var db = new loki('DB'); + var mediaDB= db.addCollection("Media"); + var Readable = require('stream').Readable; + var PassThroughStream = require('stream').PassThrough; + + srv.before('CREATE', 'Media', (req) => { + var obj = mediaDB.insert({media: ""}); + req.data.id=obj.$loki; + }) + + srv.on ('UPDATE', 'Media', async (req,next) => { + try{ + var url = req._.req.path; + if (url.indexOf("content")>0) { + const id = req.data.id; + var obj = mediaDB.get(id); + if(obj==null) { + req.reject(404,"No record found for the ID"); + return; + } + var stream = new PassThroughStream(); + let chunks = []; + stream.on('data', (chunk) => { + chunks.push(chunk); + }); + stream.on('end', () =>{ + obj.media = Buffer.concat(chunks).toString('base64'); + mediaDB.update(obj); + }); + req.data.content.pipe(stream); + } else return next() + }catch(error){ + req.reject(404,"Media DB error") + console.log(error) + return + } + }) + + srv.on("READ","Media", (req,next)=>{ + try{ + var url = req._.req.path; + if (url.indexOf("content")>0) { + const id = req.data.id; + if(mediaDB.get(id)==null) { + req.reject(404,"Media not found for the ID"); + return ; + } + var decodedMedia = new Buffer( mediaDB.get(id).media.split(';base64,').pop(), 'base64'); + return _formatResult(decodedMedia); + } + else return next() //> delegate to next/default handlers + }catch(error){ + req.reject(404,"Media DB error") + return + } + }) + + srv.on("DELETE","Media", (req,next)=>{ + try{ + const id = req.data.id; + var obj=mediaDB.get(id); + if(obj!=null) { + mediaDB.remove(obj) + } + return next() //> delegate to next/default handlers + }catch(error){ + req.reject(404,"Media DB error ") + } + }) + + function _formatResult (decodedMedia) { + var readable= new Readable + var result = new Array() + readable.push(decodedMedia) + readable.push(null) + result.push({value:readable}) + return result + } + + } \ No newline at end of file From 9205e0893ad6e02d1b478d63841eae1a7540b552 Mon Sep 17 00:00:00 2001 From: Lakshmi C Rajeev Date: Mon, 2 Dec 2019 15:27:38 +0530 Subject: [PATCH 2/6] Update media-service.js --- packages/media-server/srv/media-service.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/media-server/srv/media-service.js b/packages/media-server/srv/media-service.js index 5f62d865..26800d8f 100644 --- a/packages/media-server/srv/media-service.js +++ b/packages/media-server/srv/media-service.js @@ -1,10 +1,9 @@ module.exports = (srv) => { - var loki = require('lokijs'); - var db = new loki('DB'); - var mediaDB= db.addCollection("Media"); - var Readable = require('stream').Readable; - var PassThroughStream = require('stream').PassThrough; + const loki = require('lokijs'); + const db = new loki('DB'); + const mediaDB= db.addCollection("Media"); + const { Readable, PassThrough } = require('stream') srv.before('CREATE', 'Media', (req) => { var obj = mediaDB.insert({media: ""}); @@ -21,7 +20,7 @@ module.exports = (srv) => { req.reject(404,"No record found for the ID"); return; } - var stream = new PassThroughStream(); + var stream = new PassThrough(); let chunks = []; stream.on('data', (chunk) => { chunks.push(chunk); @@ -80,4 +79,4 @@ module.exports = (srv) => { return result } - } \ No newline at end of file + } From f9a7aa59de19434a3d94a0b9ab7b103d291fbcc1 Mon Sep 17 00:00:00 2001 From: Lakshmi C Rajeev Date: Thu, 19 Dec 2019 10:43:22 +0530 Subject: [PATCH 3/6] Update media-service.js --- packages/media-server/srv/media-service.js | 76 +++++++++++----------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/packages/media-server/srv/media-service.js b/packages/media-server/srv/media-service.js index 26800d8f..132765ac 100644 --- a/packages/media-server/srv/media-service.js +++ b/packages/media-server/srv/media-service.js @@ -1,26 +1,25 @@ module.exports = (srv) => { - const loki = require('lokijs'); const db = new loki('DB'); - const mediaDB= db.addCollection("Media"); + const mediaDB = db.addCollection("Media"); const { Readable, PassThrough } = require('stream') srv.before('CREATE', 'Media', (req) => { - var obj = mediaDB.insert({media: ""}); - req.data.id=obj.$loki; + const obj = mediaDB.insert({ media: "" }); + req.data.id = obj.$loki; }) - srv.on ('UPDATE', 'Media', async (req,next) => { + srv.on('UPDATE', 'Media', (req, next) => { try{ - var url = req._.req.path; + const url = req._.req.path; if (url.indexOf("content")>0) { const id = req.data.id; - var obj = mediaDB.get(id); + const obj = mediaDB.get(id); if(obj==null) { req.reject(404,"No record found for the ID"); return; } - var stream = new PassThrough(); + const stream = new PassThrough(); let chunks = []; stream.on('data', (chunk) => { chunks.push(chunk); @@ -36,47 +35,48 @@ module.exports = (srv) => { console.log(error) return } - }) - srv.on("READ","Media", (req,next)=>{ - try{ - var url = req._.req.path; - if (url.indexOf("content")>0) { - const id = req.data.id; - if(mediaDB.get(id)==null) { - req.reject(404,"Media not found for the ID"); - return ; + }) + + srv.on("READ", "Media", (req, next) => { + try { + const url = req._.req.path; + if (url.indexOf("content") > 0) { + const id = req.data.id; + if (mediaDB.get(id) == null) { + req.reject(404, "Media not found for the ID"); + return; } - var decodedMedia = new Buffer( mediaDB.get(id).media.split(';base64,').pop(), 'base64'); + const decodedMedia = new Buffer(mediaDB.get(id).media.split(';base64,').pop(), 'base64'); return _formatResult(decodedMedia); } else return next() //> delegate to next/default handlers - }catch(error){ - req.reject(404,"Media DB error") - return + } catch (error) { + req.reject(404, "Media DB error") + return } - }) + }) - srv.on("DELETE","Media", (req,next)=>{ - try{ - const id = req.data.id; - var obj=mediaDB.get(id); - if(obj!=null) { + srv.on("DELETE", "Media", (req, next) => { + try { + const id = req.data.id; + const obj = mediaDB.get(id); + if (obj != null) { mediaDB.remove(obj) } return next() //> delegate to next/default handlers - }catch(error){ - req.reject(404,"Media DB error ") + } catch (error) { + req.reject(404, "Media DB error ") } - }) + }) - function _formatResult (decodedMedia) { - var readable= new Readable - var result = new Array() + function _formatResult(decodedMedia) { + const readable = new Readable + const result = new Array() readable.push(decodedMedia) - readable.push(null) - result.push({value:readable}) - return result - } + readable.push(null) + result.push({ value: readable }) + return result + } - } +} From 630bb2b19c27e961ec5ac5bd091c3d0516718b0f Mon Sep 17 00:00:00 2001 From: Lakshmi C Rajeev Date: Thu, 19 Dec 2019 10:59:57 +0530 Subject: [PATCH 4/6] Update package.json --- packages/media-server/package.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/media-server/package.json b/packages/media-server/package.json index 873ff5ea..c144037d 100644 --- a/packages/media-server/package.json +++ b/packages/media-server/package.json @@ -8,5 +8,17 @@ "@sap/cds": "latest", "express": "*", "lokijs": "^1.5.6" + }, + "files": [ + "db", + "srv", + "index.cds" + ], + "cds": { + "requires": { + "db": { + "kind": "sql" + } + } } } From cd808c76dd0583f108f66ce00434cf41ea77503b Mon Sep 17 00:00:00 2001 From: Lakshmi C Rajeev Date: Fri, 3 Jan 2020 14:07:17 +0530 Subject: [PATCH 5/6] Update media-service.js --- packages/media-server/srv/media-service.js | 138 +++++++++------------ 1 file changed, 62 insertions(+), 76 deletions(-) diff --git a/packages/media-server/srv/media-service.js b/packages/media-server/srv/media-service.js index 132765ac..f70d3b90 100644 --- a/packages/media-server/srv/media-service.js +++ b/packages/media-server/srv/media-service.js @@ -1,82 +1,68 @@ -module.exports = (srv) => { - const loki = require('lokijs'); - const db = new loki('DB'); - const mediaDB = db.addCollection("Media"); - const { Readable, PassThrough } = require('stream') +const loki = require('lokijs') +const db = new loki('DB') +const mediaDB = db.addCollection('Media') +const { Readable, PassThrough } = require('stream') - srv.before('CREATE', 'Media', (req) => { - const obj = mediaDB.insert({ media: "" }); - req.data.id = obj.$loki; - }) +module.exports = srv => { + srv.before('CREATE', 'Media', req => { + const obj = mediaDB.insert({ media: '' }) + req.data.id = obj.$loki + }) - srv.on('UPDATE', 'Media', (req, next) => { - try{ - const url = req._.req.path; - if (url.indexOf("content")>0) { - const id = req.data.id; - const obj = mediaDB.get(id); - if(obj==null) { - req.reject(404,"No record found for the ID"); - return; - } - const stream = new PassThrough(); - let chunks = []; - stream.on('data', (chunk) => { - chunks.push(chunk); - }); - stream.on('end', () =>{ - obj.media = Buffer.concat(chunks).toString('base64'); - mediaDB.update(obj); - }); - req.data.content.pipe(stream); - } else return next() - }catch(error){ - req.reject(404,"Media DB error") - console.log(error) - return - } + srv.on('UPDATE', 'Media', (req, next) => { + const url = req._.req.path + if (url.includes('content')) { + const id = req.data.id + const obj = mediaDB.get(id) + if (!obj) { + req.reject(404, 'No record found for the ID') + return + } + const stream = new PassThrough() + const chunks = [] + stream.on('data', chunk => { + chunks.push(chunk) + }) + stream.on('end', () => { + obj.media = Buffer.concat(chunks).toString('base64') + mediaDB.update(obj) + }) + req.data.content.pipe(stream) + } else return next() + }) - }) + srv.on('READ', 'Media', (req, next) => { + const url = req._.req.path + if (url.includes('content')) { + const id = req.data.id + const mediaObj = mediaDB.get(id) + if (!mediaObj) { + req.reject(404, 'Media not found for the ID') + return + } + const decodedMedia = new Buffer( + mediaObj.media.split(';base64,').pop(), + 'base64' + ) + return _formatResult(decodedMedia) + } else return next() //> delegate to next/default handlers + }) - srv.on("READ", "Media", (req, next) => { - try { - const url = req._.req.path; - if (url.indexOf("content") > 0) { - const id = req.data.id; - if (mediaDB.get(id) == null) { - req.reject(404, "Media not found for the ID"); - return; - } - const decodedMedia = new Buffer(mediaDB.get(id).media.split(';base64,').pop(), 'base64'); - return _formatResult(decodedMedia); - } - else return next() //> delegate to next/default handlers - } catch (error) { - req.reject(404, "Media DB error") - return - } - }) - - srv.on("DELETE", "Media", (req, next) => { - try { - const id = req.data.id; - const obj = mediaDB.get(id); - if (obj != null) { - mediaDB.remove(obj) - } - return next() //> delegate to next/default handlers - } catch (error) { - req.reject(404, "Media DB error ") - } - }) - - function _formatResult(decodedMedia) { - const readable = new Readable - const result = new Array() - readable.push(decodedMedia) - readable.push(null) - result.push({ value: readable }) - return result - } + srv.on('DELETE', 'Media', (req, next) => { + const id = req.data.id + mediaDB + .chain() + .find({ $loki: id }) + .remove() + return next() //> delegate to next/default handlers + }) + function _formatResult (decodedMedia) { + const readable = new Readable() + const result = new Array() + readable.push(decodedMedia) + readable.push(null) + result.push({ value: readable }) + return result + } } From ba72d7f478cc97d825c75b8f9579eba2018b5fd7 Mon Sep 17 00:00:00 2001 From: Lakshmi C Rajeev Date: Fri, 3 Jan 2020 14:29:53 +0530 Subject: [PATCH 6/6] Update package.json --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index a9230648..ac556d5f 100644 --- a/package.json +++ b/package.json @@ -5,24 +5,24 @@ "author": "daniel.hutzel@sap.com", "private": true, "scripts": { - "cleanup": "lerna clean -y && rm -fr node_modules", - "install": "(npm -s run lerna) && lerna bootstrap --hoist", "lerna": "npx --no-install lerna -v > /dev/null || npm i lerna --no-save", - "test": "jest", - "bookshop-enhanced": "cds watch packages/bookshop-enhanced", + "install": "(npm -s run lerna) && lerna bootstrap --hoist", + "cleanup": "lerna clean -y && rm -fr node_modules", "bookshop": "cds watch packages/bookshop", - "bookstore": "cds watch packages/bookstore", - "products-service": "cds watch packages/products-service", + "bookshop-enhanced": "cds watch packages/bookshop-enhanced", "reviews-service": "cds watch packages/reviews-service", + "bookstore": "cds watch packages/bookstore", "media-server": "cds watch packages/media-server" }, "dependencies": { "@sap/cds": "latest", "express": "*" }, + "devDependencies": { + "sqlite3": "*" + }, "--add-these-to-devDependencies-for-tests": { "@types/jest": "*", - "sqlite3": "*", "jest": "*" }, "license": "SAP SAMPLE CODE LICENSE"