Skip to content

Commit

Permalink
Add Messaging plugins (#28)
Browse files Browse the repository at this point in the history
* Move logging to its own file

* Catch validation errors when creating

* Add post hooks for APIs

* Add pre and post hooks for API

* Add messaging plugins

* Allow permissions to be promises

* Update mongoose
  • Loading branch information
joshgachnang authored Feb 13, 2022
1 parent ee81c30 commit 76bc8c3
Show file tree
Hide file tree
Showing 11 changed files with 1,329 additions and 387 deletions.
14 changes: 9 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,28 @@
},
"homepage": "https://github.com/joshgachnang/mongoose-rest-framework#readme",
"dependencies": {
"generaterr": "^1.5.0",
"passport-local": "^1.0.0",
"scmp": "^2.1.0",
"@sentry/node": "^6.15.0",
"axios": "^0.24.0",
"cron": "^1.8.2",
"expo-server-sdk": "^3.6.0",
"express": "^4.17.1",
"express-session": "^1.17.2",
"generaterr": "^1.5.0",
"jsonwebtoken": "^8.5.1",
"lodash": "^4.17.21",
"mongoose": "^6.0.8",
"on-finished": "^2.3.0",
"passport": "^0.5.0",
"passport-anonymous": "^1.0.1",
"passport-jwt": "^4.0.0",
"passport-local": "^1.0.0",
"scmp": "^2.1.0",
"winston": "^3.3.3"
},
"peerDependencies": {
"mongoose": "^6.1.9"
},
"devDependencies": {
"mongoose": "^6.1.9",
"@types/bcrypt": "^5.0.0",
"@types/chai": "^4.2.22",
"@types/cron": "^1.7.3",
Expand All @@ -58,7 +62,7 @@
"@types/passport": "^1.0.7",
"@types/passport-anonymous": "^1.0.3",
"@types/passport-jwt": "^3.0.6",
"@types/passport-local-mongoose": "^6.1.0",
"@types/passport-local": "^1.0.34",
"@types/sinon": "^9.0.5",
"@types/supertest": "^2.0.11",
"@typescript-eslint/eslint-plugin": "^4.33.0",
Expand Down
2 changes: 1 addition & 1 deletion src/example.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import chai from "chai";
import express from "express";
import mongoose, {model, Schema} from "mongoose";
import passportLocalMongoose from "passport-local-mongoose";
import {passportLocalMongoose} from "./passport";
import {tokenPlugin} from ".";
import {
baseUserPlugin,
Expand Down
94 changes: 2 additions & 92 deletions src/expressServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@ import * as Sentry from "@sentry/node";
import axios from "axios";
import cron from "cron";
import express, {Router} from "express";
import fs from "fs";
import cloneDeep from "lodash/cloneDeep";
import onFinished from "on-finished";
import passport from "passport";
import winston, {level} from "winston";
import {logger, LoggingOptions, setupLogging} from "./logger";
import {Env, setupAuth, UserModel} from "./mongooseRestFramework";

const SLOW_READ_MAX = 200;
Expand All @@ -24,95 +23,6 @@ export function setupErrorLogging() {

export type AddRoutes = (router: Router) => void;

// Setup a default console logger.
export const logger = winston.createLogger({
level: "debug",
transports: [
new winston.transports.Console({
debugStdout: true,
level: "debug",
format: winston.format.combine(winston.format.colorize(), winston.format.simple()),
}),
],
});

interface LoggingOptions {
level?: "debug" | "info" | "warn" | "error";
transports?: winston.transport[];
disableFileLogging?: boolean;
disableConsoleLogging?: boolean;
logDirectory?: string;
}

function setupLogging(options?: LoggingOptions) {
logger.clear();
if (!options?.disableConsoleLogging) {
logger.add(
new winston.transports.Console({
debugStdout: !options?.level || options?.level === "debug",
level: options?.level ?? "debug",
format: winston.format.combine(winston.format.colorize(), winston.format.simple()),
})
);
}
if (!options?.disableFileLogging) {
const logDirectory = options?.logDirectory ?? "./log";
if (!fs.existsSync(logDirectory)) {
fs.mkdirSync(logDirectory);
}

const FILE_LOG_DEFAULTS = {
colorize: false,
compress: true,
dirname: logDirectory,
format: winston.format.simple(),
// 30 days of retention
maxFiles: 30,
// 50MB max file size
maxSize: 1024 * 1024 * 50,
// Only readable by server user
options: {mode: 0o600},
};

logger.add(
new winston.transports.Stream({
...FILE_LOG_DEFAULTS,
level: "error",
handleExceptions: true,
// Use stream so we can open log in append mode rather than overwriting.
stream: fs.createWriteStream("error.log", {flags: "a"}),
})
);

logger.add(
new winston.transports.Stream({
...FILE_LOG_DEFAULTS,
level: "info",
// Use stream so we can open log in append mode rather than overwriting.
stream: fs.createWriteStream("out.log", {flags: "a"}),
})
);
if (!options?.level || options?.level === "debug") {
logger.add(
new winston.transports.Stream({
...FILE_LOG_DEFAULTS,
level: "debug",
// Use stream so we can open log in append mode rather than overwriting.
stream: fs.createWriteStream("debug.log", {flags: "a"}),
})
);
}
}

if (options?.transports) {
for (const transport of options.transports) {
logger.add(transport);
}
}

logger.debug("Logger set up complete");
}

const logRequestsFinished = function(req: any, res: any, startTime: [number, number]) {
const diff = process.hrtime(startTime);
const diffInMs = Math.round(diff[0] * 1000 + diff[1] * 0.000001);
Expand Down Expand Up @@ -279,7 +189,7 @@ export function setupServer(options: SetupServerOptions) {
return app;
}

// Convenince method to execute cronjobs with an always-running server.
// Convenience method to execute cronjobs with an always-running server.
export function cronjob(
name: string,
schedule: "hourly" | "minutely" | string,
Expand Down
3 changes: 3 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
export * from "./mongooseRestFramework";
export * from "./expressServer";
export * from "./passport";
export * from "./models/messaging";
export * from "./logger";
export * from "./models/messaging";
91 changes: 91 additions & 0 deletions src/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import fs from "fs";
import winston from "winston";

// Setup a default console logger.
export const logger = winston.createLogger({
level: "debug",
transports: [
new winston.transports.Console({
debugStdout: true,
level: "debug",
format: winston.format.combine(winston.format.colorize(), winston.format.simple()),
}),
],
});

export interface LoggingOptions {
level?: "debug" | "info" | "warn" | "error";
transports?: winston.transport[];
disableFileLogging?: boolean;
disableConsoleLogging?: boolean;
logDirectory?: string;
}

export function setupLogging(options?: LoggingOptions) {
logger.clear();
if (!options?.disableConsoleLogging) {
logger.add(
new winston.transports.Console({
debugStdout: !options?.level || options?.level === "debug",
level: options?.level ?? "debug",
format: winston.format.combine(winston.format.colorize(), winston.format.simple()),
})
);
}
if (!options?.disableFileLogging) {
const logDirectory = options?.logDirectory ?? "./log";
if (!fs.existsSync(logDirectory)) {
fs.mkdirSync(logDirectory);
}

const FILE_LOG_DEFAULTS = {
colorize: false,
compress: true,
dirname: logDirectory,
format: winston.format.simple(),
// 30 days of retention
maxFiles: 30,
// 50MB max file size
maxSize: 1024 * 1024 * 50,
// Only readable by server user
options: {mode: 0o600},
};

logger.add(
new winston.transports.Stream({
...FILE_LOG_DEFAULTS,
level: "error",
handleExceptions: true,
// Use stream so we can open log in append mode rather than overwriting.
stream: fs.createWriteStream("error.log", {flags: "a"}),
})
);

logger.add(
new winston.transports.Stream({
...FILE_LOG_DEFAULTS,
level: "info",
// Use stream so we can open log in append mode rather than overwriting.
stream: fs.createWriteStream("out.log", {flags: "a"}),
})
);
if (!options?.level || options?.level === "debug") {
logger.add(
new winston.transports.Stream({
...FILE_LOG_DEFAULTS,
level: "debug",
// Use stream so we can open log in append mode rather than overwriting.
stream: fs.createWriteStream("debug.log", {flags: "a"}),
})
);
}
}

if (options?.transports) {
for (const transport of options.transports) {
logger.add(transport);
}
}

logger.debug("Logger set up complete");
}
Loading

0 comments on commit 76bc8c3

Please sign in to comment.