From 7137bf227e1490f5d356474b29885b22cb4a79a0 Mon Sep 17 00:00:00 2001 From: Lakshmi C Rajeev Date: Fri, 29 Nov 2019 12:30:07 +0530 Subject: [PATCH] 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