From 836aa8985e3251e1467a822aa5a364885d1bdeaa Mon Sep 17 00:00:00 2001 From: Alexander Menshikov Date: Fri, 22 Apr 2022 23:28:40 +0300 Subject: [PATCH] Use absolute paths for uploads and db (#168) * Use absolute paths for uploads and db * Fix name interference * Add error on auth page * remove space * Support of separated upload folder with absolute path * fix files uploading * remove log * fix comment Co-authored-by: n0str Co-authored-by: Nikita Melnikov --- config/production.json | 2 +- docker-compose.yml | 2 +- src/backend/app.ts | 6 ++++-- src/backend/controllers/transport.ts | 5 ++++- src/backend/models/file.ts | 7 ++++++- src/backend/routes/api/transport.ts | 9 ++++++++- src/backend/utils/database/initDb.ts | 2 +- src/backend/views/auth.twig | 3 +++ src/frontend/js/classes/editor.js | 2 +- 9 files changed, 29 insertions(+), 9 deletions(-) diff --git a/config/production.json b/config/production.json index fc7ab53..4bf24d1 100644 --- a/config/production.json +++ b/config/production.json @@ -2,6 +2,6 @@ "port": 3000, "database": ".db", "rcFile": "./.codexdocsrc", - "uploads": "public/uploads", + "uploads": "/uploads", "secret": "iamasecretstring" } diff --git a/docker-compose.yml b/docker-compose.yml index f07d2a5..56ffa6a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,6 @@ services: volumes: - ./.codexdocsrc:/usr/src/app/.codexdocsrc:ro - ./config/production.json:/usr/src/app/config/production.json:ro - - ./public/uploads:/usr/src/app/public/uploads + - ./public/uploads:/uploads - ./.db:/usr/src/app/.db - /usr/src/app/node_modules diff --git a/src/backend/app.ts b/src/backend/app.ts index 57836d0..5f6f49b 100644 --- a/src/backend/app.ts +++ b/src/backend/app.ts @@ -5,11 +5,12 @@ import morgan from 'morgan'; import rcParser from './utils/rcparser'; import routes from './routes'; import HttpException from './exceptions/httpException'; +import config from 'config'; const app = express(); -const config = rcParser.getConfiguration(); +const localConfig = rcParser.getConfiguration(); -app.locals.config = config; +app.locals.config = localConfig; // view engine setup app.set('views', path.join(__dirname, './', 'views')); app.set('view engine', 'twig'); @@ -20,6 +21,7 @@ app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, '../../public'))); +app.use('/uploads', express.static(config.get('uploads'))); app.use('/', routes); diff --git a/src/backend/controllers/transport.ts b/src/backend/controllers/transport.ts index b8b773e..91c8821 100644 --- a/src/backend/controllers/transport.ts +++ b/src/backend/controllers/transport.ts @@ -34,7 +34,7 @@ class Transport { * @returns {Promise} */ public static async save(multerData: Dict, map: Dict): Promise { - const { originalname: name, path, filename, size, mimetype } = multerData; + const { originalname: name, path, filename, size, mimetype, url } = multerData; const file = new File({ name, @@ -42,6 +42,7 @@ class Transport { path, size, mimetype, + url, }); await file.save(); @@ -95,6 +96,8 @@ class Transport { let response = file.data; + console.log(response) + if (map) { response = Transport.composeResponse(file, map); } diff --git a/src/backend/models/file.ts b/src/backend/models/file.ts index 3ed44ee..794ce0a 100644 --- a/src/backend/models/file.ts +++ b/src/backend/models/file.ts @@ -10,6 +10,7 @@ const filesDb = database['files']; * @property {string} filename - name of uploaded file * @property {string} path - path to uploaded file * @property {string} mimetype - file MIME type + * @property {string} url - file url to access it. Consists of uploads path and file name. * @property {number} size - size of the file in */ export interface FileData { @@ -18,6 +19,7 @@ export interface FileData { filename?: string; path?: string; mimetype?: string; + url?: string; size?: number; [key: string]: string | number | undefined; } @@ -40,6 +42,7 @@ class File { public path?: string; public mimetype?: string; public size?: number; + public url?: string; /** * @class @@ -99,13 +102,14 @@ class File { * @param {FileData} fileData - info about file */ public set data(fileData: FileData) { - const { name, filename, path, mimetype, size } = fileData; + const { name, filename, path, mimetype, size, url } = fileData; this.name = name || this.name; this.filename = filename || this.filename; this.path = path ? this.processPath(path) : this.path; this.mimetype = mimetype || this.mimetype; this.size = size || this.size; + this.url = url || this.url; } /** @@ -121,6 +125,7 @@ class File { path: this.path, mimetype: this.mimetype, size: this.size, + url: this.url, }; } diff --git a/src/backend/routes/api/transport.ts b/src/backend/routes/api/transport.ts index 15219e0..0f99bdd 100644 --- a/src/backend/routes/api/transport.ts +++ b/src/backend/routes/api/transport.ts @@ -77,10 +77,17 @@ router.post('/transport/image', imageUploader, async (req: Request, res: Respons return; } + const fileData = { + ...req.files.image[0], + url: '/uploads/' + req.files.image[0].filename, + }; + + console.log(fileData); + try { Object.assign( response, - await Transport.save(req.files.image[0], req.body.map ? JSON.parse(req.body.map) : undefined) + await Transport.save(fileData, req.body.map ? JSON.parse(req.body.map) : undefined) ); response.success = 1; diff --git a/src/backend/utils/database/initDb.ts b/src/backend/utils/database/initDb.ts index 7475369..b48d4ce 100644 --- a/src/backend/utils/database/initDb.ts +++ b/src/backend/utils/database/initDb.ts @@ -10,7 +10,7 @@ import path from 'path'; */ export default function initDb(name: string): Datastore { return new Datastore({ - filename: path.resolve(`./${config.get('database')}/${name}.db`), + filename: path.resolve(`${config.get('database')}/${name}.db`), autoload: true, }); } \ No newline at end of file diff --git a/src/backend/views/auth.twig b/src/backend/views/auth.twig index d450ce9..93a846d 100644 --- a/src/backend/views/auth.twig +++ b/src/backend/views/auth.twig @@ -8,6 +8,9 @@

Enter a password to access pages editing

+

+ {{ header }} +

diff --git a/src/frontend/js/classes/editor.js b/src/frontend/js/classes/editor.js index afeca67..044a294 100644 --- a/src/frontend/js/classes/editor.js +++ b/src/frontend/js/classes/editor.js @@ -55,7 +55,7 @@ export default class Editor { }, additionalRequestData: { map: JSON.stringify({ - path: 'file:url', + url: 'file:url', size: 'file:size', mimetype: 'file:mime', }),