diff --git a/src/index.js b/src/index.js index 412a397..3d54095 100644 --- a/src/index.js +++ b/src/index.js @@ -5,9 +5,7 @@ import fastifyMultipart from 'fastify-multipart'; import Sequelize from 'sequelize'; import { DatabaseConfig } from './config/database.config.js'; import { ServerConfig } from './config/server.config.js'; -import UserEntity from './model/user.model.js'; -import AuthController from './route/auth.controller.js'; -import UserController from './route/user.controller.js'; +import { importAll } from './utils/module.utils.js'; const app = Fastify({logger: false}); const db = new Sequelize(DatabaseConfig); @@ -15,7 +13,7 @@ const db = new Sequelize(DatabaseConfig); async function Database(){ { //models const opts = {db}; - UserEntity(opts); + await importAll('model', opts); } await db.authenticate(); //connect to your database of choice await db.sync({alter: true}); //add missing tables and columns @@ -26,8 +24,7 @@ async function WebApp(){ app.register(fastifyMultipart); //file uploads { //routes, bloody routes const opts = {app, db}; - AuthController(opts); - UserController(opts); + await importAll('route', opts); } app.get('/', () => 'Hello. D:'); const address = await app.listen(ServerConfig); @@ -49,4 +46,5 @@ async function WebApp(){ }; await step(Database, 'DB'); await step(WebApp, 'Fastify'); -})(); +})() +.catch(console.error); diff --git a/src/logic/cache.js b/src/logic/cache.js index 5949d5e..40022f3 100644 --- a/src/logic/cache.js +++ b/src/logic/cache.js @@ -1,4 +1,7 @@ +/** + * A map with a limited number of entries. (unspecified order) + */ export class CacheTable{ constructor(threshold){ @@ -31,8 +34,11 @@ export class CacheTable{ } +/** + * A cache table that keeps track of access within multiple time intervals. + */ export class SpamCache extends CacheTable{ - + constructor(){ super(1024); } diff --git a/src/logic/security.js b/src/logic/security.js index 95f580b..753ad4f 100644 --- a/src/logic/security.js +++ b/src/logic/security.js @@ -1,6 +1,6 @@ import bcrypt from 'bcrypt'; import crypto from 'crypto'; -import { days, hours } from './utils.js'; +import { days, hours } from '../utils/common.utils.js'; //-- endpoints -- diff --git a/src/logic/session.js b/src/logic/session.js index 65d8f35..4d7c643 100644 --- a/src/logic/session.js +++ b/src/logic/session.js @@ -1,5 +1,5 @@ import { CacheTable, SpamCache } from "./cache.js"; -import { ipAddress } from "./utils.js"; +import { ipAddress } from "../utils/web.utils.js"; export class UserSession{ diff --git a/src/route/auth.controller.js b/src/route/auth.controller.js index decd2bc..0bf1f23 100644 --- a/src/route/auth.controller.js +++ b/src/route/auth.controller.js @@ -1,4 +1,5 @@ -import { checkStringParam, errorOut, notYet, randomElement, ipAddress, reverseString, hours, minutes, localeFromHeader } from '../logic/utils.js'; +import { notYet, randomElement, reverseString, hours, minutes } from '../utils/common.utils.js'; +import { checkStringParam, errorOut, ipAddress, localeFromHeader } from '../utils/web.utils.js'; import { Animals } from '../misc/animals.js'; import { reissueToken, generateToken, newTokenExpiry, hashPassword, doesPasswordMatch, isEndpointAllowedForBannedUsers, isEndpointProtected, generateRestoreCode, restoreValidity, restoreAttempts } from '../logic/security.js'; import { sendRestorationLink } from '../logic/email.js'; @@ -25,7 +26,6 @@ function AuthController({app, db}){ let session = UserSession.find(token); if(!session){ const userData = await Users.findOne({where: {token}}); - userData.role = '232'; if(userData){ session = new UserSession(userData, request); } diff --git a/src/utils/common.utils.js b/src/utils/common.utils.js new file mode 100644 index 0000000..9b2897a --- /dev/null +++ b/src/utils/common.utils.js @@ -0,0 +1,17 @@ + +export function reverseString(str){ + return str.split("").reverse().join(""); +} + +export function randomElement(arr){ + return arr[Math.floor(Math.random()*arr.length)]; +} + +export const minutes = 60*1000; +export const hours = 3600*1000; +export const days = 24*hours; + +export function notYet(date){ + if(!date) return false; + return (new Date() <= date); +} diff --git a/src/utils/module.utils.js b/src/utils/module.utils.js new file mode 100644 index 0000000..75d0b74 --- /dev/null +++ b/src/utils/module.utils.js @@ -0,0 +1,22 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +function defaultFileFilter(filename){ + return !!filename.match(/\.js$/); +} + +export async function importAll(folder, opts){ + const controllerPaths = ( + fs.readdirSync(path.join(__dirname, '../'+folder)) + .filter(defaultFileFilter) + .map(file => path.join(__dirname, '../'+folder, file)) + ); + for (const path of controllerPaths) { + const submodule = await import('file://'+path); + submodule.default(opts); + } +} diff --git a/src/logic/utils.js b/src/utils/web.utils.js similarity index 61% rename from src/logic/utils.js rename to src/utils/web.utils.js index fbc31a1..a346408 100644 --- a/src/logic/utils.js +++ b/src/utils/web.utils.js @@ -21,20 +21,3 @@ export function localeFromHeader(input){ //https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language return checkStringParam(input, 1, 64) ? input : 'en'; } - -export function reverseString(str){ - return str.split("").reverse().join(""); -} - -export function randomElement(arr){ - return arr[Math.floor(Math.random()*arr.length)]; -} - -export const minutes = 60*1000; -export const hours = 3600*1000; -export const days = 24*hours; - -export function notYet(date){ - if(!date) return false; - return (new Date() <= date); -}