import { Signale } from 'signale'; import ConfigHandler from './assets/configHandler'; import express, { Request, Response } from 'express'; import * as Eta from 'eta'; import { PrismaClient } from '@prisma/client'; import { Status, Category } from '@prisma/client'; import * as Path from 'path'; import * as fs from 'fs'; import routes from './routes/index.js' // Get app directory. const __path = process.argv[1]; const logger_settings = { disabled: false, logLevel: 'info', scope: 'Core', stream: process.stdout, displayFilename: true }; const coreLogger = new Signale(logger_settings); const log = { core: coreLogger, db: coreLogger.scope('DB'), web: coreLogger.scope('WEB') }; // Create a new config instance. const config = new ConfigHandler(__path + '/config.json', { db_connection_string: 'mysql://USER:PASSWORD@HOST:3306/DATABASE', http_listen_address: '127.0.0.1', http_port: 3000 }); const prisma = new PrismaClient({ datasources: { db: { url: config.global.db_connection_string } } }); const app = express(); app.get('/dev/fillWithDemoData', (req, res) => { // fill database with demo data prisma.StorageBuilding.create({ data: { name: "Test Storage Building", street: "Test Street", houseNumber: "1", zipCode: "12345", city: "Test City", country: "Test Country", } }).then(() => { prisma.StorageLocation.create({ data: { name: "Test Storage Location", StorageBuilding: { connect: { id: 1 } } } }).then(() => { prisma.item .create({ data: { SKU: 'ee189749', Amount: 1, name: 'Test Item', manufacturer: 'Test Manufacturer', category: Category.Other, status: Status.normal, storageLocation: { connect: { id: 1 } }, } }) .then(() => { res.send('Demo data added'); }) .catch((err) => { res.send('Error adding demo data: ' + err); }); }) }) res.send('Demo data added (not)'); }); app.get('/:id', (req, res) => { // retrieve data from database using id from url prisma.item .findFirst({ where: { SKU: req.params.id } }) .then((item) => { if (item) { Eta.renderFile(__path + '/src/frontend/publicInfoPage.eta.html', item).then((html) => { res.send(html); }); } else { res.send('Item not found'); } }); }); // Load from allowsStaticPaths.json file const allowedURLs: Array = JSON.parse(fs.readFileSync("allowedStaticPaths.json", "utf8")).allowedStaticFiles; const recordedURLs: Array = []; const debugMode: boolean = JSON.parse(fs.readFileSync("allowedStaticPaths.json", "utf8")).debugMode; app.use('/static/*', function handleModuleFiles(req: Request, res: Response) { if(debugMode) { res.sendFile(Path.join(__dirname, 'node_modules', req.params[0])); recordedURLs.push(req.params[0]); log.web.debug(recordedURLs); } else { if (allowedURLs.indexOf(req.params[0]) > -1) { res.sendFile(Path.join(__dirname, 'node_modules', req.params[0])); } else { log.web.warn('Attempt to access restricted asset file ' + req.params[0]); res.status(403).json({ status: 'error', reason: 'Access to restricted asset file denied' }); } } // console.log(recordedURLs) }); routes(app); app.listen(config.global.http_port, config.global.http_listen_address, () => { log.web.info(`Listening at http://${config.global.http_listen_address}:${config.global.http_port}`); });