import { WSAEDQUOT } from "constants"; import * as bodyParser from "body-parser"; import * as cookieParser from "cookie-parser"; import * as express from "express"; import * as logger from "morgan"; import * as path from "path"; import * as redis from "redis"; import * as session from "express-session"; import * as connectRedis from "connect-redis"; import * as passport from "passport"; import * as LocalStrategy from "passport-local"; import errorHandler = require("errorhandler"); import methodOverride = require("method-override"); import { Account } from "./auth/Account"; import { AuthRoutes } from "./auth/authRoutes"; import { IndexRoute } from "./routes/IndexRoute";; import { ExamApi } from "./api/ExamApi"; import { SchoolApi } from "./api/SchoolApi"; import { AcademicYearApi } from "./api/AcademicYearApi"; import { StepOneApi } from "./api/StepOneApi"; import * as config from "./config/app.json"; import { mySqlConnection } from "@rolesvillesoftware/tiberhealthmodel"; import { Connection } from "@rolesvillesoftware/tsentity/dist"; export class Server { private flash = require("connect-flash"); private RedisStore = connectRedis(session); private warehouseConnection = null; private contextConnection: Connection = null; public app: express.Application; public static bootstrap(): Server { return new Server(); } constructor() { this.app = express(); this.config(); this.passportConfig(); this.routes(); this.api(); } public api() { } public config() { this.contextConnection = new Connection((config).warehouseConnectionString); this.warehouseConnection = new mySqlConnection(this.contextConnection, console); //add static paths this.app.use(express.static(path.join(__dirname, "public"))); this.app.use(express.static(path.join(__dirname, "public/app"))); this.app.set("views", path.join(__dirname, "views")); this.app.set("view engine", "pug"); this.app.use(logger("dev")); this.app.use(bodyParser.json()); this.app.use(bodyParser.urlencoded({ extended: true })); this.app.use(cookieParser("cubs world series")); this.app.use((req, res, next) => { (req).warehouseConnection = this.warehouseConnection; (req).contextConnection = this.contextConnection; next(); }); this.app.use(session({ store: new this.RedisStore((config).redisSession), secret: 'panthers superbowl', resave: false, saveUninitialized: true, rolling: true, cookie: { secure: false, maxAge: null } // Max age = null ==> session cookie })); this.app.use(methodOverride()); this.app.use(function (err: any, req: express.Request, res: express.Response, next: express.NextFunction) { err.status = 404; next(err); }); this.app.use(errorHandler()); this.app.use(passport.initialize()); this.app.use(require("connect-flash")()); this.app.use(passport.session()); } public passportConfig() { passport.use(new LocalStrategy.Strategy((username, password, done) => { Account.find(username, (err, user) => { if (err) { return done(err); } if (typeof user === "boolean" && !user) { return done(null, false); } if (user instanceof Account && user.validatePassword(password)) { return done(null, user); } return done(null, false); }); })); passport.serializeUser(Account.serializeUser); passport.deserializeUser(Account.deserializeUser); } public routes() { let rootRouter = express.Router(); AuthRoutes.create(rootRouter); IndexRoute.create(rootRouter); let apiRouter = express.Router(); ExamApi.createRoute(apiRouter); SchoolApi.createRoute(apiRouter); AcademicYearApi.createRoute(apiRouter); StepOneApi.createRoute(apiRouter); this.app.use("/api", apiRouter); this.app.use(rootRouter); } }