Skip to content

Commit

Permalink
Migrate to ES6
Browse files Browse the repository at this point in the history
  • Loading branch information
megastary committed Oct 17, 2023
1 parent 0242016 commit 9292dc9
Show file tree
Hide file tree
Showing 43 changed files with 381 additions and 420 deletions.
100 changes: 48 additions & 52 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,64 +1,60 @@
// Require all neccesary modules
const createError = require('http-errors') // Generating errors
const express = require('express') // Express
const methodOverride = require('method-override')
const path = require('path') // used for handling paths which held express files
const cookieParser = require('cookie-parser')
const expressSession = require('express-session')
const handlebars = require('handlebars')
const expressHbs = require('express-handlebars') // extended handlebars functionality
const {
allowInsecurePrototypeAccess
} = require('@handlebars/allow-prototype-access')
const mongoose = require('mongoose') // database
const MongoStore = require('connect-mongo') // (expressSession)
const passport = require('passport') // authentication method
require('dotenv').config()
import createError from 'http-errors' // Generating errors
import express, { json, urlencoded } from 'express' // Express
import methodOverride from 'method-override'
import path, { join } from 'path' // used for handling paths which held express files
import cookieParser from 'cookie-parser'
import expressSession from 'express-session'
import handlebars from 'handlebars'
import { engine } from 'express-handlebars' // extended handlebars functionality
import { allowInsecurePrototypeAccess } from '@handlebars/allow-prototype-access'
import mongoose from 'mongoose' // database
import connectMongo from 'connect-mongo' // (expressSession)
import passport from 'passport' // authentication method
import 'dotenv/config'

let https
let fs
if (process.env.DEBUG.toLowerCase() === 'true') {
https = require('https') // Using HTTPS for debug
fs = require('fs') // Loading certificate from file for debug
}
import https from 'https' // Using HTTPS for debug
import fs from 'fs' // Loading certificate from file for debug
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))

// Functions
require('./functions/azure-passport')
import './functions/azure-passport.js'

// Import scheduled tasks
require('./tasks/daily-report')
require('./tasks/daily-backup')
import './tasks/daily-report.js'
import './tasks/daily-backup.js'

// Load routes from routes folder to later app.use them.
// Access for all
const indexRouter = require('./routes/index')
const aboutRouter = require('./routes/about')
const changelogRouter = require('./routes/changelog')
import indexRouter from './routes/index.js'
import aboutRouter from './routes/about.js'
import changelogRouter from './routes/changelog.js'
// Access for logged in users
const shopRouter = require('./routes/shop')
const profileRouter = require('./routes/profile')
const ordersRouter = require('./routes/orders')
const invoicesRouter = require('./routes/invoices')
import shopRouter from './routes/shop.js'
import profileRouter from './routes/profile.js'
import ordersRouter from './routes/orders.js'
import invoicesRouter from './routes/invoices.js'
// Access for suppliers
const addProductsRouter = require('./routes/add_products')
const invoiceRouter = require('./routes/invoice')
const paymentsRouter = require('./routes/payments')
const stockRouter = require('./routes/stock')
const newProductRouter = require('./routes/new_product')
import addProductsRouter from './routes/add_products.js'
import invoiceRouter from './routes/invoice.js'
import paymentsRouter from './routes/payments.js'
import stockRouter from './routes/stock.js'
import newProductRouter from './routes/new_product.js'
// Access for admins
const dashboardRouter = require('./routes/admin/admin_dashboard')
import dashboardRouter from './routes/admin/admin_dashboard.js'
// Access for kiosk
const kioskKeypadRouter = require('./routes/kiosk_keypad')
const kioskShopRouter = require('./routes/kiosk_shop')
import kioskKeypadRouter from './routes/kiosk_keypad.js'
import kioskShopRouter from './routes/kiosk_shop.js'
// Passport routes
const loginRouter = require('./routes/login')
const logoutRouter = require('./routes/logout')
const authOpenId = require('./routes/auth_openid')
const authOpenIdReturnGet = require('./routes/auth_openid_return')
const authOpenIdReturnPost = require('./routes/auth_openid_return_post')
import loginRouter from './routes/login.js'
import logoutRouter from './routes/logout.js'
import authOpenId from './routes/auth_openid.js'
import authOpenIdReturnGet from './routes/auth_openid_return.js'
import authOpenIdReturnPost from './routes/auth_openid_return_post.js'
// API routes
const keypadOrderRouter = require('./routes/api/keypadOrder')
const customerName = require('./routes/api/customerName')
import keypadOrderRouter from './routes/api/keypadOrder.js'
import customerName from './routes/api/customerName.js'

// Express app and database connection
const app = express()
Expand All @@ -67,7 +63,7 @@ mongoose.connect(process.env.DB_CONNECTION_STRING)
// View engine setup
app.engine(
'.hbs',
expressHbs.engine({
engine({
defaultLayout: 'layout',
extname: '.hbs',
handlebars: allowInsecurePrototypeAccess(handlebars)
Expand All @@ -77,10 +73,10 @@ app.enable('trust proxy')
app.set('view engine', '.hbs')
app.enable('view cache')
app.use(methodOverride())
app.use(express.json())
app.use(express.static(path.join(__dirname, 'public')))
app.use(json())
app.use(express.static(join(__dirname, 'public')))
app.use(
express.urlencoded({
urlencoded({
extended: true
})
)
Expand All @@ -96,7 +92,7 @@ app.use(
sameSite: 'None',
resave: false,
saveUninitialized: false,
store: MongoStore.create({
store: connectMongo.create({
mongoUrl: process.env.DB_CONNECTION_STRING,
mongooseConnection: mongoose.connection,
ttl: 14 * 24 * 60 * 60,
Expand Down Expand Up @@ -167,4 +163,4 @@ if (process.env.DEBUG.toLowerCase() === 'true') {
https.createServer(options, app).listen(process.env.APP_PORT_SSL || 443)
}

module.exports = app
export default app
12 changes: 7 additions & 5 deletions bin/www → bin/www.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
* Module dependencies.
*/

var app = require('../app')
var debug = require('debug')('small-bussiness-fridge:server')
var http = require('http')
import app from '../app.js'
import debug from 'debug'
import { createServer } from 'http'

const logger = debug('small-bussiness-fridge:server')

/**
* Get port from environment and store in Express.
Expand All @@ -19,7 +21,7 @@ app.set('port', port)
* Create HTTP server.
*/

var server = http.createServer(app)
var server = createServer(app)

/**
* Listen on provided port, on all network interfaces.
Expand Down Expand Up @@ -80,5 +82,5 @@ function onError(error) {
function onListening() {
var addr = server.address()
var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port
debug('Listening on ' + bind)
logger('Listening on ' + bind)
}
2 changes: 1 addition & 1 deletion defaults.env
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ API_SECRET=veryveryverysecretapikey
DEBUG=false
MAIL_PORT=25
MAIL_HOST=localhost
MAIL_FROM='Lednice IT<noreply@example.com>'
MAIL_FROM=Lednice IT
MAIL_USERNAME=noreply@example.com
MAIL_PASSWORD=somerandompassword
MAIL_SYSTEM=helpdesk@example.com
Expand Down
35 changes: 19 additions & 16 deletions functions/azure-passport.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// modules and functions require
const mailer = require('./sendMail')
const passport = require('passport')
const OIDCStrategy = require('passport-azure-ad').OIDCStrategy
import { sendMail } from './sendMail.js'
import passport from 'passport'
import { OIDCStrategy } from 'passport-azure-ad'

const cookieEncryptionKeys = [
{
Expand All @@ -11,13 +11,15 @@ const cookieEncryptionKeys = [
]

// Mongoose Data object
const User = require('../models/user')
// import module as User from '../Users/user.js'
import model from '../models/user.js'

// Helper function to find user in database
const findByOid = function (oid, fn) {
User.findOne({
oid
})
model
.findOne({
oid
})
.then((user) => {
return fn(null, user)
})
Expand Down Expand Up @@ -48,8 +50,7 @@ passport.use(
responseMode: process.env.CREDS_RESPONSE_MODE,
redirectUrl: process.env.CREDS_REDIRECT_URL,
allowHttpForRedirectUrl:
process.env.CREDS_ALLOW_HTTP_FOR_REDIRECT_URL.toLowerCase() ===
'true' || false,
process.env.CREDS_ALLOW_HTTP_FOR_REDIRECT_URL === 'true' || false,
clientSecret: process.env.CREDS_CLIENT_SECRET,
validateIssuer:
process.env.CREDS_VALIDATE_ISSUER.toLowerCase() === 'true' || false,
Expand Down Expand Up @@ -81,9 +82,10 @@ passport.use(
}
if (!user) {
// Auto-registration
User.findOne({
oid: profile.oid
})
user
.findOne({
oid: profile.oid
})
.then((user) => {
// If user does not exist in database, automatically register as customer (not admin, not supplier, auto increment keypad ID)
if (!user) {
Expand All @@ -99,7 +101,8 @@ passport.use(
profile.supplier = false
// Async function to find highest keypad ID and increment it by one.
const latestUser = function (callback) {
User.find()
model
.find()
.sort({
keypadId: -1
})
Expand All @@ -125,9 +128,9 @@ passport.use(
.save()
.then((res) => {
// console.log(`New User ${newUser.displayName} inserted into database.`);
const subject = `Welcome to our fridge ${newUser.displayName}`
const body = `<h1>Welcome abord!</h1><p>Hope you will like it here</p><p>Your keypad ID is: ${newUser.keypadID}</p>`
mailer.sendMail(newUser.email, subject, body)
const subject = `Lednice IT je pyšná, že ji navštívila osoba jménem ${newUser.displayName}`
const body = `<h1>Lednice IT Vás vítá!</h1><p>Snad se Vám zde bude líbit.</p><p>Vaše ID pro objednávání skrze kiosek: ${newUser.keypadID}</p><h2>Jak to funguje</h2><p>Do Lednice IT dodává produkty více dodavatelů. Zákazník si přes e-shop či přes kiosek zakoupí vybraný produkt. Až se dodavateli nashromáždí dostatek prodaného zboží, vytvoří hromadnou fakturaci. Každý zákazník, který si u daného dodavatele něco zakoupil obdrží e-mail s QR kódem, který uhradí. Platbu obě strany potvrdí v rozhraní e-shopu.</p><p>Pokud se budete chtít stát dodavatelem, kontaktujte správce Lednice IT.</p>`
sendMail(newUser.email, subject, body)
})
.catch((err) => {
console.log(err)
Expand Down
17 changes: 7 additions & 10 deletions functions/checkKiosk.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
module.exports = {
// Checks if user is not a kiosk user, if kiosk, redirect to kiosk page.
checkKiosk: function (req, res, next) {
if (!req.user) {
return next()
}
if (!req.user.kiosk) {
return next()
}
res.redirect('/kiosk_keypad')
export function checkKiosk(req, res, next) {
if (!req.user) {
return next()
}
if (!req.user.kiosk) {
return next()
}
res.redirect('/kiosk_keypad')
}
21 changes: 12 additions & 9 deletions functions/database-backup.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
const fs = require('fs')
const _ = require('lodash')
const exec = require('child_process').exec
const path = require('path')
import fs from 'fs'
import _ from 'lodash'
import { exec } from 'child_process'
import path from 'path'
import { fileURLToPath } from 'url'

const __dirname = path.dirname(fileURLToPath(import.meta.url))

// Concatenate root directory path with our backup folder.
const backupDirPath = path.join(__dirname, '../database-backup/backup')
Expand All @@ -14,12 +17,12 @@ const dbOptions = {
}

// return stringDate as a date object.
exports.stringToDate = (dateString) => {
function stringToDate(dateString) {
return new Date(dateString)
}

// Check if variable is empty or not.
exports.empty = (mixedVar) => {
function empty(mixedVar) {
let undef, key, i, len
const emptyValues = [undef, null, false, 0, '', '0']
for (i = 0, len = emptyValues.length; i < len; i++) {
Expand All @@ -37,15 +40,15 @@ exports.empty = (mixedVar) => {
}

// Auto backup function
exports.dbAutoBackUp = () => {
export default function dbAutoBackUp() {
// check for auto backup is enabled or disabled
if (dbOptions.autoBackup === true) {
console.log(backupDirPath)
const date = new Date()
let beforeDate, oldBackupDir, oldBackupPath

// Current date
var currentDate = this.stringToDate(date)
var currentDate = stringToDate(date)
const newBackupDir =
currentDate.getFullYear() +
'-' +
Expand Down Expand Up @@ -80,7 +83,7 @@ exports.dbAutoBackUp = () => {
newBackupPath

exec(cmd, (error, stdout, stderr) => {
if (this.empty(error)) {
if (empty(error)) {
// check for remove old backup after keeping # of days given in ENV.
if (dbOptions.removeOldBackup === true) {
if (fs.existsSync(oldBackupPath)) {
Expand Down
13 changes: 5 additions & 8 deletions functions/ensureAuthenticated.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
module.exports = {
// Uses passport functionality, which checks if user is logged in. If not, redirects to login page.
ensureAuthenticated: function (req, res, next) {
if (req.isAuthenticated()) {
return next()
}
console.log('redirecting')
res.redirect('/login')
export function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next()
}
console.log('redirecting')
res.redirect('/login')
}
31 changes: 14 additions & 17 deletions functions/ensureAuthenticatedAPI.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,19 @@
var responseJson

module.exports = {
// Checks if request contains expected API secret. If it does, proceed without problem, otherwise respond with error JSON.
ensureAuthenticatedAPI: function (req, res, next) {
// Check if request header contains API secret key
if (req.get('sbf-API-secret') !== process.env.API_SECRET) {
res.status(401)
res.set('Content-Type', 'application/problem+json')
responseJson = {
type: 'https://github.com/houby-studio/small-business-fridge/wiki/API-documentation#api-protection',
title: 'Your request does not contain secret key.',
status: 401,
'detail:':
'This is not a public function. To use this API, you need to supply secret key in the header. More details can be found in documentation https://git.io/Jeodr'
}
res.json(responseJson)
return
export function ensureAuthenticatedAPI(req, res, next) {
// Check if request header contains API secret key
if (req.get('sbf-API-secret') !== process.env.API_SECRET) {
res.status(401)
res.set('Content-Type', 'application/problem+json')
responseJson = {
type: 'https://github.com/houby-studio/small-business-fridge/wiki/API-documentation#api-protection',
title: 'Your request does not contain secret key.',
status: 401,
'detail:':
'This is not a public function. To use this API, you need to supply secret key in the header. More details can be found in documentation https://git.io/Jeodr'
}
return next()
res.json(responseJson)
return
}
return next()
}
Loading

0 comments on commit 9292dc9

Please sign in to comment.