From 23a5e38e023b986dbe93a4643d08130966244f71 Mon Sep 17 00:00:00 2001 From: azivner Date: Fri, 5 Jan 2018 23:54:02 -0500 Subject: [PATCH] added basic support for uploading and serving files --- migrations/0063__image_table.sql | 11 +++++++ routes/api/image.js | 51 ++++++++++++++++++++++++++++++++ routes/routes.js | 2 ++ services/app_info.js | 2 +- 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 migrations/0063__image_table.sql create mode 100644 routes/api/image.js diff --git a/migrations/0063__image_table.sql b/migrations/0063__image_table.sql new file mode 100644 index 000000000..7a3d6932e --- /dev/null +++ b/migrations/0063__image_table.sql @@ -0,0 +1,11 @@ +CREATE TABLE images +( + image_id TEXT PRIMARY KEY NOT NULL, + format TEXT NOT NULL, + checksum TEXT NOT NULL, + name TEXT NOT NULL, + data BLOB, + is_deleted INT NOT NULL DEFAULT 0, + date_modified TEXT NOT NULL, + date_created TEXT NOT NULL +); \ No newline at end of file diff --git a/routes/api/image.js b/routes/api/image.js new file mode 100644 index 000000000..240edf53b --- /dev/null +++ b/routes/api/image.js @@ -0,0 +1,51 @@ +"use strict"; + +const express = require('express'); +const router = express.Router(); +const sql = require('../../services/sql'); +const auth = require('../../services/auth'); +const utils = require('../../services/utils'); +const multer = require('multer')(); + +router.get('/:imageId/:filename', auth.checkApiAuth, async (req, res, next) => { + const image = await sql.getFirst("SELECT * FROM images WHERE image_id = ?", [req.params.imageId]); + + if (!image) { + return res.status(404).send({}); + } + + res.set('Content-Type', 'image/' + image.format); + + res.send(image.data); +}); + +router.post('/upload', auth.checkApiAuth, multer.single('upload'), async (req, res, next) => { + const file = req.file; + console.log("File: ", file); + + const imageId = utils.newNoteId(); + + if (!file.mimetype.startsWith("image/")) { + return req.send("Unknown image type: " + file.mimetype); + } + + const now = utils.nowDate(); + + await sql.insert("images", { + image_id: imageId, + format: file.mimetype.substr(6), + name: file.originalname, + checksum: utils.hash(file.buffer), + data: file.buffer, + is_deleted: 0, + date_modified: now, + date_created: now + }); + + res.send({ + uploaded: true, + url: `/api/image/${imageId}/${file.originalname}` + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/routes.js b/routes/routes.js index 5617f4a2e..e64505b63 100644 --- a/routes/routes.js +++ b/routes/routes.js @@ -24,6 +24,7 @@ const setupApiRoute = require('./api/setup'); const sqlRoute = require('./api/sql'); const anonymizationRoute = require('./api/anonymization'); const cleanupRoute = require('./api/cleanup'); +const imageRoute = require('./api/image'); function register(app) { app.use('/', indexRoute); @@ -51,6 +52,7 @@ function register(app) { app.use('/api/sql', sqlRoute); app.use('/api/anonymization', anonymizationRoute); app.use('/api/cleanup', cleanupRoute); + app.use('/api/image', imageRoute); } module.exports = { diff --git a/services/app_info.js b/services/app_info.js index c3092206f..a88013462 100644 --- a/services/app_info.js +++ b/services/app_info.js @@ -3,7 +3,7 @@ const build = require('./build'); const packageJson = require('../package'); -const APP_DB_VERSION = 62; +const APP_DB_VERSION = 63; module.exports = { app_version: packageJson.version,