diff --git a/gulpfile.js b/gulpfile.js index 26921ba7..25865819 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -67,4 +67,4 @@ gulp.task( 'bump-patch', function() { return setup.bumpVersion( setup.bumpPatchN gulp.task( 'bump-minor', function() { return setup.bumpVersion( setup.bumpMidNum, configFiles ) }); gulp.task( 'bump-major', function() { return setup.bumpVersion( setup.bumpMajorNum, configFiles ) }); gulp.task( 'install', [ 'install-definitions' ] ); -gulp.task( 'build', [ 'ts-code', 'dist-files', 'ts-code-definitions' ] ); \ No newline at end of file +gulp.task( 'build', [ 'tslint', 'dist-files', 'ts-code-definitions' ] ); \ No newline at end of file diff --git a/src/controllers/comments-controller.ts b/src/controllers/comments-controller.ts index dd68f48f..503f2a36 100644 --- a/src/controllers/comments-controller.ts +++ b/src/controllers/comments-controller.ts @@ -1,16 +1,16 @@ -import * as bodyParser from "body-parser"; -import * as mongodb from "mongodb"; -import * as entities from "entities"; -import * as express from "express"; -import * as compression from "compression"; -import { Controller } from "./controller"; -import { Model, ModelInstance } from "../models/model"; -import { CommentsModel } from "../models/comments-model"; -import { UsersService } from "../users-service"; -import { getUser, isAdmin, canEdit, hasId, userExists } from "../permission-controllers"; -import * as mp from "modepress-api"; -import * as winston from "winston"; -import { okJson, errJson } from "../serializers"; +import * as bodyParser from 'body-parser'; +import * as mongodb from 'mongodb'; +import * as entities from 'entities'; +import * as express from 'express'; +import * as compression from 'compression'; +import { Controller } from './controller'; +import { Model, ModelInstance } from '../models/model'; +import { CommentsModel } from '../models/comments-model'; +import { UsersService } from '../users-service'; +import { getUser, isAdmin, canEdit, hasId, userExists } from '../permission-controllers'; +import * as mp from 'modepress-api'; +import * as winston from 'winston'; +import { okJson, errJson } from '../serializers'; /** * A controller that deals with the management of comments @@ -28,35 +28,34 @@ export default class CommentsController extends Controller { server; // Supress empty param warning config; // Supress empty param warning - var router = express.Router(); + const router = express.Router(); router.use( compression() ); router.use( bodyParser.urlencoded( { 'extended': true }) ); router.use( bodyParser.json() ); router.use( bodyParser.json( { type: 'application/vnd.api+json' }) ); - router.get( "/comments", [ isAdmin, this.getComments.bind( this ) ] ); - router.get( "/comments/:id", [ hasId( "id", "ID" ), getUser, this.getComment.bind( this ) ] ); - router.get( "/nested-comments/:parentId", [ hasId( "parentId", "parent ID" ), getUser, this.getComments.bind( this ) ] ); - router.get( "/users/:user/comments", [ userExists, getUser, this.getComments.bind( this ) ] ); - router.delete( "/comments/:id", [ getUser, hasId( "id", "ID" ), this.remove.bind( this ) ] ); - router.put( "/comments/:id", [ getUser, hasId( "id", "ID" ), this.update.bind( this ) ] ); - router.post( "/posts/:postId/comments/:parent?", [ canEdit, hasId( "postId", "parent ID" ), hasId( "parent", "Parent ID", true ), this.create.bind( this ) ] ); + router.get( '/comments', [ isAdmin, this.getComments.bind( this ) ] ); + router.get( '/comments/:id', [ hasId( 'id', 'ID' ), getUser, this.getComment.bind( this ) ] ); + router.get( '/nested-comments/:parentId', [ hasId( 'parentId', 'parent ID' ), getUser, this.getComments.bind( this ) ] ); + router.get( '/users/:user/comments', [ userExists, getUser, this.getComments.bind( this ) ] ); + router.delete( '/comments/:id', [ getUser, hasId( 'id', 'ID' ), this.remove.bind( this ) ] ); + router.put( '/comments/:id', [ getUser, hasId( 'id', 'ID' ), this.update.bind( this ) ] ); + router.post( '/posts/:postId/comments/:parent?', [ canEdit, hasId( 'postId', 'parent ID' ), hasId( 'parent', 'Parent ID', true ), this.create.bind( this ) ] ); // Register the path - e.use( "/api", router ); + e.use( '/api', router ); } /** * Returns an array of IComment items */ private async getComments( req: mp.IAuthReq, res: express.Response ) { - var comments = this.getModel( "comments" ) !; - var that = this; - var count = 0; - var visibility = "public"; - var user = req._user; - var findToken = { $or: [] as mp.IComment[] }; + const comments = this.getModel( 'comments' ) !; + let count = 0; + let visibility = 'public'; + const user = req._user; + const findToken = { $or: [] as mp.IComment[] }; // Set the parent filter if ( req.query.parentId ) @@ -64,51 +63,51 @@ export default class CommentsController extends Controller { // Set the user property if its provided if ( req.query.user ) - ( findToken ).author = new RegExp( req.query.user, "i" ); + ( findToken ).author = new RegExp( req.query.user, 'i' ); // Check for keywords if ( req.query.keyword ) - findToken.$or.push( { content: new RegExp( req.query.keyword, "i" ) }); + findToken.$or.push( { content: new RegExp( req.query.keyword, 'i' ) }); // Check for visibility if ( req.query.visibility ) { - if ( ( req.query.visibility ).toLowerCase() == "all" ) - visibility = "all"; - else if ( ( req.query.visibility ).toLowerCase() == "private" ) - visibility = "private"; + if ( ( req.query.visibility ).toLowerCase() == 'all' ) + visibility = 'all'; + else if ( ( req.query.visibility ).toLowerCase() == 'private' ) + visibility = 'private'; } else - visibility = "all"; + visibility = 'all'; - var users = UsersService.getSingleton(); + const users = UsersService.getSingleton(); // Only admins are allowed to see private comments - if ( !user || ( ( visibility == "all" || visibility == "private" ) && users.isAdmin( user ) == false ) ) - visibility = "public"; + if ( !user || ( ( visibility == 'all' || visibility == 'private' ) && users.isAdmin( user ) == false ) ) + visibility = 'public'; // Add the or conditions for visibility - if ( visibility != "all" ) { - if ( visibility == "public" ) + if ( visibility != 'all' ) { + if ( visibility == 'public' ) ( findToken ).public = true; else ( findToken ).public = false; } // Set the default sort order to ascending - var sortOrder = -1; + let sortOrder = -1; if ( req.query.sortOrder ) { - if ( ( req.query.sortOrder ).toLowerCase() == "asc" ) + if ( ( req.query.sortOrder ).toLowerCase() == 'asc' ) sortOrder = 1; else sortOrder = -1; } // Sort by the date created - var sort: mp.IComment = { createdOn: sortOrder }; + let sort: mp.IComment = { createdOn: sortOrder }; // Optionally sort by the last updated if ( req.query.sort ) { - if ( req.query.sort == "updated" ) + if ( req.query.sort == 'updated' ) sort = { lastUpdated: sortOrder }; } @@ -119,18 +118,18 @@ export default class CommentsController extends Controller { // First get the count count = await comments.count( findToken ); - var instances = await comments.findInstances( findToken, [ sort ], parseInt( req.query.index ), parseInt( req.query.limit ) ); + const instances = await comments.findInstances( findToken, [ sort ], parseInt( req.query.index ), parseInt( req.query.limit ) ); - var jsons: Array> = []; - for ( var i = 0, l = instances.length; i < l; i++ ) + const jsons: Array> = []; + for ( let i = 0, l = instances.length; i < l; i++ ) jsons.push( instances[ i ].schema.getAsJson( instances[ i ]._id, { verbose: Boolean( req.query.verbose ), expandForeignKeys: Boolean( req.query.expanded ), expandMaxDepth: parseInt( req.query.depth || 1 ), - expandSchemaBlacklist: [ "parent" ] + expandSchemaBlacklist: [ 'parent' ] }) ); - var sanitizedData = await Promise.all( jsons ); + const sanitizedData = await Promise.all( jsons ); okJson( { error: false, @@ -149,32 +148,32 @@ export default class CommentsController extends Controller { */ private async getComment( req: mp.IAuthReq, res: express.Response ) { try { - var comments = this.getModel( "comments" ) !; - var findToken: mp.IComment = { _id: new mongodb.ObjectID( req.params.id ) }; - var user = req._user; + const comments = this.getModel( 'comments' ) !; + const findToken: mp.IComment = { _id: new mongodb.ObjectID( req.params.id ) }; + const user = req._user; - var instances = await comments.findInstances( findToken, [], 0, 1 ); + const instances = await comments.findInstances( findToken, [], 0, 1 ); if ( instances.length == 0 ) - throw new Error( "Could not find comment" ); + throw new Error( 'Could not find comment' ); - var users = UsersService.getSingleton(); - var isPublic = await instances[ 0 ].schema.getByName( "public" ) !.getValue() + const users = UsersService.getSingleton(); + const isPublic = await instances[ 0 ].schema.getByName( 'public' ) !.getValue() // Only admins are allowed to see private comments if ( !isPublic && ( !user || users.isAdmin( user ) == false ) ) - throw new Error( "That comment is marked private" ); + throw new Error( 'That comment is marked private' ); - var jsons: Array> = []; - for ( var i = 0, l = instances.length; i < l; i++ ) + const jsons: Array> = []; + for ( let i = 0, l = instances.length; i < l; i++ ) jsons.push( instances[ i ].schema.getAsJson( instances[ i ]._id, { verbose: Boolean( req.query.verbose ), expandForeignKeys: Boolean( req.query.expanded ), expandMaxDepth: parseInt( req.query.depth || 1 ), - expandSchemaBlacklist: [ "parent" ] + expandSchemaBlacklist: [ 'parent' ] }) ); - var sanitizedData = await Promise.all( jsons ); + const sanitizedData = await Promise.all( jsons ); okJson( { error: false, @@ -191,31 +190,31 @@ export default class CommentsController extends Controller { * Attempts to remove a comment by ID */ private async remove( req: mp.IAuthReq, res: express.Response ) { - var comments = this.getModel( "comments" ) !; - var findToken: mp.IComment = { + const comments = this.getModel( 'comments' ) !; + const findToken: mp.IComment = { _id: new mongodb.ObjectID( req.params.id ) } try { - var user = req._user; - var users = UsersService.getSingleton(); - var instances = await comments.findInstances( findToken, [], 0, 1 ); + const user = req._user; + const users = UsersService.getSingleton(); + const instances = await comments.findInstances( findToken, [], 0, 1 ); if ( instances.length == 0 ) - throw new Error( "Could not find a comment with that ID" ); + throw new Error( 'Could not find a comment with that ID' ); else { - var author = await instances[ 0 ].schema.getByName( "author" ) !.getValue(); + const author = await instances[ 0 ].schema.getByName( 'author' ) !.getValue(); // Only admins are allowed to see private comments if ( !user || ( !users.isAdmin( user ) && user.username != author ) ) - throw new Error( "You do not have permission" ); + throw new Error( 'You do not have permission' ); } // Attempt to delete the instances - var numRemoved = await comments.deleteInstances( findToken ); + const numRemoved = await comments.deleteInstances( findToken ); okJson( { error: false, - message: "Comment has been successfully removed" + message: 'Comment has been successfully removed' }, res ); } catch ( err ) { @@ -227,35 +226,35 @@ export default class CommentsController extends Controller { * Attempts to update a comment by ID */ private async update( req: mp.IAuthReq, res: express.Response ) { - var token: mp.IComment = req.body; - var comments = this.getModel( "comments" ) !; - var findToken: mp.IComment = { + const token: mp.IComment = req.body; + const comments = this.getModel( 'comments' ) !; + const findToken: mp.IComment = { _id: new mongodb.ObjectID( req.params.id ) } try { - var user = req._user; - var users = UsersService.getSingleton(); - var instances = await comments.findInstances( findToken, [], 0, 1 ); + const user = req._user; + const users = UsersService.getSingleton(); + const instances = await comments.findInstances( findToken, [], 0, 1 ); if ( instances.length == 0 ) - throw new Error( "Could not find comment with that id" ); + throw new Error( 'Could not find comment with that id' ); else { - var author = await instances[ 0 ].schema.getByName( "author" ) !.getValue(); + const author = await instances[ 0 ].schema.getByName( 'author' ) !.getValue(); // Only admins are allowed to see private comments if ( !user || ( !users.isAdmin( user ) && user.username != author ) ) - throw new Error( "You do not have permission" ); + throw new Error( 'You do not have permission' ); } - var instance = await comments.update( findToken, token ); + const instance = await comments.update( findToken, token ); if ( instance.error ) throw new Error( instance.tokens[ 0 ].error ); okJson( { error: false, - message: "Comment Updated" + message: 'Comment Updated' }, res ); } catch ( err ) { @@ -267,14 +266,14 @@ export default class CommentsController extends Controller { * Attempts to create a new comment */ private async create( req: mp.IAuthReq, res: express.Response ) { - var token: mp.IComment = req.body; - var comments = this.getModel( "comments" ) !; + const token: mp.IComment = req.body; + const comments = this.getModel( 'comments' ) !; // User is passed from the authentication function token.author = req._user!.username; token.post = req.params.postId; token.parent = req.params.parent; - var parent: ModelInstance | null = null; + let parent: ModelInstance | null = null; try { if ( token.parent ) { @@ -283,20 +282,20 @@ export default class CommentsController extends Controller { throw new Error( `No comment exists with the id ${token.parent}` ); } - var instance = await comments.createInstance( token ); - var json = await instance.schema.getAsJson( instance._id, { verbose: true }); + const instance = await comments.createInstance( token ); + const json = await instance.schema.getAsJson( instance._id, { verbose: true }); // Assign this comment as a child to its parent comment if it exists if ( parent ) { - var children: Array = parent.schema.getByName( "children" ) !.value; + const children: Array = parent.schema.getByName( 'children' ) !.value; children.push( instance.dbEntry!._id ); await parent.model.update( { _id: parent.dbEntry._id }, { children: children }) } okJson( { error: false, - message: "New comment created", + message: 'New comment created', data: json }, res ); diff --git a/src/controllers/controller.ts b/src/controllers/controller.ts index 27f11c80..7ae3dca8 100644 --- a/src/controllers/controller.ts +++ b/src/controllers/controller.ts @@ -1,7 +1,7 @@ -import { Model, ModelInstance } from "../models/model"; -import * as mongodb from "mongodb"; -import { IControllerPlugin } from "modepress-api"; -import { okJson, errJson } from "../serializers"; +import { Model, ModelInstance } from '../models/model'; +import * as mongodb from 'mongodb'; +import { IControllerPlugin } from 'modepress-api'; +import { okJson, errJson } from '../serializers'; export class Controller { private static _models: Array = []; @@ -11,10 +11,10 @@ export class Controller { this._models = []; if ( models ) { - for ( var ii = 0, il = models.length; ii < il; ii++ ) { - var modelAlreadyAdded = false; + for ( let ii = 0, il = models.length; ii < il; ii++ ) { + let modelAlreadyAdded = false; - for ( var i = 0, l = Controller._models.length; i < l; i++ ) + for ( let i = 0, l = Controller._models.length; i < l; i++ ) if ( Controller._models[ i ].collectionName == models[ ii ].collectionName ) { modelAlreadyAdded = true; break; @@ -37,8 +37,8 @@ export class Controller { return this; // Start the initialization of all of the models - var promises: Array> = []; - for ( var i = 0, l = this._models.length; i < l; i++ ) + const promises: Array> = []; + for ( let i = 0, l = this._models.length; i < l; i++ ) promises.push( this._models[ i ].initialize( db ) ); @@ -52,8 +52,8 @@ export class Controller { * Gets a model by its collection name */ getModel( collectionName: string ): Model | null { - var models = Controller._models; - for ( var i = 0, l = models.length; i < l; i++ ) + const models = Controller._models; + for ( let i = 0, l = models.length; i < l; i++ ) if ( models[ i ].collectionName == collectionName ) return models[ i ]; diff --git a/src/controllers/cors-controller.ts b/src/controllers/cors-controller.ts index 975110a0..62073d71 100644 --- a/src/controllers/cors-controller.ts +++ b/src/controllers/cors-controller.ts @@ -1,10 +1,10 @@ -import * as mongodb from "mongodb"; -import * as http from "http"; -import { IServer } from "modepress-api"; -import * as winston from "winston"; -import { Controller } from "./controller"; -import { okJson, errJson } from "../serializers"; -import express = require( "express" ); +import * as mongodb from 'mongodb'; +import * as http from 'http'; +import { IServer } from 'modepress-api'; +import * as winston from 'winston'; +import { Controller } from './controller'; +import { okJson, errJson } from '../serializers'; +import express = require( 'express' ); /** * Checks all incomming requests to see if they are CORS approved @@ -16,20 +16,20 @@ export default class CORSController extends Controller { constructor( e: express.Express, config: IServer ) { super( null ); - var matches: Array = []; - for ( var i = 0, l = config.approvedDomains.length; i < l; i++ ) + const matches: Array = []; + for ( let i = 0, l = config.approvedDomains.length; i < l; i++ ) matches.push( new RegExp( config.approvedDomains[ i ] ) ); // Approves the valid domains for CORS requests e.use( function( req: express.Request, res: express.Response, next: Function ) { if ( ( req ).headers.origin ) { - var matched = false; - for ( var m = 0, l = matches.length; m < l; m++ ) + let matched = false; + for ( let m = 0, l = matches.length; m < l; m++ ) if ( ( req ).headers.origin.match( matches[ m ] ) ) { res.setHeader( 'Access-Control-Allow-Origin', ( req ).headers.origin ); res.setHeader( 'Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS' ); res.setHeader( 'Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With, X-Mime-Type, X-File-Name, Cache-Control' ); - res.setHeader( "Access-Control-Allow-Credentials", "true" ); + res.setHeader( 'Access-Control-Allow-Credentials', 'true' ); matched = true; break; } diff --git a/src/controllers/emails-controller.ts b/src/controllers/emails-controller.ts index 5fcf38b1..8442bd48 100644 --- a/src/controllers/emails-controller.ts +++ b/src/controllers/emails-controller.ts @@ -1,10 +1,10 @@ -import express = require( "express" ); -import controllerModule = require( "./controller" ); +import express = require( 'express' ); +import controllerModule = require( './controller' ); import bodyParser = require( 'body-parser' ); -import { UsersService } from "../users-service" -import { IConfig, IServer, IMessage } from "modepress-api"; -import { okJson, errJson } from "../serializers"; -import * as winston from "winston"; +import { UsersService } from '../users-service' +import { IConfig, IServer, IMessage } from 'modepress-api'; +import { okJson, errJson } from '../serializers'; +import * as winston from 'winston'; export default class EmailsController extends controllerModule.Controller { /** @@ -19,16 +19,16 @@ export default class EmailsController extends controllerModule.Controller { server; // Supress empty param warning config; // Supress empty param warning - var router = express.Router(); + const router = express.Router(); router.use( bodyParser.urlencoded( { 'extended': true }) ); router.use( bodyParser.json() ); router.use( bodyParser.json( { type: 'application/vnd.api+json' }) ); // Filter the post requests - router.post( "/", this.onPost.bind( this ) ); + router.post( '/', this.onPost.bind( this ) ); // Register the path - e.use( "/api/message-admin", router ); + e.use( '/api/message-admin', router ); } /** @@ -38,7 +38,7 @@ export default class EmailsController extends controllerModule.Controller { // Set the content type res.setHeader( 'Content-Type', 'application/json' ); - var message: string = `Hello admin, + const message: string = `Hello admin, We have received a message from ${( req.body ).name}: ${( req.body ).message} diff --git a/src/controllers/page-renderer.ts b/src/controllers/page-renderer.ts index eee46477..d2ba7cde 100644 --- a/src/controllers/page-renderer.ts +++ b/src/controllers/page-renderer.ts @@ -1,17 +1,17 @@ -import * as mongodb from "mongodb"; -import * as http from "http"; -import { IConfig, IServer, IResponse, IRender, IGetRenders } from "modepress-api"; -import * as winston from "winston"; -import * as express from "express"; -import * as bodyParser from "body-parser"; -import { Controller } from "./controller"; -import { UsersService } from "../users-service" -import { RendersModel } from "../models/renders-model"; -import { ModelInstance, Model } from "../models/model"; -import * as net from "net"; -import * as url from "url"; -import * as jsdom from "jsdom"; -import { okJson, errJson } from "../serializers"; +import * as mongodb from 'mongodb'; +import * as http from 'http'; +import { IConfig, IServer, IResponse, IRender, IGetRenders } from 'modepress-api'; +import * as winston from 'winston'; +import * as express from 'express'; +import * as bodyParser from 'body-parser'; +import { Controller } from './controller'; +import { UsersService } from '../users-service' +import { RendersModel } from '../models/renders-model'; +import { ModelInstance, Model } from '../models/model'; +import * as net from 'net'; +import * as url from 'url'; +import * as jsdom from 'jsdom'; +import { okJson, errJson } from '../serializers'; /** * Sets up a prerender server and saves the rendered html requests to mongodb. @@ -100,30 +100,30 @@ export default class PageRenderer extends Controller { if ( !config.enableAjaxRendering ) return; - this.renderQueryFlag = "__render__request"; + this.renderQueryFlag = '__render__request'; e.use( this.processBotRequest.bind( this ) ); this.expiration = config.ajaxRenderExpiration * 1000; - var router = express.Router(); + const router = express.Router(); router.use( bodyParser.urlencoded( { 'extended': true }) ); router.use( bodyParser.json() ); router.use( bodyParser.json( { type: 'application/vnd.api+json' }) ); - router.get( "/", [ this.authenticateAdmin.bind( this ), this.getRenders.bind( this ) ] ); - router.get( "/preview/:id", [ this.previewRender.bind( this ) ] ); - router.delete( "/clear", [ this.authenticateAdmin.bind( this ), this.clearRenders.bind( this ) ] ); - router.delete( "/:id", [ this.authenticateAdmin.bind( this ), this.removeRender.bind( this ) ] ); + router.get( '/', [ this.authenticateAdmin.bind( this ), this.getRenders.bind( this ) ] ); + router.get( '/preview/:id', [ this.previewRender.bind( this ) ] ); + router.delete( '/clear', [ this.authenticateAdmin.bind( this ), this.clearRenders.bind( this ) ] ); + router.delete( '/:id', [ this.authenticateAdmin.bind( this ), this.removeRender.bind( this ) ] ); // Register the path - e.use( "/api/renders", router ); + e.use( '/api/renders', router ); } /** * Strips the html page of any script tags */ private stripScripts( html: string ): string { - var matches = html.match( /(?:[\S\s]*?)<\/script>/gi ); - for ( var i = 0; matches && i < matches.length; i++ ) + const matches = html.match( /(?:[\S\s]*?)<\/script>/gi ); + for ( let i = 0; matches && i < matches.length; i++ ) if ( matches[ i ].indexOf( 'application/ld+json' ) === -1 ) html = html.replace( matches[ i ], '' ); @@ -134,46 +134,44 @@ export default class PageRenderer extends Controller { * Gets the URL of a request */ getUrl( req: express.Request ): string { - var protocol = req.protocol; + let protocol = req.protocol; if ( req.get( 'CF-Visitor' ) ) { - var match = req.get( 'CF-Visitor' ).match( /"scheme":"(http|https)"/ ); + const match = req.get( 'CF-Visitor' ).match( /'scheme':'(http|https)'/ ); if ( match ) protocol = match[ 1 ]; } if ( req.get( 'X-Forwarded-Proto' ) ) { protocol = req.get( 'X-Forwarded-Proto' ).split( ',' )[ 0 ]; } - var addQueryMark: boolean = false; + let addQueryMark: boolean = false; if ( !req.query || Object.keys( req.query ).length === 0 ) addQueryMark = true; - return protocol + "://" + req.get( 'host' ) + req.url + ( addQueryMark ? `?${this.renderQueryFlag}=true` : `&${this.renderQueryFlag}=true` ); + return protocol + '://' + req.get( 'host' ) + req.url + ( addQueryMark ? `?${this.renderQueryFlag}=true` : `&${this.renderQueryFlag}=true` ); } /** * Fetches a page and strips it of all its script tags */ private renderPage( url: string ): Promise { - var that = this; + return new Promise(( resolve, reject ) => { + let timer: NodeJS.Timer; + let win; + const maxTries = 50; + let curTries = 0; - return new Promise( function( resolve, reject ) { - var timer: NodeJS.Timer; - var win; - var maxTries = 50; - var curTries = 0; - - var checkComplete = function() { + const checkComplete = () => { if ( !win ) { // Cleanup clearTimeout( timer ); win.close(); win = null; - throw new Error( "Page does not exist" ); + throw new Error( 'Page does not exist' ); } curTries++; if ( win.prerenderReady === undefined || win.prerenderReady || curTries > maxTries ) { - var html = that.stripScripts( win.document.documentElement.outerHTML ); + const html = this.stripScripts( win.document.documentElement.outerHTML ); // Cleanup clearTimeout( timer ); @@ -214,45 +212,44 @@ export default class PageRenderer extends Controller { if ( !this.shouldShowPrerenderedPage( req ) ) return next(); - var model = this.getModel( "renders" ) !; - var url = this.getUrl( req ); - var that = this; - var instance: ModelInstance | null = null; - var expiration = 0; + const model = this.getModel( 'renders' ) !; + const url = this.getUrl( req ); + let instance: ModelInstance | null = null; + let expiration = 0; try { instance = await model.findOne( { url: url }); - var html = ""; + let html = ''; if ( instance ) { expiration = instance.dbEntry.expiration!; - var html = instance.dbEntry.html!; + let html = instance.dbEntry.html!; if ( Date.now() > expiration ) - html = await that.renderPage( url ); - else if ( !html || html.trim() == "" ) - html = await that.renderPage( url ); + html = await this.renderPage( url ); + else if ( !html || html.trim() == '' ) + html = await this.renderPage( url ); } else - html = await that.renderPage( url ); + html = await this.renderPage( url ); if ( !instance ) { winston.info( `Saving render '${url}'`, { process: process.pid }); - await model.createInstance( { expiration: Date.now() + that.expiration, html: html, url: url }); + await model.createInstance( { expiration: Date.now() + this.expiration, html: html, url: url }); } else if ( Date.now() > expiration ) { winston.info( `Updating render '${url}'`, { process: process.pid }); - await model.update( { _id: instance.dbEntry._id }, { expiration: Date.now() + that.expiration, html: html }); + await model.update( { _id: instance.dbEntry._id }, { expiration: Date.now() + this.expiration, html: html }); } - winston.info( "Sending back render without script tags", { process: process.pid }); + winston.info( 'Sending back render without script tags', { process: process.pid }); res.status( 200 ); return res.send( html ); } catch ( err ) { res.status( 404 ); - return res.send( "Page does not exist" ); + return res.send( 'Page does not exist' ); }; }; @@ -260,15 +257,15 @@ export default class PageRenderer extends Controller { * Determines if the request comes from a bot */ private shouldShowPrerenderedPage( req: express.Request ): boolean { - var userAgent = req.headers[ 'user-agent' ] - , bufferAgent = req.headers[ 'x-bufferbot' ] - , isRequestingPrerenderedPage = false; + const userAgent = req.headers[ 'user-agent' ] + , bufferAgent = req.headers[ 'x-bufferbot' ]; + let isRequestingPrerenderedPage = false; if ( !userAgent ) return false; if ( req.method != 'GET' && req.method != 'HEAD' ) return false; //if it contains _escaped_fragment_, show prerendered page - var parsedQuery = url.parse( req.url, true ).query; + const parsedQuery = url.parse( req.url, true ).query; if ( parsedQuery && parsedQuery[ '_escaped_fragment_' ] !== undefined ) isRequestingPrerenderedPage = true; //if it is a bot...show prerendered page @@ -288,17 +285,17 @@ export default class PageRenderer extends Controller { */ private async previewRender( req: express.Request, res: express.Response ) { res.setHeader( 'Content-Type', 'text/html' ); - var renders = this.getModel( "renders" ); + const renders = this.getModel( 'renders' ); try { - var instances = await renders!.findInstances( { _id: new mongodb.ObjectID( req.params.id ) }); + const instances = await renders!.findInstances( { _id: new mongodb.ObjectID( req.params.id ) }); if ( instances.length == 0 ) - throw new Error( "Could not find a render with that ID" ); + throw new Error( 'Could not find a render with that ID' ); - var html: string = await instances[ 0 ].schema.getByName( "html" ) !.getValue(); - var matches = html.match( /(?:[\S\s]*?)<\/script>/gi ); - for ( var i = 0; matches && i < matches.length; i++ ) + let html: string = await instances[ 0 ].schema.getByName( 'html' ) !.getValue(); + const matches = html.match( /(?:[\S\s]*?)<\/script>/gi ); + for ( let i = 0; matches && i < matches.length; i++ ) if ( matches[ i ].indexOf( 'application/ld+json' ) === -1 ) { html = html.replace( matches[ i ], '' ); } @@ -315,17 +312,17 @@ export default class PageRenderer extends Controller { * Attempts to remove a render by ID */ private async removeRender( req: express.Request, res: express.Response ) { - var renders = this.getModel( "renders" ); + const renders = this.getModel( 'renders' ); try { - var numRemoved = await renders!.deleteInstances( { _id: new mongodb.ObjectID( req.params.id ) }); + const numRemoved = await renders!.deleteInstances( { _id: new mongodb.ObjectID( req.params.id ) }); if ( numRemoved == 0 ) - throw new Error( "Could not find a cache with that ID" ); + throw new Error( 'Could not find a cache with that ID' ); okJson( { error: false, - message: "Cache has been successfully removed" + message: 'Cache has been successfully removed' }, res ); } catch ( err ) { @@ -338,19 +335,19 @@ export default class PageRenderer extends Controller { * if true it passes the scope onto the next function in the queue */ private async authenticateAdmin( req: express.Request, res: express.Response, next: Function ) { - var users = UsersService.getSingleton(); + const users = UsersService.getSingleton(); try { - var auth = await users.authenticated( req ); + const auth = await users.authenticated( req ); if ( !auth.authenticated ) { okJson( { error: true, - message: "You must be logged in to make this request" + message: 'You must be logged in to make this request' }, res ); } else if ( !users.isAdmin( auth.user! ) ) { - errJson( new Error( "You do not have permission" ), res ); + errJson( new Error( 'You do not have permission' ), res ); } else { req.params.user = auth.user; @@ -358,7 +355,7 @@ export default class PageRenderer extends Controller { } } catch ( error ) { - errJson( new Error( "You do not have permission" ), res ); + errJson( new Error( 'You do not have permission' ), res ); }; } @@ -366,41 +363,40 @@ export default class PageRenderer extends Controller { * Returns an array of IPost items */ private async getRenders( req: express.Request, res: express.Response ) { - var renders = this.getModel( "renders" ); - var that = this; - var count = 0; - var findToken = {}; + const renders = this.getModel( 'renders' ); + let count = 0; + const findToken = {}; // Set the default sort order to ascending - var sortOrder = -1; + let sortOrder = -1; if ( req.query.sortOrder ) { - if ( ( req.query.sortOrder ).toLowerCase() == "asc" ) + if ( ( req.query.sortOrder ).toLowerCase() == 'asc' ) sortOrder = 1; else sortOrder = -1; } // Sort by the date created - var sort: IRender = { createdOn: sortOrder }; + const sort: IRender = { createdOn: sortOrder }; - var getContent: boolean = true; + let getContent: boolean = true; if ( req.query.minimal ) getContent = false; // Check for keywords if ( req.query.search ) - ( findToken ).url = new RegExp( req.query.search, "i" ); + ( findToken ).url = new RegExp( req.query.search, 'i' ); try { // First get the count count = await renders!.count( findToken ); - var instances = await renders!.findInstances( findToken, [ sort ], parseInt( req.query.index ), parseInt( req.query.limit ), ( getContent == false ? { html: 0 } : undefined ) ); + const instances = await renders!.findInstances( findToken, [ sort ], parseInt( req.query.index ), parseInt( req.query.limit ), ( getContent == false ? { html: 0 } : undefined ) ); - var jsons: Array> = []; - for ( var i = 0, l = instances.length; i < l; i++ ) + const jsons: Array> = []; + for ( let i = 0, l = instances.length; i < l; i++ ) jsons.push( instances[ i ].schema.getAsJson( instances[ i ]._id, { verbose: Boolean( req.query.verbose ) }) ); - var sanitizedData = await Promise.all( jsons ); + const sanitizedData = await Promise.all( jsons ); okJson( { error: false, @@ -419,11 +415,11 @@ export default class PageRenderer extends Controller { */ private async clearRenders( req: express.Request, res: express.Response ) { req; // Supress empty param warning - var renders = this.getModel( "renders" ); + const renders = this.getModel( 'renders' ); try { // First get the count - var num = await renders!.deleteInstances( {}); + const num = await renders!.deleteInstances( {}); okJson( { error: false, diff --git a/src/controllers/posts-controller.ts b/src/controllers/posts-controller.ts index 5408ec02..d327a7d7 100644 --- a/src/controllers/posts-controller.ts +++ b/src/controllers/posts-controller.ts @@ -1,17 +1,17 @@ -import * as bodyParser from "body-parser"; -import * as mongodb from "mongodb"; -import * as entities from "entities"; -import * as express from "express"; -import * as compression from "compression"; -import { Controller } from "./controller"; -import { Model } from "../models/model"; -import { PostsModel } from "../models/posts-model"; -import { CategoriesModel } from "../models/categories-model"; -import { UsersService } from "../users-service"; -import { getUser, isAdmin, hasId } from "../permission-controllers"; -import * as mp from "modepress-api"; -import * as winston from "winston"; -import { okJson, errJson } from "../serializers"; +import * as bodyParser from 'body-parser'; +import * as mongodb from 'mongodb'; +import * as entities from 'entities'; +import * as express from 'express'; +import * as compression from 'compression'; +import { Controller } from './controller'; +import { Model } from '../models/model'; +import { PostsModel } from '../models/posts-model'; +import { CategoriesModel } from '../models/categories-model'; +import { UsersService } from '../users-service'; +import { getUser, isAdmin, hasId } from '../permission-controllers'; +import * as mp from 'modepress-api'; +import * as winston from 'winston'; +import { okJson, errJson } from '../serializers'; /** * A controller that deals with the management of posts @@ -29,68 +29,67 @@ export default class PostsController extends Controller { server; // Supress empty param warning config; // Supress empty param warning - var router = express.Router(); + const router = express.Router(); router.use( compression() ); router.use( bodyParser.urlencoded( { 'extended': true }) ); router.use( bodyParser.json() ); router.use( bodyParser.json( { type: 'application/vnd.api+json' }) ); - router.get( "/posts", [ getUser, this.getPosts.bind( this ) ] ); - router.get( "/posts/slug/:slug", [ getUser, this.getPost.bind( this ) ] ); - router.get( "/posts/:id", [ getUser, hasId( "id", "ID" ), this.getPost.bind( this ) ] ); - router.delete( "/posts/:id", [ isAdmin, hasId( "id", "ID" ), this.removePost.bind( this ) ] ); - router.put( "/posts/:id", [ isAdmin, hasId( "id", "ID" ), this.updatePost.bind( this ) ] ); - router.post( "/posts", [ isAdmin, this.createPost.bind( this ) ] ); + router.get( '/posts', [ getUser, this.getPosts.bind( this ) ] ); + router.get( '/posts/slug/:slug', [ getUser, this.getPost.bind( this ) ] ); + router.get( '/posts/:id', [ getUser, hasId( 'id', 'ID' ), this.getPost.bind( this ) ] ); + router.delete( '/posts/:id', [ isAdmin, hasId( 'id', 'ID' ), this.removePost.bind( this ) ] ); + router.put( '/posts/:id', [ isAdmin, hasId( 'id', 'ID' ), this.updatePost.bind( this ) ] ); + router.post( '/posts', [ isAdmin, this.createPost.bind( this ) ] ); - router.get( "/categories", this.getCategories.bind( this ) ); - router.post( "/categories", [ isAdmin, this.createCategory.bind( this ) ] ); - router.delete( "/categories/:id", [ isAdmin, hasId( "id", "ID" ), this.removeCategory.bind( this ) ] ); + router.get( '/categories', this.getCategories.bind( this ) ); + router.post( '/categories', [ isAdmin, this.createCategory.bind( this ) ] ); + router.delete( '/categories/:id', [ isAdmin, hasId( 'id', 'ID' ), this.removeCategory.bind( this ) ] ); // Register the path - e.use( "/api", router ); + e.use( '/api', router ); } /** * Returns an array of IPost items */ private async getPosts( req: mp.IAuthReq, res: express.Response ) { - var posts = this.getModel( "posts" ); - var that = this; - var count = 0; - var visibility = "public"; - var user: UsersInterface.IUserEntry = req._user!; + const posts = this.getModel( 'posts' ); + let count = 0; + let visibility = 'public'; + const user: UsersInterface.IUserEntry = req._user!; - var findToken = { $or: [] as mp.IPost[] }; + const findToken = { $or: [] as mp.IPost[] }; if ( req.query.author ) - ( findToken ).author = new RegExp( req.query.author, "i" ); + ( findToken ).author = new RegExp( req.query.author, 'i' ); // Check for keywords if ( req.query.keyword ) { - findToken.$or.push( { title: new RegExp( req.query.keyword, "i" ) }); - findToken.$or.push( { content: new RegExp( req.query.keyword, "i" ) }); - findToken.$or.push( { brief: new RegExp( req.query.keyword, "i" ) }); + findToken.$or.push( { title: new RegExp( req.query.keyword, 'i' ) }); + findToken.$or.push( { content: new RegExp( req.query.keyword, 'i' ) }); + findToken.$or.push( { brief: new RegExp( req.query.keyword, 'i' ) }); } // Check for visibility if ( req.query.visibility ) { - if ( ( req.query.visibility ).toLowerCase() == "all" ) - visibility = "all"; - else if ( ( req.query.visibility ).toLowerCase() == "private" ) - visibility = "private"; + if ( ( req.query.visibility ).toLowerCase() == 'all' ) + visibility = 'all'; + else if ( ( req.query.visibility ).toLowerCase() == 'private' ) + visibility = 'private'; } else - visibility = "all"; + visibility = 'all'; - var users = UsersService.getSingleton(); + const users = UsersService.getSingleton(); // Only admins are allowed to see private posts - if ( !user || ( ( visibility == "all" || visibility == "private" ) && users.isAdmin( user ) == false ) ) - visibility = "public"; + if ( !user || ( ( visibility == 'all' || visibility == 'private' ) && users.isAdmin( user ) == false ) ) + visibility = 'public'; // Add the or conditions for visibility - if ( visibility != "all" ) { - if ( visibility == "public" ) + if ( visibility != 'all' ) { + if ( visibility == 'public' ) ( findToken ).public = true; else ( findToken ).public = false; @@ -98,14 +97,14 @@ export default class PostsController extends Controller { // Check for tags (an OR request with tags) if ( req.query.tags ) { - var tags = req.query.tags.split( "," ); + const tags = req.query.tags.split( ',' ); if ( tags.length > 0 ) ( findToken ).tags = { $in: tags }; } // Check for 'r'equired tags (an AND request with tags) if ( req.query.rtags ) { - var rtags = req.query.rtags.split( "," ); + const rtags = req.query.rtags.split( ',' ); if ( rtags.length > 0 ) { if ( !( findToken ).tags ) ( findToken ).tags = { $all: rtags }; @@ -116,23 +115,23 @@ export default class PostsController extends Controller { // Check for categories if ( req.query.categories ) { - var categories = req.query.categories.split( "," ); + const categories = req.query.categories.split( ',' ); if ( categories.length > 0 ) ( findToken ).categories = { $in: categories }; } // Set the default sort order to ascending - var sortOrder = -1; + let sortOrder = -1; if ( req.query.sortOrder ) { - if ( ( req.query.sortOrder ).toLowerCase() == "asc" ) + if ( ( req.query.sortOrder ).toLowerCase() == 'asc' ) sortOrder = 1; else sortOrder = -1; } // Sort by the date created - var sort: mp.IPost = { createdOn: sortOrder }; + let sort: mp.IPost = { createdOn: sortOrder }; // Optionally sort by the last updated if ( req.query.sort ) { @@ -140,7 +139,7 @@ export default class PostsController extends Controller { sort = { lastUpdated: sortOrder }; } - var getContent: boolean = true; + let getContent: boolean = true; if ( req.query.minimal ) getContent = false; @@ -153,13 +152,13 @@ export default class PostsController extends Controller { // First get the count count = await posts!.count( findToken ); - var instances = await posts!.findInstances( findToken, [ sort ], parseInt( req.query.index ), parseInt( req.query.limit ), ( getContent == false ? { content: 0 } : undefined ) ); + const instances = await posts!.findInstances( findToken, [ sort ], parseInt( req.query.index ), parseInt( req.query.limit ), ( getContent == false ? { content: 0 } : undefined ) ); - var jsons: Array> = []; - for ( var i = 0, l = instances.length; i < l; i++ ) + const jsons: Array> = []; + for ( let i = 0, l = instances.length; i < l; i++ ) jsons.push( instances[ i ].schema.getAsJson( instances[ i ]._id, { verbose: Boolean( req.query.verbose ) }) ); - var sanitizedData = await Promise.all( jsons ); + const sanitizedData = await Promise.all( jsons ); okJson( { error: false, @@ -177,10 +176,9 @@ export default class PostsController extends Controller { * Returns a single post */ private async getPost( req: mp.IAuthReq, res: express.Response ) { - var posts = this.getModel( "posts" ); - var that = this; - var findToken: mp.IPost; - var user: UsersInterface.IUserEntry = req._user!; + const posts = this.getModel( 'posts' ); + let findToken: mp.IPost; + const user: UsersInterface.IUserEntry = req._user!; try { if ( req.params.id ) @@ -188,22 +186,22 @@ export default class PostsController extends Controller { else findToken = { slug: req.params.slug }; - var instances = await posts!.findInstances( findToken, [], 0, 1 ); + const instances = await posts!.findInstances( findToken, [], 0, 1 ); if ( instances.length == 0 ) - throw new Error( "Could not find post" ); + throw new Error( 'Could not find post' ); - var users = UsersService.getSingleton(); - var isPublic = await instances[ 0 ].schema.getByName( "public" ) !.getValue(); + const users = UsersService.getSingleton(); + const isPublic = await instances[ 0 ].schema.getByName( 'public' ) !.getValue(); // Only admins are allowed to see private posts if ( !isPublic && ( !user || users.isAdmin( user ) == false ) ) - throw new Error( "That post is marked private" ); + throw new Error( 'That post is marked private' ); - var jsons: Array> = []; - for ( var i = 0, l = instances.length; i < l; i++ ) + const jsons: Array> = []; + for ( let i = 0, l = instances.length; i < l; i++ ) jsons.push( instances[ i ].schema.getAsJson( instances[ i ]._id, { verbose: Boolean( req.query.verbose ) }) ); - var sanitizedData = await Promise.all( jsons ); + const sanitizedData = await Promise.all( jsons ); okJson( { error: false, @@ -220,17 +218,16 @@ export default class PostsController extends Controller { * Returns an array of ICategory items */ private async getCategories( req: mp.IAuthReq, res: express.Response ) { - var categories = this.getModel( "categories" ) !; - var that = this; + const categories = this.getModel( 'categories' ) !; try { - var instances = await categories.findInstances( {}, {}, parseInt( req.query.index ), parseInt( req.query.limit ) ); + const instances = await categories.findInstances( {}, {}, parseInt( req.query.index ), parseInt( req.query.limit ) ); - var jsons: Array> = []; - for ( var i = 0, l = instances.length; i < l; i++ ) + const jsons: Array> = []; + for ( let i = 0, l = instances.length; i < l; i++ ) jsons.push( instances[ i ].schema.getAsJson( instances[ i ]._id, { verbose: Boolean( req.query.verbose ) }) ); - var sanitizedData = await Promise.all( jsons ); + const sanitizedData = await Promise.all( jsons ); okJson( { error: false, @@ -248,18 +245,18 @@ export default class PostsController extends Controller { * Attempts to remove a post by ID */ private async removePost( req: mp.IAuthReq, res: express.Response ) { - var posts = this.getModel( "posts" ) !; + const posts = this.getModel( 'posts' ) !; try { // Attempt to delete the instances - var numRemoved = await posts.deleteInstances( { _id: new mongodb.ObjectID( req.params.id ) }); + const numRemoved = await posts.deleteInstances( { _id: new mongodb.ObjectID( req.params.id ) }); if ( numRemoved == 0 ) - throw new Error( "Could not find a post with that ID" ); + throw new Error( 'Could not find a post with that ID' ); okJson( { error: false, - message: "Post has been successfully removed" + message: 'Post has been successfully removed' }, res ); } catch ( err ) { @@ -271,17 +268,17 @@ export default class PostsController extends Controller { * Attempts to remove a category by ID */ private async removeCategory( req: mp.IAuthReq, res: express.Response ) { - var categories = this.getModel( "categories" ) !; + const categories = this.getModel( 'categories' ) !; try { - var numRemoved = await categories.deleteInstances( { _id: new mongodb.ObjectID( req.params.id ) }); + const numRemoved = await categories.deleteInstances( { _id: new mongodb.ObjectID( req.params.id ) }); if ( numRemoved == 0 ) - return Promise.reject( new Error( "Could not find a category with that ID" ) ); + return Promise.reject( new Error( 'Could not find a category with that ID' ) ); okJson( { error: false, - message: "Category has been successfully removed" + message: 'Category has been successfully removed' }, res ); } catch ( err ) { @@ -293,21 +290,21 @@ export default class PostsController extends Controller { * Attempts to update a post by ID */ private async updatePost( req: mp.IAuthReq, res: express.Response ) { - var token: mp.IPost = req.body; - var posts = this.getModel( "posts" ) !; + const token: mp.IPost = req.body; + const posts = this.getModel( 'posts' ) !; try { - var instance = await posts.update( { _id: new mongodb.ObjectID( req.params.id ) }, token ); + const instance = await posts.update( { _id: new mongodb.ObjectID( req.params.id ) }, token ); if ( instance.error ) throw new Error( instance.tokens[ 0 ].error ); if ( instance.tokens.length == 0 ) - throw new Error( "Could not find post with that id" ); + throw new Error( 'Could not find post with that id' ); okJson( { error: false, - message: "Post Updated" + message: 'Post Updated' }, res ); } catch ( err ) { @@ -319,19 +316,19 @@ export default class PostsController extends Controller { * Attempts to create a new post */ private async createPost( req: mp.IAuthReq, res: express.Response ) { - var token: mp.IPost = req.body; - var posts = this.getModel( "posts" ) !; + const token: mp.IPost = req.body; + const posts = this.getModel( 'posts' ) !; // User is passed from the authentication function token.author = req._user!.username; try { - var instance = await posts.createInstance( token ); - var json = await instance.schema.getAsJson( instance._id, { verbose: true }); + const instance = await posts.createInstance( token ); + const json = await instance.schema.getAsJson( instance._id, { verbose: true }); okJson( { error: false, - message: "New post created", + message: 'New post created', data: json }, res ); @@ -344,16 +341,16 @@ export default class PostsController extends Controller { * Attempts to create a new category item */ private async createCategory( req: mp.IAuthReq, res: express.Response ) { - var token: mp.ICategory = req.body; - var categories = this.getModel( "categories" ) !; + const token: mp.ICategory = req.body; + const categories = this.getModel( 'categories' ) !; try { - var instance = await categories.createInstance( token ); - var json = await instance.schema.getAsJson( instance._id, { verbose: true }); + const instance = await categories.createInstance( token ); + const json = await instance.schema.getAsJson( instance._id, { verbose: true }); okJson( { error: false, - message: "New category created", + message: 'New category created', data: json }, res ); diff --git a/src/definitions/custom/modepress.d.ts b/src/definitions/custom/modepress.d.ts index a3605a8a..fafcc69f 100644 --- a/src/definitions/custom/modepress.d.ts +++ b/src/definitions/custom/modepress.d.ts @@ -231,7 +231,7 @@ */ export interface IPath { /** - * The express end point route to use. E.g. "*" or "/some-route" + * The express end point route to use. E.g. '*' or '/some-route' */ path: string; @@ -243,7 +243,7 @@ /** * An array of javascript file paths that should be added to the page when it loads - * e.g. ["./plugins/my-plugin/index.js"] + * e.g. ['./plugins/my-plugin/index.js'] */ plugins: Array; @@ -267,7 +267,7 @@ * is accomplished by sending a headless browser request to the page and waiting for it to fully load. Once loaded the page is saved * and stripped of scripts. Any subsequent calls to the page will result in the saved page being presented as long as the expiration * has not been exceeded - if it has then a new render is done. - * e.g. "127.0.0.1:3000" + * e.g. '127.0.0.1:3000' */ enableAjaxRendering: boolean; @@ -959,7 +959,7 @@ export function isValidID( str: string ): boolean; } -declare module "modepress-api" +declare module 'modepress-api' { export = Modepress; } \ No newline at end of file diff --git a/src/definitions/generated/modepress.d.ts b/src/definitions/generated/modepress.d.ts index 2925792b..46920ad1 100644 --- a/src/definitions/generated/modepress.d.ts +++ b/src/definitions/generated/modepress.d.ts @@ -231,7 +231,7 @@ declare module Modepress { */ export interface IPath { /** - * The express end point route to use. E.g. "*" or "/some-route" + * The express end point route to use. E.g. '*' or '/some-route' */ path: string; @@ -243,7 +243,7 @@ declare module Modepress { /** * An array of javascript file paths that should be added to the page when it loads - * e.g. ["./plugins/my-plugin/index.js"] + * e.g. ['./plugins/my-plugin/index.js'] */ plugins: Array; @@ -267,7 +267,7 @@ declare module Modepress { * is accomplished by sending a headless browser request to the page and waiting for it to fully load. Once loaded the page is saved * and stripped of scripts. Any subsequent calls to the page will result in the saved page being presented as long as the expiration * has not been exceeded - if it has then a new render is done. - * e.g. "127.0.0.1:3000" + * e.g. '127.0.0.1:3000' */ enableAjaxRendering: boolean; @@ -959,7 +959,7 @@ declare module Modepress { export function isValidID( str: string ): boolean; } -declare module "modepress-api" +declare module 'modepress-api' { export = Modepress; } \ No newline at end of file diff --git a/src/event-manager.ts b/src/event-manager.ts index e3351d8d..c6609e2a 100644 --- a/src/event-manager.ts +++ b/src/event-manager.ts @@ -1,8 +1,8 @@ -import { IConfig } from "modepress-api"; -import * as ws from "ws"; -import * as winston from "winston"; -import * as events from "events"; -import * as users from "webinate-users"; +import { IConfig } from 'modepress-api'; +import * as ws from 'ws'; +import * as winston from 'winston'; +import * as events from 'events'; +import * as users from 'webinate-users'; /** * A class for handling events sent from a webinate user server @@ -24,18 +24,17 @@ export class EventManager extends events.EventEmitter { * Intiailizes the manager */ init(): Promise { - var cfg = this._cfg; - var that = this; + const cfg = this._cfg; - return new Promise( function( resolve ) { - var reconnectInterval = 3 * 1000; - var _client; + return new Promise(( resolve ) => { + const reconnectInterval = 3 * 1000; + let _client; - var connect = function() { + const connect = () => { let options: any = { headers: {} }; options.headers[ 'users-api-key' ] = cfg.usersSocketApiKey; - var _client = new ws( cfg.usersSocketURL, options ); + const _client = new ws( cfg.usersSocketURL, options ); // Opens a stream to the users socket events _client.on( 'open', function() { @@ -56,7 +55,7 @@ export class EventManager extends events.EventEmitter { }); // We have recieved a message from the user socket - _client.on( 'message', that.onMessage.bind( that ) ); + _client.on( 'message', this.onMessage.bind( this ) ); }; connect(); @@ -69,7 +68,7 @@ export class EventManager extends events.EventEmitter { private onMessage( data: any, flags: { mask: boolean; binary: boolean; compress: boolean; }) { if ( !flags.binary ) { try { - var event = JSON.parse( data ); + const event = JSON.parse( data ); this.emit( event.type, event ); } catch ( err ) { diff --git a/src/models/categories-model.ts b/src/models/categories-model.ts index 9b66e455..25720071 100644 --- a/src/models/categories-model.ts +++ b/src/models/categories-model.ts @@ -1,13 +1,13 @@ -import { Model } from "./model"; -import { num, text, date } from "./schema-items/schema-item-factory"; +import { Model } from './model'; +import { num, text, date } from './schema-items/schema-item-factory'; export class CategoriesModel extends Model { constructor() { - super( "categories" ); + super( 'categories' ); - this.defaultSchema.add( new text( "title", "", 1 ) ); - this.defaultSchema.add( new text( "slug", "", 1, 20 ) ).setUnique( true ); - this.defaultSchema.add( new text( "description", "" ) ); - this.defaultSchema.add( new text( "parent", "" ) ); + this.defaultSchema.add( new text( 'title', '', 1 ) ); + this.defaultSchema.add( new text( 'slug', '', 1, 20 ) ).setUnique( true ); + this.defaultSchema.add( new text( 'description', '' ) ); + this.defaultSchema.add( new text( 'parent', '' ) ); } } \ No newline at end of file diff --git a/src/models/comments-model.ts b/src/models/comments-model.ts index 50ddbc83..65342545 100644 --- a/src/models/comments-model.ts +++ b/src/models/comments-model.ts @@ -1,19 +1,19 @@ -import { Model } from "./model"; -import { num, text, bool, textArray, idArray, date, html, foreignKey } from "./schema-items/schema-item-factory"; -import { SchemaHtml } from "./schema-items/schema-html"; +import { Model } from './model'; +import { num, text, bool, textArray, idArray, date, html, foreignKey } from './schema-items/schema-item-factory'; +import { SchemaHtml } from './schema-items/schema-html'; export class CommentsModel extends Model { constructor() { - super( "comments" ); + super( 'comments' ); - this.defaultSchema.add( new text( "author", "" ) ).setRequired( true ) - this.defaultSchema.add( new foreignKey( "post", "", "posts", false ) ).setRequired( true ) - this.defaultSchema.add( new foreignKey( "parent", "", "comments", true ) ) - this.defaultSchema.add( new idArray( "children", [], 0, undefined, "comments" ) ) - this.defaultSchema.add( new html( "content", "", SchemaHtml.defaultTags.concat( "img" ), undefined, true ) ); - this.defaultSchema.add( new bool( "public", true ) ); - this.defaultSchema.add( new date( "createdOn" ) ).setIndexable( true ); - this.defaultSchema.add( new date( "lastUpdated", undefined, true ) ).setIndexable( true ); + this.defaultSchema.add( new text( 'author', '' ) ).setRequired( true ) + this.defaultSchema.add( new foreignKey( 'post', '', 'posts', false ) ).setRequired( true ) + this.defaultSchema.add( new foreignKey( 'parent', '', 'comments', true ) ) + this.defaultSchema.add( new idArray( 'children', [], 0, undefined, 'comments' ) ) + this.defaultSchema.add( new html( 'content', '', SchemaHtml.defaultTags.concat( 'img' ), undefined, true ) ); + this.defaultSchema.add( new bool( 'public', true ) ); + this.defaultSchema.add( new date( 'createdOn' ) ).setIndexable( true ); + this.defaultSchema.add( new date( 'lastUpdated', undefined, true ) ).setIndexable( true ); } } \ No newline at end of file diff --git a/src/models/model.ts b/src/models/model.ts index 02b507a1..77ad6467 100644 --- a/src/models/model.ts +++ b/src/models/model.ts @@ -1,7 +1,7 @@ -import * as mongodb from "mongodb"; -import { Schema } from "./schema"; -import * as winston from "winston"; -import { IModelEntry } from "modepress-api"; +import * as mongodb from 'mongodb'; +import { Schema } from './schema'; +import * as winston from 'winston'; +import { IModelEntry } from 'modepress-api'; export interface UpdateToken { error: string | boolean; instance: ModelInstance } @@ -36,15 +36,14 @@ export class ModelInstance * Gets a string representation of all fields that are unique */ uniqueFieldNames(): string { - var instance = this; - var uniqueNames = ""; - var items = instance.schema.getItems(); + let uniqueNames = ''; + const items = this.schema.getItems(); - for ( var i = 0, l = items.length; i < l; i++ ) + for ( let i = 0, l = items.length; i < l; i++ ) if ( items[ i ].getUnique() ) - uniqueNames += items[ i ].name + ", "; + uniqueNames += items[ i ].name + ', '; - if ( uniqueNames != "" ) + if ( uniqueNames != '' ) uniqueNames = uniqueNames.slice( 0, uniqueNames.length - 2 ); return uniqueNames; @@ -86,8 +85,8 @@ export abstract class Model { * @returns Returns the registered model */ static registerModel( modelConstructor: any ): T { - var models = Model._registeredModels; - for ( var i in models ) + const models = Model._registeredModels; + for ( const i in models ) if ( modelConstructor == models[ i ].constructor ) return models[ i ]; @@ -110,7 +109,7 @@ export abstract class Model { * @param collection The collection we are setting the index on */ private async createIndex( name: string, collection: mongodb.Collection ): Promise { - var index = await collection.createIndex( name ); + const index = await collection.createIndex( name ); return index; } @@ -132,22 +131,22 @@ export abstract class Model { this.collection = await db.createCollection( this._collectionName ); if ( !this.collection ) - throw new Error( "Error creating collection: " + this._collectionName ); + throw new Error( 'Error creating collection: ' + this._collectionName ); // First remove all existing indices - var response = await this.collection.dropIndexes(); + const response = await this.collection.dropIndexes(); // Now re-create the models who need index supports - var promises: Array> = []; - var items = this.defaultSchema.getItems(); - for ( var i = 0, l = items.length; i < l; i++ ) + const promises: Array> = []; + const items = this.defaultSchema.getItems(); + for ( let i = 0, l = items.length; i < l; i++ ) if ( items[ i ].getIndexable() ) promises.push( this.createIndex( items[ i ].name, this.collection ) ); if ( promises.length == 0 ) this._initialized = true; - var models = await Promise.all( promises ); + const models = await Promise.all( promises ); this._initialized = true; winston.info( `Successfully created model '${this._collectionName}'`, { process: process.pid }); @@ -159,10 +158,10 @@ export abstract class Model { * @param selector The mongodb selector */ async count( selector: any ): Promise { - var collection = this.collection; + const collection = this.collection; if ( !collection || !this._initialized ) - throw new Error( "The model has not been initialized" ); + throw new Error( 'The model has not been initialized' ); return await collection.count( selector ); } @@ -177,20 +176,20 @@ export abstract class Model { * @param projection See http://docs.mongodb.org/manual/reference/method/db.collection.find/#projections */ async findInstances( selector: any, sort?: any, startIndex: number = 0, limit: number = 0, projection?: any ): Promise>> { - var collection = this.collection; + const collection = this.collection; if ( !collection || !this._initialized ) - throw new Error( "The model has not been initialized" ); + throw new Error( 'The model has not been initialized' ); // Attempt to save the data to mongo collection - var result = await collection.find( selector ).limit( limit ).skip( startIndex ).project( projection || {}).sort( sort ).toArray(); + const result = await collection.find( selector ).limit( limit ).skip( startIndex ).project( projection || {}).sort( sort ).toArray(); // Create the instance array - var instances: Array> = [], - instance: ModelInstance; + const instances: Array> = []; + let instance: ModelInstance; // For each data entry, create a new instance - for ( var i = 0, l = result.length; i < l; i++ ) { + for ( let i = 0, l = result.length; i < l; i++ ) { instance = new ModelInstance( this, result[ i ] ); instance.schema.deserialize( result[ i ] ); instance._id = result[ i ]._id; @@ -207,20 +206,20 @@ export abstract class Model { * @param projection See http://docs.mongodb.org/manual/reference/method/db.collection.find/#projections */ async findOne( selector: any, projection?: any ): Promise | null> { - var collection = this.collection; + const collection = this.collection; if ( !collection || !this._initialized ) - throw new Error( "The model has not been initialized" ); + throw new Error( 'The model has not been initialized' ); // Attempt to save the data to mongo collection - var result = await collection.find( selector ).limit( 1 ).project( projection || {}).next(); + const result = await collection.find( selector ).limit( 1 ).project( projection || {}).next(); // Check for errors if ( !result ) return null; else { // Create the instance array - var instance: ModelInstance; + let instance: ModelInstance; instance = new ModelInstance( this, result ); instance.schema.deserialize( result ); @@ -235,16 +234,16 @@ export abstract class Model { * Deletes a instance and all its dependencies are updated or deleted accordingly */ private async deleteInstance( instance: ModelInstance ): Promise { - var foreignModel: Model; - var optionalDependencies = instance.dbEntry._optionalDependencies; - var requiredDependencies = instance.dbEntry._requiredDependencies; - var arrayDependencies = instance.dbEntry._arrayDependencies; + let foreignModel: Model; + const optionalDependencies = instance.dbEntry._optionalDependencies; + const requiredDependencies = instance.dbEntry._requiredDependencies; + const arrayDependencies = instance.dbEntry._arrayDependencies; - var promises: Array> = []; + const promises: Array> = []; // Nullify all dependencies that are optional if ( optionalDependencies ) - for ( var i = 0, l = optionalDependencies.length; i < l; i++ ) { + for ( let i = 0, l = optionalDependencies.length; i < l; i++ ) { foreignModel = Model.getByName( optionalDependencies[ i ].collection ); if ( !foreignModel ) continue; @@ -256,7 +255,7 @@ export abstract class Model { // Remove any dependencies that are in arrays if ( arrayDependencies ) - for ( var i = 0, l = arrayDependencies.length; i < l; i++ ) { + for ( let i = 0, l = arrayDependencies.length; i < l; i++ ) { foreignModel = Model.getByName( arrayDependencies[ i ].collection ); if ( !foreignModel ) continue; @@ -268,7 +267,7 @@ export abstract class Model { // For those dependencies that are required, we delete the instances if ( requiredDependencies ) - for ( var i = 0, l = requiredDependencies.length; i < l; i++ ) { + for ( let i = 0, l = requiredDependencies.length; i < l; i++ ) { foreignModel = Model.getByName( requiredDependencies[ i ].collection ); if ( !foreignModel ) continue; @@ -279,10 +278,10 @@ export abstract class Model { // Added the schema item post deletion promises promises.push( instance.schema.postDelete( instance, this._collectionName ) ); - var dependenciesResults = await Promise.all( promises ); + const dependenciesResults = await Promise.all( promises ); // Remove the original instance from the DB - var deleteResult = await this.collection.deleteMany( { _id: instance.dbEntry._id }); + const deleteResult = await this.collection.deleteMany( { _id: instance.dbEntry._id }); return deleteResult.deletedCount!; } @@ -291,16 +290,16 @@ export abstract class Model { * Deletes a number of instances based on the selector. The promise reports how many items were deleted */ async deleteInstances( selector: any ): Promise { - var model = this; + const model = this; - var instances = await this.findInstances( selector ); + const instances = await this.findInstances( selector ); if ( !instances || instances.length == 0 ) return 0; - var promises: Array> = []; + const promises: Array> = []; - for ( var i = 0, l = instances.length; i < l; i++ ) { + for ( let i = 0, l = instances.length; i < l; i++ ) { promises.push( this.deleteInstance( instances[ i ] ) ); }; @@ -319,18 +318,18 @@ export abstract class Model { * went wrong when updating the specific instance, and a string message if something did in fact go wrong */ async update( selector: any, data: T ): Promise> { - var toRet: UpdateRequest = { + const toRet: UpdateRequest = { error: false, tokens: [] }; - var instances = await this.findInstances( selector ); + const instances = await this.findInstances( selector ); if ( !instances || instances.length == 0 ) return toRet; - for ( var i = 0, l = instances.length; i < l; i++ ) { - var instance = instances[ i ]; + for ( let i = 0, l = instances.length; i < l; i++ ) { + const instance = instances[ i ]; // If we have data, then set the variables if ( data ) @@ -341,7 +340,7 @@ export abstract class Model { await instance.schema.validate( false ); // Make sure any unique fields are still being respected - var unique = await this.checkUniqueness( instance ); + const unique = await this.checkUniqueness( instance ); if ( !unique ) { toRet.error = true; @@ -350,9 +349,9 @@ export abstract class Model { } // Transform the schema into a JSON ready format - var json = instance.schema.serialize(); - var collection = this.collection; - var updateResult = await collection.updateOne( { _id: ( instance )._id }, { $set: json }); + const json = instance.schema.serialize(); + const collection = this.collection; + const updateResult = await collection.updateOne( { _id: ( instance )._id }, { $set: json }); // Now that everything has been added, we can do some post insert/update validation await instance.schema.postUpsert( instance, this._collectionName ); @@ -374,14 +373,14 @@ export abstract class Model { * by parsing the data object and setting each schema item's value by the name/value in the data object. */ async checkUniqueness( instance: ModelInstance ): Promise { - var items = instance.schema.getItems(); - var hasUniqueField: boolean = false; - var searchToken = { $or: [] as any[] }; + const items = instance.schema.getItems(); + let hasUniqueField: boolean = false; + const searchToken = { $or: [] as any[] }; if ( instance._id ) - searchToken[ "_id" ] = { $ne: instance._id }; + searchToken[ '_id' ] = { $ne: instance._id }; - for ( var i = 0, l = items.length; i < l; i++ ) { + for ( let i = 0, l = items.length; i < l; i++ ) { if ( items[ i ].getUnique() ) { hasUniqueField = true; var searchField = {}; @@ -395,7 +394,7 @@ export abstract class Model { if ( !hasUniqueField ) return true; else { - var result = await this.collection.count( searchToken ); + const result = await this.collection.count( searchToken ); if ( result == 0 ) return true; else @@ -410,19 +409,19 @@ export abstract class Model { * by parsing the data object and setting each schema item's value by the name/value in the data object */ async createInstance( data?: T ): Promise> { - var newInstance = new ModelInstance( this, null ); + const newInstance = new ModelInstance( this, null ); // If we have data, then set the variables if ( data ) newInstance.schema.set( data ); - var unique = await this.checkUniqueness( newInstance ); + const unique = await this.checkUniqueness( newInstance ); if ( !unique ) throw new Error( `'${newInstance.uniqueFieldNames()}' must be unique` ); // Now try to create a new instance - var instance = await this.insert( [ newInstance ] ); + const instance = await this.insert( [ newInstance ] ); // All ok return instance[ 0 ]; @@ -433,40 +432,40 @@ export abstract class Model { * @param instances An array of instances to save */ async insert( instances: Array> ): Promise>> { - var model = this; - var collection = model.collection; + const model = this; + const collection = model.collection; if ( !collection || !model._initialized ) - throw new Error( "The model has not been initialized" ); + throw new Error( 'The model has not been initialized' ); - var instance: ModelInstance; - var documents: Array = []; - var promises: Array> = []; + let instance: ModelInstance; + const documents: Array = []; + const promises: Array> = []; // Make sure the parameters are valid - for ( var i = 0, l = instances.length; i < l; i++ ) + for ( let i = 0, l = instances.length; i < l; i++ ) promises.push( instances[ i ].schema.validate( true ) ); - var schemas = await Promise.all( promises ); + const schemas = await Promise.all( promises ); // Transform the schema into a JSON ready format - for ( var i = 0, l = schemas.length; i < l; i++ ) { - var json = schemas[ i ].serialize(); + for ( let i = 0, l = schemas.length; i < l; i++ ) { + const json = schemas[ i ].serialize(); documents.push( json ); } // Attempt to save the data to mongo collection - var insertResult = await collection.insertMany( documents ); + const insertResult = await collection.insertMany( documents ); // Assign the ID's - for ( var i = 0, l = insertResult.ops.length; i < l; i++ ) { + for ( let i = 0, l = insertResult.ops.length; i < l; i++ ) { instances[ i ]._id = insertResult.ops[ i ]._id; instances[ i ].dbEntry = insertResult.ops[ i ]; } // Now that everything has been added, we can do some post insert/update validation - var postValidationPromises: Array> = []; - for ( var i = 0, l = instances.length; i < l; i++ ) + const postValidationPromises: Array> = []; + for ( let i = 0, l = instances.length; i < l; i++ ) postValidationPromises.push( instances[ i ].schema.postUpsert( instances[ i ], this._collectionName ) ); await Promise.all( postValidationPromises ); diff --git a/src/models/posts-model.ts b/src/models/posts-model.ts index a2ee52bd..3a5d0fa5 100644 --- a/src/models/posts-model.ts +++ b/src/models/posts-model.ts @@ -1,22 +1,22 @@ -import { Model } from "./model"; -import { num, text, bool, textArray, date, html } from "./schema-items/schema-item-factory"; -import { SchemaHtml } from "./schema-items/schema-html"; +import { Model } from './model'; +import { num, text, bool, textArray, date, html } from './schema-items/schema-item-factory'; +import { SchemaHtml } from './schema-items/schema-html'; export class PostsModel extends Model { constructor() { - super( "posts" ); + super( 'posts' ); - this.defaultSchema.add( new text( "author", "", 1 ) ); - this.defaultSchema.add( new text( "title", "", 1 ) ); - this.defaultSchema.add( new text( "slug", "", 1, 512 ) ).setUnique( true ).setRequired( true ); - this.defaultSchema.add( new text( "brief", "" ) ); - this.defaultSchema.add( new text( "featuredImage", "" ) ); - this.defaultSchema.add( new html( "content", "", SchemaHtml.defaultTags.concat( "img" ), undefined, false ) ); - this.defaultSchema.add( new bool( "public", true ) ); - this.defaultSchema.add( new textArray( "categories", [] ) ); - this.defaultSchema.add( new textArray( "tags", [] ) ); - this.defaultSchema.add( new date( "createdOn" ) ).setIndexable( true ); - this.defaultSchema.add( new date( "lastUpdated", undefined, true ) ).setIndexable( true ); + this.defaultSchema.add( new text( 'author', '', 1 ) ); + this.defaultSchema.add( new text( 'title', '', 1 ) ); + this.defaultSchema.add( new text( 'slug', '', 1, 512 ) ).setUnique( true ).setRequired( true ); + this.defaultSchema.add( new text( 'brief', '' ) ); + this.defaultSchema.add( new text( 'featuredImage', '' ) ); + this.defaultSchema.add( new html( 'content', '', SchemaHtml.defaultTags.concat( 'img' ), undefined, false ) ); + this.defaultSchema.add( new bool( 'public', true ) ); + this.defaultSchema.add( new textArray( 'categories', [] ) ); + this.defaultSchema.add( new textArray( 'tags', [] ) ); + this.defaultSchema.add( new date( 'createdOn' ) ).setIndexable( true ); + this.defaultSchema.add( new date( 'lastUpdated', undefined, true ) ).setIndexable( true ); } } \ No newline at end of file diff --git a/src/models/renders-model.ts b/src/models/renders-model.ts index 4575814d..8a499330 100644 --- a/src/models/renders-model.ts +++ b/src/models/renders-model.ts @@ -1,13 +1,13 @@ -import { Model } from "./model"; -import { text, date, html } from "./schema-items/schema-item-factory"; +import { Model } from './model'; +import { text, date, html } from './schema-items/schema-item-factory'; export class RendersModel extends Model { constructor() { - super( "renders" ); + super( 'renders' ); - this.defaultSchema.add( new text( "url", "", 1, 1000, false ) ); - this.defaultSchema.add( new text( "html", "", 0, Number.MAX_VALUE, false ) ); - this.defaultSchema.add( new date( "expiration", undefined, false ) ); - this.defaultSchema.add( new date( "createdOn" ) ).setIndexable( true ); + this.defaultSchema.add( new text( 'url', '', 1, 1000, false ) ); + this.defaultSchema.add( new text( 'html', '', 0, Number.MAX_VALUE, false ) ); + this.defaultSchema.add( new date( 'expiration', undefined, false ) ); + this.defaultSchema.add( new date( 'createdOn' ) ).setIndexable( true ); } } \ No newline at end of file diff --git a/src/models/schema-items/schema-bool.ts b/src/models/schema-items/schema-bool.ts index 6bfbda6e..de3d10af 100644 --- a/src/models/schema-items/schema-bool.ts +++ b/src/models/schema-items/schema-bool.ts @@ -1,5 +1,5 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; /** * A bool scheme item for use in Models @@ -29,7 +29,7 @@ export class SchemaBool extends SchemaItem * Always true */ public validate(): Promise { - var val = this.value; + const val = this.value; if ( val === undefined ) return Promise.reject( new Error( `${this.name} cannot be undefined` ) ); if ( val === null ) diff --git a/src/models/schema-items/schema-date.ts b/src/models/schema-items/schema-date.ts index 422840b1..f2d38625 100644 --- a/src/models/schema-items/schema-date.ts +++ b/src/models/schema-items/schema-date.ts @@ -1,5 +1,5 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; /** * A date scheme item for use in Models diff --git a/src/models/schema-items/schema-foreign-key.ts b/src/models/schema-items/schema-foreign-key.ts index 2ee922ff..cb993707 100644 --- a/src/models/schema-items/schema-foreign-key.ts +++ b/src/models/schema-items/schema-foreign-key.ts @@ -1,9 +1,9 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; -import { Model, ModelInstance } from "../model"; -import { ObjectID } from "mongodb"; -import { Utils } from "../../utils"; -import { SchemaIdArray } from "./schema-id-array"; +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; +import { Model, ModelInstance } from '../model'; +import { ObjectID } from 'mongodb'; +import { Utils } from '../../utils'; +import { SchemaIdArray } from './schema-id-array'; /** * Represents a mongodb ObjectID of a document in separate collection. @@ -47,18 +47,18 @@ export class SchemaForeignKey extends SchemaItem { - var transformedValue = this.value; + let transformedValue = this.value; // If they key is required then it must exist - var model = Model.getByName( this.targetCollection ); + const model = Model.getByName( this.targetCollection ); if ( !model ) throw new Error( `${this.name} references a foreign key '${this.targetCollection}' which doesn't seem to exist` ); - if ( typeof this.value == "string" ) { + if ( typeof this.value == 'string' ) { if ( Utils.isValidObjectID( this.value ) ) transformedValue = this.value = new ObjectID( this.value ); - else if ( ( this.value ).trim() != "" ) + else if ( ( this.value ).trim() != '' ) throw new Error( `Please use a valid ID for '${this.name}'` ); else transformedValue = null; @@ -71,7 +71,7 @@ export class SchemaForeignKey extends SchemaItem( { _id: this.value }); + const result = await model.findOne( { _id: this.value }); if ( !this.optionalKey && !result ) throw new Error( `${this.name} does not exist` ); @@ -92,10 +92,10 @@ export class SchemaForeignKey extends SchemaItem( instance: ModelInstance ): Promise { // If they key is required then it must exist - var model = Model.getByName( this.targetCollection ); + const model = Model.getByName( this.targetCollection ); if ( !model ) return; - if ( !this.value || this.value == "" ) + if ( !this.value || this.value == '' ) return; // We can assume the value is object id by this point - var result = await model.findOne( { _id: this.value }); + const result = await model.findOne( { _id: this.value }); if ( !result ) return; - var query; + let query; if ( this.optionalKey ) query = { $pull: { _optionalDependencies: { _id: instance.dbEntry._id } } }; @@ -159,7 +159,7 @@ export class SchemaForeignKey extends SchemaItem { if ( options.expandForeignKeys && options.expandMaxDepth === undefined ) - throw new Error( "You cannot set expandForeignKeys and not specify the expandMaxDepth" ); + throw new Error( 'You cannot set expandForeignKeys and not specify the expandMaxDepth' ); if ( !options.expandForeignKeys ) return this.value; @@ -167,7 +167,7 @@ export class SchemaForeignKey extends SchemaItemthis.value; - var model = Model.getByName( this.targetCollection ); + const model = Model.getByName( this.targetCollection ); if ( !model ) throw new Error( `${this.name} references a foreign key '${this.targetCollection}' which doesn't seem to exist` ); @@ -180,16 +180,16 @@ export class SchemaForeignKey extends SchemaItem( { _id: this.value }); + const result = await model.findOne( { _id: this.value }); if ( !result ) throw new Error( `Could not find instance of ${this.name} references with foreign key '${this.targetCollection}'` ); // Get the models items are increase their level - this ensures we dont go too deep - var items = result.schema.getItems() !; - var nextLevel = this.curLevel + 1; + const items = result.schema.getItems() !; + const nextLevel = this.curLevel + 1; - for ( var i = 0, l = items.length; i < l; i++ ) + for ( let i = 0, l = items.length; i < l; i++ ) if ( items[ i ] instanceof SchemaForeignKey || items[ i ] instanceof SchemaIdArray ) ( items[ i ] ).curLevel = nextLevel; diff --git a/src/models/schema-items/schema-html.ts b/src/models/schema-items/schema-html.ts index 0fc3e1d6..a2a703ba 100644 --- a/src/models/schema-items/schema-html.ts +++ b/src/models/schema-items/schema-html.ts @@ -1,6 +1,6 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; -import sanitizeHtml = require( "sanitize-html" ); +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; +import sanitizeHtml = require( 'sanitize-html' ); /** * An html scheme item for use in Models @@ -73,9 +73,9 @@ export class SchemaHtml extends SchemaItem * @returns Returns true if successful or an error message string if unsuccessful */ public validate(): Promise { - var maxCharacters = this.maxCharacters; - var minCharacters = this.minCharacters; - var transformedValue = this.value.trim(); + const maxCharacters = this.maxCharacters; + const minCharacters = this.minCharacters; + const transformedValue = this.value.trim(); if ( transformedValue.length < minCharacters && minCharacters == 1 ) return Promise.reject( new Error( `'${this.name}' cannot be empty` ) ); @@ -84,7 +84,7 @@ export class SchemaHtml extends SchemaItem else if ( transformedValue.length < minCharacters ) return Promise.reject( new Error( `The character length of '${this.name}' is too short, please keep it above ${minCharacters}` ) ); - var sanitizedHTML = sanitizeHtml( this.value, { allowedAttributes: this.allowedAttributes, allowedTags: this.allowedTags }).trim(); + const sanitizedHTML = sanitizeHtml( this.value, { allowedAttributes: this.allowedAttributes, allowedTags: this.allowedTags }).trim(); if ( this.errorBadHTML && transformedValue != sanitizedHTML ) return Promise.reject( new Error( `'${this.name}' has html code that is not allowed` ) ); diff --git a/src/models/schema-items/schema-id-array.ts b/src/models/schema-items/schema-id-array.ts index 605b51ea..f8e05a3a 100644 --- a/src/models/schema-items/schema-id-array.ts +++ b/src/models/schema-items/schema-id-array.ts @@ -1,10 +1,10 @@ -import { SchemaItem } from "./schema-item"; -import { SchemaForeignKey } from "./schema-foreign-key"; -import { Model, ModelInstance } from "../model"; -import { ISchemaOptions } from "modepress-api"; -import sanitizeHtml = require( "sanitize-html" ); -import { ObjectID, UpdateWriteOpResult } from "mongodb"; -import { Utils } from "../../utils"; +import { SchemaItem } from './schema-item'; +import { SchemaForeignKey } from './schema-foreign-key'; +import { Model, ModelInstance } from '../model'; +import { ISchemaOptions } from 'modepress-api'; +import sanitizeHtml = require( 'sanitize-html' ); +import { ObjectID, UpdateWriteOpResult } from 'mongodb'; +import { Utils } from '../../utils'; /** * An ID array scheme item for use in Models. Optionally can be used as a foreign key array @@ -56,13 +56,13 @@ export class SchemaIdArray extends SchemaItem { - var transformedValue = this.value; + const transformedValue = this.value; - for ( var i = 0, l = transformedValue.length; i < l; i++ ) { - if ( typeof this.value[ i ] == "string" ) { + for ( let i = 0, l = transformedValue.length; i < l; i++ ) { + if ( typeof this.value[ i ] == 'string' ) { if ( Utils.isValidObjectID( this.value[ i ] ) ) transformedValue[ i ] = new ObjectID( this.value[ i ] ); - else if ( ( this.value[ i ] ).trim() != "" ) + else if ( ( this.value[ i ] ).trim() != '' ) throw new Error( `Please use a valid ID for '${this.name}'` ); else throw new Error( `Please use a valid ID for '${this.name}'` ); @@ -70,7 +70,7 @@ export class SchemaIdArray extends SchemaItem this.maxItems ) throw new Error( `You have selected too many items for ${this.name}, please only use up to ${this.maxItems}` ); @@ -82,19 +82,19 @@ export class SchemaIdArray extends SchemaItem{ _id: arr[ i ] }); - var result = await model.findInstances( query ); + const result = await model.findInstances( query ); this._targetDocs = result; return true; @@ -111,10 +111,10 @@ export class SchemaIdArray extends SchemaItem> = []; + const model = Model.getByName( this.targetCollection ); + const promises: Array> = []; - for ( var i = 0, l = this._targetDocs.length; i < l; i++ ) { + for ( let i = 0, l = this._targetDocs.length; i < l; i++ ) { let arrDeps = this._targetDocs[ i ].dbEntry._arrayDependencies || []; arrDeps.push( { _id: instance.dbEntry._id, collection: collection, propertyName: this.name }); promises.push( model.collection.updateOne( { _id: this._targetDocs[ i ].dbEntry._id }, { @@ -138,7 +138,7 @@ export class SchemaIdArray extends SchemaItem> = []; - var query = { $or: [] as Modepress.IModelEntry[] }; - var arr = this.value; + const promises: Array> = []; + const query = { $or: [] as Modepress.IModelEntry[] }; + const arr = this.value; - for ( var i = 0, l = arr.length; i < l; i++ ) + for ( let i = 0, l = arr.length; i < l; i++ ) query.$or.push( { _id: arr[ i ] }); - var results = await model.findInstances( query ); + const results = await model.findInstances( query ); if ( !results || results.length == 0 ) return; - var pullQueries: Array> = []; + const pullQueries: Array> = []; - for ( var i = 0, l = results.length; i < l; i++ ) + for ( let i = 0, l = results.length; i < l; i++ ) pullQueries.push( model.collection.updateOne( { _id: results[ i ].dbEntry._id }, { $pull: { _arrayDependencies: { _id: instance.dbEntry._id } } } @@ -175,7 +175,7 @@ export class SchemaIdArray extends SchemaItem> { if ( options.expandForeignKeys && options.expandMaxDepth === undefined ) - throw new Error( "You cannot set expandForeignKeys and not specify the expandMaxDepth" ); + throw new Error( 'You cannot set expandForeignKeys and not specify the expandMaxDepth' ); if ( !options.expandForeignKeys ) return this.value; @@ -186,7 +186,7 @@ export class SchemaIdArray extends SchemaItem{ _id: this.value[ i ] }); - var instances = await model.findInstances( query ); - var instance: ModelInstance; + const instances = await model.findInstances( query ); + let instance: ModelInstance; - var toReturn: Array = []; - var promises: Array> = []; + const toReturn: Array = []; + const promises: Array> = []; // Get the models items are increase their level - this ensures we dont go too deep - for ( var i = 0, l = instances.length; i < l; i++ ) { + for ( let i = 0, l = instances.length; i < l; i++ ) { instance = instances[ i ]; - var items = instance.schema.getItems(); - var nextLevel = this.curLevel + 1; + const items = instance.schema.getItems(); + const nextLevel = this.curLevel + 1; - for ( var ii = 0, il = items.length; ii < il; ii++ ) + for ( let ii = 0, il = items.length; ii < il; ii++ ) if ( items[ ii ] instanceof SchemaForeignKey || items[ ii ] instanceof SchemaIdArray ) ( items[ ii ] ).curLevel = nextLevel; diff --git a/src/models/schema-items/schema-id.ts b/src/models/schema-items/schema-id.ts index 632702c0..68dd780a 100644 --- a/src/models/schema-items/schema-id.ts +++ b/src/models/schema-items/schema-id.ts @@ -1,7 +1,7 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; -import { ObjectID } from "mongodb"; -import { Utils } from "../../utils" +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; +import { ObjectID } from 'mongodb'; +import { Utils } from '../../utils' /** * A mongodb ObjectID scheme item for use in Models @@ -31,12 +31,12 @@ export class SchemaId extends SchemaItem * Checks the value stored to see if its correct in its current form */ public validate(): Promise { - var transformedValue: string | ObjectID | null = this.value; + let transformedValue: string | ObjectID | null = this.value; - if ( typeof this.value == "string" ) { + if ( typeof this.value == 'string' ) { if ( Utils.isValidObjectID( this.value ) ) transformedValue = this.value = new ObjectID( this.value ); - else if ( ( this.value ).trim() != "" ) + else if ( ( this.value ).trim() != '' ) return Promise.reject( new Error( `Please use a valid ID for '${this.name}'` ) ); else transformedValue = null; diff --git a/src/models/schema-items/schema-item-factory.ts b/src/models/schema-items/schema-item-factory.ts index 2d53b0d4..4d4c2ca2 100644 --- a/src/models/schema-items/schema-item-factory.ts +++ b/src/models/schema-items/schema-item-factory.ts @@ -1,24 +1,24 @@ -import * as numbers from "./schema-number"; -import { SchemaText } from "./schema-text"; -import { SchemaBool } from "./schema-bool"; -import { SchemaDate } from "./schema-date"; -import { SchemaTextArray } from "./schema-text-array"; -import { SchemaJSON } from "./schema-json"; -import { SchemaIdArray } from "./schema-id-array"; -import { SchemaNumArray } from "./schema-num-array"; -import { SchemaId } from "./schema-id"; -import { SchemaHtml } from "./schema-html"; -import { SchemaForeignKey } from "./schema-foreign-key"; +import * as numbers from './schema-number'; +import { SchemaText } from './schema-text'; +import { SchemaBool } from './schema-bool'; +import { SchemaDate } from './schema-date'; +import { SchemaTextArray } from './schema-text-array'; +import { SchemaJSON } from './schema-json'; +import { SchemaIdArray } from './schema-id-array'; +import { SchemaNumArray } from './schema-num-array'; +import { SchemaId } from './schema-id'; +import { SchemaHtml } from './schema-html'; +import { SchemaForeignKey } from './schema-foreign-key'; -export var NumberType = numbers.NumberType; -export var num = numbers.SchemaNumber; -export var text = SchemaText; -export var textArray = SchemaTextArray; -export var json = SchemaJSON; -export var idArray = SchemaIdArray; -export var numArray = SchemaNumArray; -export var date = SchemaDate; -export var bool = SchemaBool; -export var id = SchemaId; -export var html = SchemaHtml; -export var foreignKey = SchemaForeignKey; \ No newline at end of file +export const NumberType = numbers.NumberType; +export const num = numbers.SchemaNumber; +export const text = SchemaText; +export const textArray = SchemaTextArray; +export const json = SchemaJSON; +export const idArray = SchemaIdArray; +export const numArray = SchemaNumArray; +export const date = SchemaDate; +export const bool = SchemaBool; +export const id = SchemaId; +export const html = SchemaHtml; +export const foreignKey = SchemaForeignKey; \ No newline at end of file diff --git a/src/models/schema-items/schema-item.ts b/src/models/schema-items/schema-item.ts index 5235e92a..f14f3ead 100644 --- a/src/models/schema-items/schema-item.ts +++ b/src/models/schema-items/schema-item.ts @@ -1,5 +1,5 @@ -import { ISchemaOptions } from "modepress-api"; -import { ModelInstance } from "../model"; +import { ISchemaOptions } from 'modepress-api'; +import { ModelInstance } from '../model'; /** * A definition of each item in the model diff --git a/src/models/schema-items/schema-json.ts b/src/models/schema-items/schema-json.ts index 910e50f1..0a04306b 100644 --- a/src/models/schema-items/schema-json.ts +++ b/src/models/schema-items/schema-json.ts @@ -1,6 +1,6 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; -import sanitizeHtml = require( "sanitize-html" ); +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; +import sanitizeHtml = require( 'sanitize-html' ); /** * A json scheme item for use in Models diff --git a/src/models/schema-items/schema-num-array.ts b/src/models/schema-items/schema-num-array.ts index 9e031839..64cb5e87 100644 --- a/src/models/schema-items/schema-num-array.ts +++ b/src/models/schema-items/schema-num-array.ts @@ -1,6 +1,6 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; -import { NumberType } from "./schema-number"; +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; +import { NumberType } from './schema-number'; /** * A number array scheme item for use in Models @@ -61,14 +61,14 @@ export class SchemaNumArray extends SchemaItem> * Checks the value stored to see if its correct in its current form */ public validate(): Promise { - var transformedValue = this.value; - var max = this.max; - var min = this.min; - var type = this.type; - var temp: number; - var decimalPlaces = this.decimalPlaces; + const transformedValue = this.value; + const max = this.max; + const min = this.min; + const type = this.type; + let temp: number; + const decimalPlaces = this.decimalPlaces; - for ( var i = 0, l = transformedValue.length; i < l; i++ ) { + for ( let i = 0, l = transformedValue.length; i < l; i++ ) { if ( type == NumberType.Integer ) temp = parseInt( transformedValue.toString() ); else @@ -81,7 +81,7 @@ export class SchemaNumArray extends SchemaItem> } if ( transformedValue.length < this.minItems ) - return Promise.reject( new Error( `You must select at least ${this.minItems} item${( this.minItems == 1 ? "" : "s" )} for ${this.name}` ) ); + return Promise.reject( new Error( `You must select at least ${this.minItems} item${( this.minItems == 1 ? '' : 's' )} for ${this.name}` ) ); if ( transformedValue.length > this.maxItems ) return Promise.reject( new Error( `You have selected too many items for ${this.name}, please only use up to ${this.maxItems}` ) ); diff --git a/src/models/schema-items/schema-number.ts b/src/models/schema-items/schema-number.ts index 20a7b781..120e3700 100644 --- a/src/models/schema-items/schema-number.ts +++ b/src/models/schema-items/schema-number.ts @@ -1,5 +1,5 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; /** * Describes the type of number to store @@ -59,9 +59,9 @@ export class SchemaNumber extends SchemaItem * Checks the value stored to see if its correct in its current form */ public validate(): Promise { - var type = this.type; - var decimalPlaces = this.decimalPlaces; - var transformedValue: number = this.value; + const type = this.type; + const decimalPlaces = this.decimalPlaces; + let transformedValue: number = this.value; if ( type == NumberType.Integer ) transformedValue = parseInt( transformedValue.toString() ); diff --git a/src/models/schema-items/schema-text-array.ts b/src/models/schema-items/schema-text-array.ts index 9688c1e9..28e38d5a 100644 --- a/src/models/schema-items/schema-text-array.ts +++ b/src/models/schema-items/schema-text-array.ts @@ -1,6 +1,6 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; -import sanitizeHtml = require( "sanitize-html" ); +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; +import sanitizeHtml = require( 'sanitize-html' ); /** * A text scheme item for use in Models @@ -49,29 +49,29 @@ export class SchemaTextArray extends SchemaItem> * Checks the value stored to see if its correct in its current form */ public validate(): Promise { - var transformedValue = this.value; - var toRemove: number[] = []; - for ( var i = 0, l = transformedValue.length; i < l; i++ ) { + const transformedValue = this.value; + const toRemove: number[] = []; + for ( let i = 0, l = transformedValue.length; i < l; i++ ) { transformedValue[ i ] = sanitizeHtml( transformedValue[ i ].trim(), { allowedTags: [] }); - if ( transformedValue[ i ].trim() == "" ) + if ( transformedValue[ i ].trim() == '' ) toRemove.push( i ); } - // Remove any "" cells - for ( var i = toRemove.length - 1; i >= 0; i-- ) + // Remove any '' cells + for ( let i = toRemove.length - 1; i >= 0; i-- ) transformedValue.splice( toRemove[ i ], 1 ); - var maxCharacters = this.maxCharacters; - var minCharacters = this.minCharacters; + const maxCharacters = this.maxCharacters; + const minCharacters = this.minCharacters; if ( transformedValue.length < this.minItems ) - return Promise.reject( new Error( `You must select at least ${this.minItems} item${( this.minItems == 1 ? "" : "s" )} for ${this.name}` ) ); + return Promise.reject( new Error( `You must select at least ${this.minItems} item${( this.minItems == 1 ? '' : 's' )} for ${this.name}` ) ); if ( transformedValue.length > this.maxItems ) return Promise.reject( new Error( `You have selected too many items for ${this.name}, please only use up to ${this.maxItems}` ) ); - for ( var i = 0, l = transformedValue.length; i < l; i++ ) { + for ( let i = 0, l = transformedValue.length; i < l; i++ ) { transformedValue[ i ] = transformedValue[ i ].trim(); if ( transformedValue[ i ].length > maxCharacters ) return Promise.reject( new Error( `The character length of '${transformedValue[ i ]}' in ${this.name} is too long, please keep it below ${maxCharacters}` ) ); diff --git a/src/models/schema-items/schema-text.ts b/src/models/schema-items/schema-text.ts index ad3b11bd..b14610a4 100644 --- a/src/models/schema-items/schema-text.ts +++ b/src/models/schema-items/schema-text.ts @@ -1,6 +1,6 @@ -import { SchemaItem } from "./schema-item"; -import { ISchemaOptions } from "modepress-api"; -import sanitizeHtml = require( "sanitize-html" ); +import { SchemaItem } from './schema-item'; +import { ISchemaOptions } from 'modepress-api'; +import sanitizeHtml = require( 'sanitize-html' ); /** * A text scheme item for use in Models @@ -45,10 +45,10 @@ export class SchemaText extends SchemaItem * Checks the value stored to see if its correct in its current form */ public validate(): Promise { - var maxCharacters = this.maxCharacters; - var minCharacters = this.minCharacters; - this.value = this.value || ""; - var transformedValue = ""; + const maxCharacters = this.maxCharacters; + const minCharacters = this.minCharacters; + this.value = this.value || ''; + let transformedValue = ''; if ( this.htmlClean ) transformedValue = sanitizeHtml( this.value.trim(), { allowedTags: [] }); diff --git a/src/models/schema.ts b/src/models/schema.ts index cc7cb9b9..5709e32f 100644 --- a/src/models/schema.ts +++ b/src/models/schema.ts @@ -1,8 +1,8 @@ -import { SchemaItem } from "./schema-items/schema-item"; -import { SchemaForeignKey } from "./schema-items/schema-foreign-key"; -import * as mongodb from "mongodb" -import { ModelInstance, Model } from "./model" -import { IModelEntry, ISchemaOptions } from "modepress-api"; +import { SchemaItem } from './schema-items/schema-item'; +import { SchemaForeignKey } from './schema-items/schema-foreign-key'; +import * as mongodb from 'mongodb' +import { ModelInstance, Model } from './model' +import { IModelEntry, ISchemaOptions } from 'modepress-api'; /** * Gives an overall description of each property in a model @@ -18,10 +18,10 @@ export class Schema { * Creates a copy of the schema */ public clone(): Schema { - var items = this._items; - var copy = new Schema(); + const items = this._items; + const copy = new Schema(); - for ( var i = 0, l = items.length; i < l; i++ ) + for ( let i = 0, l = items.length; i < l; i++ ) copy._items.push( items[ i ].clone() ); return copy; @@ -32,11 +32,11 @@ export class Schema { * @param data The data object we are setting */ set( data: any ) { - var items = this._items, + const items = this._items, l = items.length; - for ( var i in data ) { - for ( var ii = 0; ii < l; ii++ ) + for ( const i in data ) { + for ( let ii = 0; ii < l; ii++ ) if ( items[ ii ].name == i ) items[ ii ].setValue( data[ i ] ); } @@ -48,9 +48,9 @@ export class Schema { * @param val The new value of the item */ setVal( name: string, val: any ) { - var items = this._items; + const items = this._items; - for ( var i = 0, l = items.length; i < l; i++ ) + for ( let i = 0, l = items.length; i < l; i++ ) if ( items[ i ].name == name ) items[ i ].setValue( val ); } @@ -60,7 +60,7 @@ export class Schema { * I.e. the data is the document from the DB and the schema item sets its values from the document */ public deserialize( data: any ): any { - for ( var i in data ) + for ( let i in data ) this.setVal( i, data[ i ] ); } @@ -68,10 +68,10 @@ export class Schema { * Serializes the schema items into the JSON format for mongodb */ public serialize(): any { - var toReturn = {}; - var items = this._items; + const toReturn = {}; + const items = this._items; - for ( var i = 0, l = items.length; i < l; i++ ) + for ( let i = 0, l = items.length; i < l; i++ ) toReturn[ items[ i ].name ] = items[ i ].getDbValue(); return toReturn; @@ -83,14 +83,14 @@ export class Schema { * @param options [Optional] A set of options that can be passed to control how the data must be returned */ public async getAsJson( id: mongodb.ObjectID, options: ISchemaOptions ): Promise { - var toReturn: T = { _id: id }; - var items = this._items; - var fKey: SchemaForeignKey; - var model: Model; - var promises: Array> = []; - var itemsInUse: SchemaItem[] = []; - - for ( var i = 0, l = items.length; i < l; i++ ) { + const toReturn: T = { _id: id }; + const items = this._items; + let fKey: SchemaForeignKey; + let model: Model; + const promises: Array> = []; + const itemsInUse: SchemaItem[] = []; + + for ( let i = 0, l = items.length; i < l; i++ ) { // If this data is sensitive and the request must be sanitized // then skip the item if ( items[ i ].getSensitive() && options.verbose == false ) @@ -101,10 +101,10 @@ export class Schema { } // Wait for all the promises to resolve - var returns = await Promise.all( promises ); + const returns = await Promise.all( promises ); // Assign the promise values - for ( var i = 0, l = returns.length; i < l; i++ ) + for ( let i = 0, l = returns.length; i < l; i++ ) toReturn[ itemsInUse[ i ].name ] = returns[ i ]; return Promise.resolve( toReturn ); @@ -116,17 +116,17 @@ export class Schema { * @returns Returns true if successful */ public async validate( checkForRequiredFields: boolean ): Promise { - var items = this._items; - var promises: Array> = []; + const items = this._items; + const promises: Array> = []; - for ( var i = 0, l = items.length; i < l; i++ ) { + for ( let i = 0, l = items.length; i < l; i++ ) { if ( checkForRequiredFields && !items[ i ].getModified() && items[ i ].getRequired() ) throw new Error( `${items[ i ].name} is required` ); promises.push( items[ i ].validate() ); } - var validations = await Promise.all( promises ); + const validations = await Promise.all( promises ); return this; } @@ -137,13 +137,13 @@ export class Schema { * @param collection The DB collection that the model was inserted into */ public async postUpsert( instance: ModelInstance, collection: string ): Promise { - var items = this._items; - var promises: Array> = []; + const items = this._items; + const promises: Array> = []; - for ( var i = 0, l = items.length; i < l; i++ ) + for ( let i = 0, l = items.length; i < l; i++ ) promises.push( items[ i ].postUpsert( instance, collection ) ); - var validations = await Promise.all( promises ); + const validations = await Promise.all( promises ); return this; } @@ -153,13 +153,13 @@ export class Schema { * @param collection The DB collection that the model was deleted from */ public async postDelete( instance: ModelInstance, collection: string ): Promise { - var items = this._items; - var promises: Array> = []; + const items = this._items; + const promises: Array> = []; - for ( var i = 0, l = items.length; i < l; i++ ) + for ( let i = 0, l = items.length; i < l; i++ ) promises.push( items[ i ].postUpsert( instance, collection ) ); - var validations = await Promise.all( promises ); + const validations = await Promise.all( promises ); return this; } @@ -168,8 +168,8 @@ export class Schema { * @param val The name of the item */ public getByName( val: string ): SchemaItem | null { - var items = this._items; - for ( var i = 0, l = items.length; i < l; i++ ) + const items = this._items; + for ( let i = 0, l = items.length; i < l; i++ ) if ( items[ i ].name == val ) return items[ i ]; @@ -181,11 +181,11 @@ export class Schema { * @param val The new item to add */ public add( val: SchemaItem ): SchemaItem { - if ( val.name == "_id" ) + if ( val.name == '_id' ) throw new Error( `You cannot use the schema item name _id as its a reserved keyword` ); - else if ( val.name == "_requiredDependencies" ) + else if ( val.name == '_requiredDependencies' ) throw new Error( `You cannot use the schema item name _requiredDependencies as its a reserved keyword` ); - else if ( val.name == "_optionalDependencies" ) + else if ( val.name == '_optionalDependencies' ) throw new Error( `You cannot use the schema item name _optionalDependencies as its a reserved keyword` ); else if ( this.getByName( val.name ) ) throw new Error( `An item with the name ${val.name} already exists.` ); @@ -199,12 +199,12 @@ export class Schema { * @param val The name of the item or the item itself */ public remove( val: SchemaItem | string ) { - var items = this._items; - var name = ""; + const items = this._items; + let name = ''; if ( >val instanceof SchemaItem ) name = ( >val ).name; - for ( var i = 0, l = items.length; i < l; i++ ) + for ( let i = 0, l = items.length; i < l; i++ ) if ( items[ i ].name == name ) { items.splice( i, 1 ); return; diff --git a/src/mongo-wrapper.ts b/src/mongo-wrapper.ts index a5b4f715..9239f2ea 100644 --- a/src/mongo-wrapper.ts +++ b/src/mongo-wrapper.ts @@ -1,4 +1,4 @@ -import * as mongodb from "mongodb"; +import * as mongodb from 'mongodb'; export class MongoWrapper { /** @@ -10,14 +10,14 @@ export class MongoWrapper { static connect( host: string, port: number, database: string, opts?: mongodb.ServerOptions ): Promise { return new Promise( function( resolve, reject ) { if ( !host ) - return reject( new Error( "Please provide a 'host' field in your configuration" ) ); + return reject( new Error( 'Please provide a \'host\' field in your configuration' ) ); if ( !port ) - return reject( new Error( "Please provide a 'port' field in your configuration" ) ); + return reject( new Error( 'Please provide a \'port\' field in your configuration' ) ); if ( !database ) - return reject( new Error( "Please provide a 'databaseName' field in your configuration" ) ); + return reject( new Error( 'Please provide a \'databaseName\' field in your configuration' ) ); - var mongoServer: mongodb.Server = new mongodb.Server( host, port, opts ); - var mongoDB: mongodb.Db = new mongodb.Db( database, mongoServer, { w: 1 }); + const mongoServer: mongodb.Server = new mongodb.Server( host, port, opts ); + const mongoDB: mongodb.Db = new mongodb.Db( database, mongoServer, { w: 1 }); mongoDB.open( function( err: Error, db: mongodb.Db ) { if ( err || !db ) reject( err ); @@ -35,8 +35,8 @@ export class MongoWrapper { */ static find( host: string, port: number, opts?: mongodb.ServerOptions ): Promise { return new Promise( function( resolve, reject ) { - var mongoServer: mongodb.Server = new mongodb.Server( host, port, opts ); - var mongoDB: mongodb.Db = new mongodb.Db( "animate", mongoServer, { w: 1 }); + const mongoServer: mongodb.Server = new mongodb.Server( host, port, opts ); + const mongoDB: mongodb.Db = new mongodb.Db( 'animate', mongoServer, { w: 1 }); mongoDB.open( function( err: Error, db: mongodb.Db ) { if ( err || !db ) reject( err ); diff --git a/src/path-handler.ts b/src/path-handler.ts index c8dfb9d8..dddff990 100644 --- a/src/path-handler.ts +++ b/src/path-handler.ts @@ -1,7 +1,7 @@ -import { IServer, IPath } from "modepress-api"; -import * as express from "express"; -import * as fs from "fs"; -import { UsersService } from "./users-service"; +import { IServer, IPath } from 'modepress-api'; +import * as express from 'express'; +import * as fs from 'fs'; +import { UsersService } from './users-service'; /** * A simple wrapper that holds information on each path the server can respond to. @@ -32,30 +32,30 @@ export class PathHandler { * Function used to handle a request from express */ handle( req: express.Request, res: express.Response ) { - var config = this._config; - var path = this._path; + const config = this._config; + const path = this._path; - var requestIsSecure = ( ( req.connection ).encrypted || req.headers[ "x-forwarded-proto" ] == "https" ? true : false ); - var url = `${( requestIsSecure ? "https" : "http" )}://${config.host}`; - var options: any = { usersURL: `${UsersService.usersURL}`, url: url }; + const requestIsSecure = ( ( req.connection ).encrypted || req.headers[ 'x-forwarded-proto' ] == 'https' ? true : false ); + const url = `${( requestIsSecure ? 'https' : 'http' )}://${config.host}`; + const options: any = { usersURL: `${UsersService.usersURL}`, url: url }; options.plugins = path.plugins || []; options.variables = {}; // Add any custom variables if ( path.variables ) { - for ( var i in path.variables ) + for ( const i in path.variables ) options.variables[ i ] = path.variables[ i ]; } // Give priority to template routes if ( fs.existsSync( path.index ) ) { - if ( path.index.indexOf( ".jade" ) != -1 ) + if ( path.index.indexOf( '.jade' ) != -1 ) res.render( path.index, options ); else res.sendfile( path.index ); } else - res.send( 404, "File not found" ); + res.send( 404, 'File not found' ); }; } \ No newline at end of file diff --git a/src/permission-controllers.ts b/src/permission-controllers.ts index 5b640b38..db9ed5b8 100644 --- a/src/permission-controllers.ts +++ b/src/permission-controllers.ts @@ -1,7 +1,7 @@ -import express = require( "express" ); -import { UsersService } from "./users-service"; -import { IResponse, IAuthReq } from "modepress-api"; -import * as mongodb from "mongodb"; +import express = require( 'express' ); +import { UsersService } from './users-service'; +import { IResponse, IAuthReq } from 'modepress-api'; +import * as mongodb from 'mongodb'; /** * This funciton checks if user is logged in @@ -9,7 +9,7 @@ import * as mongodb from "mongodb"; export function getUser( req: express.Request, res: express.Response, next: Function ) { res; // Supress empty param warning - var users = UsersService.getSingleton(); + const users = UsersService.getSingleton(); users.authenticated( req ).then( function( auth ) { if ( !auth.authenticated ) { ( req )._user = null; @@ -22,7 +22,7 @@ export function getUser( req: express.Request, res: express.Response, next: Func // Check if this must be cleaned or not - var verbose = ( req.query.verbose ? true : false ); + let verbose = ( req.query.verbose ? true : false ); if ( verbose ) if ( !( req )._isAdmin ) if ( req.params.user !== undefined && req.params.user != auth.user!.username ) @@ -52,7 +52,7 @@ export function hasId( idName: string, idLabel: string = '', optional: boolean = res.setHeader( 'Content-Type', 'application/json' ); return res.end( JSON.stringify( { error: true, - message: "Please specify an " + ( !idLabel || idLabel === '' ? idLabel : idName ) + message: 'Please specify an ' + ( !idLabel || idLabel === '' ? idLabel : idName ) }) ); } // Make sure the id format is correct @@ -60,7 +60,7 @@ export function hasId( idName: string, idLabel: string = '', optional: boolean = res.setHeader( 'Content-Type', 'application/json' ); return res.end( JSON.stringify( { error: true, - message: "Invalid ID format" + message: 'Invalid ID format' }) ); } @@ -75,12 +75,12 @@ export function hasId( idName: string, idLabel: string = '', optional: boolean = */ export async function userExists( req: express.Request, res: express.Response, next: Function ) { try { - var users = UsersService.getSingleton(); - var user = await users.getUser( req.params.user, req ) + const users = UsersService.getSingleton(); + const user = await users.getUser( req.params.user, req ) // Make sure the id format is correct if ( !user ) - throw new Error( "User does not exist" ); + throw new Error( 'User does not exist' ); next() } catch ( err ) { @@ -97,13 +97,13 @@ export async function userExists( req: express.Request, res: express.Response, n * if true it passes the scope onto the next function in the queue */ export function isAdmin( req: express.Request, res: express.Response, next: Function ) { - var users = UsersService.getSingleton(); + const users = UsersService.getSingleton(); users.authenticated( req ).then( function( auth ) { if ( !auth.authenticated ) - throw new Error( "You must be logged in to make this request" ); + throw new Error( 'You must be logged in to make this request' ); else if ( !users.isAdmin( auth.user! ) ) - throw new Error( "You do not have permission" ); + throw new Error( 'You do not have permission' ); else { ( req )._user = auth.user!; ( req )._isAdmin = ( auth.user!.privileges == 1 || auth.user!.privileges == 2 ? true : false ); @@ -124,12 +124,12 @@ export function isAdmin( req: express.Request, res: express.Response, next: Func * This funciton checks if the logged in user can make changes to a target 'user' defined in the express.params */ export async function canEdit( req: express.Request, res: express.Response, next: Function ) { - var users = UsersService.getSingleton(); - var targetUser: string = req.params.user; + const users = UsersService.getSingleton(); + const targetUser: string = req.params.user; try { - var auth = await users.authenticated( req ); - var target: UsersInterface.IGetUser | null = null; + const auth = await users.authenticated( req ); + let target: UsersInterface.IGetUser | null = null; // Check if the target user exists if ( targetUser !== undefined ) { @@ -141,9 +141,9 @@ export async function canEdit( req: express.Request, res: express.Response, next } if ( !auth.authenticated ) - throw new Error( "You must be logged in to make this request" ); + throw new Error( 'You must be logged in to make this request' ); else if ( !users.hasPermission( auth.user!, 2, targetUser ) ) - throw new Error( "You do not have permission" ); + throw new Error( 'You do not have permission' ); else { ( req )._user = auth.user!; ( req )._isAdmin = ( auth.user!.privileges == 1 || auth.user!.privileges == 2 ? true : false ); @@ -165,7 +165,7 @@ export async function canEdit( req: express.Request, res: express.Response, next * This funciton checks if user is logged in and throws an error if not */ export function isAuthenticated( req: express.Request, res: express.Response, next: Function ) { - var users = UsersService.getSingleton(); + const users = UsersService.getSingleton(); users.authenticated( req ).then( function( auth ) { if ( !auth.authenticated ) throw new Error( auth.message ); @@ -174,7 +174,7 @@ export function isAuthenticated( req: express.Request, res: express.Response, ne ( req )._isAdmin = ( auth.user!.privileges == 1 || auth.user!.privileges == 2 ? true : false ); // Check if this must be cleaned or not - var verbose = ( req.query.verbose ? true : false ); + let verbose = ( req.query.verbose ? true : false ); if ( verbose ) if ( !( req )._isAdmin ) if ( req.params.user !== undefined && req.params.user != auth.user!.username ) diff --git a/src/serializers.ts b/src/serializers.ts index 99a5ff65..2decaa61 100644 --- a/src/serializers.ts +++ b/src/serializers.ts @@ -1,9 +1,9 @@ -"use strict"; +'use strict'; -import express = require( "express" ); -import * as http from "http"; -import * as mp from "modepress-api"; -import * as winston from "winston"; +import express = require( 'express' ); +import * as http from 'http'; +import * as mp from 'modepress-api'; +import * as winston from 'winston'; /** * Helper function to return a status 200 json object of type T diff --git a/src/server.ts b/src/server.ts index 381b4f66..5a401c58 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,21 +1,21 @@ -import * as express from "express"; -var app = express(); // create our app with express -import * as morgan from "morgan"; // log requests to the console -import * as mongodb from "mongodb"; -import * as http from "http"; -import * as https from "https"; -import * as fs from "fs"; -import * as winston from "winston"; -import * as yargs from "yargs"; -import * as readline from "readline"; -import * as compression from "compression"; -import { MongoWrapper } from "./mongo-wrapper"; -import { IConfig, IServer } from "modepress-api"; -import { Controller } from "./controllers/controller" -import PageRenderer from "./controllers/page-renderer" -import CORSController from "./controllers/cors-controller"; -import { PathHandler } from "./path-handler"; -import * as UsersService from "./users-service"; +import * as express from 'express'; +const app = express(); // create our app with express +import * as morgan from 'morgan'; // log requests to the console +import * as mongodb from 'mongodb'; +import * as http from 'http'; +import * as https from 'https'; +import * as fs from 'fs'; +import * as winston from 'winston'; +import * as yargs from 'yargs'; +import * as readline from 'readline'; +import * as compression from 'compression'; +import { MongoWrapper } from './mongo-wrapper'; +import { IConfig, IServer } from 'modepress-api'; +import { Controller } from './controllers/controller' +import PageRenderer from './controllers/page-renderer' +import CORSController from './controllers/cors-controller'; +import { PathHandler } from './path-handler'; +import * as UsersService from './users-service'; export class Server { private _config: IConfig; @@ -29,9 +29,9 @@ export class Server { } async initialize( db: mongodb.Db ): Promise { - var config = this._config; - var server = this._server; - var app = express(); + const config = this._config; + const server = this._server; + const app = express(); // Add the CORS controller new CORSController( app, server ); @@ -40,7 +40,7 @@ export class Server { app.use( compression() ); // User defined static folders - for ( var i = 0, l: number = server.staticFilesFolder.length; i < l; i++ ) { + for ( let i = 0, l: number = server.staticFilesFolder.length; i < l; i++ ) { winston.info( `Adding static resource folder '${server.staticFilesFolder[ i ]}'`, { process: process.pid }); app.use( express.static( server.staticFilesFolder[ i ], { maxAge: server.cacheLifetime }) ); } @@ -52,17 +52,17 @@ export class Server { app.use( morgan( 'dev' ) ); // Create each of your controllers here - var controllerPromises: Array> = []; - var controllers: Array = []; - var lastAddedController: string | null = null; + const controllerPromises: Array> = []; + const controllers: Array = []; + let lastAddedController: string | null = null; controllers.push( new PageRenderer( server, config, app ) ); // Load the controllers try { - for ( var i = 0, l: number = server.controllers.length; i < l; i++ ) { + for ( let i = 0, l: number = server.controllers.length; i < l; i++ ) { lastAddedController = server.controllers[ i ].path; - var func = require( server.controllers[ i ].path ); + const func = require( server.controllers[ i ].path ); controllers.push( new func.default( server, config, app ) ); } } @@ -73,53 +73,53 @@ export class Server { } // Maps the path specified to an HTML or template - for ( var i = 0, l: number = server.paths.length; i < l; i++ ) - var handler = new PathHandler( server.paths[ i ], server ).route( app ); + for ( let i = 0, l: number = server.paths.length; i < l; i++ ) + new PathHandler( server.paths[ i ], server ).route( app ); winston.info( `Attempting to start HTTP server...`, { process: process.pid }); // Start app with node server.js - var httpServer = http.createServer( app ); - httpServer.listen( { port: server.portHTTP, host: "localhost" }); + const httpServer = http.createServer( app ); + httpServer.listen( { port: server.portHTTP, host: 'localhost' }); winston.info( `Listening on HTTP port ${server.portHTTP}`, { process: process.pid }); // If we use SSL then start listening for that as well if ( server.ssl ) { - if ( server.sslIntermediate != "" && !fs.existsSync( server.sslIntermediate ) ) { + if ( server.sslIntermediate != '' && !fs.existsSync( server.sslIntermediate ) ) { winston.error( `Could not find sslIntermediate: '${server.sslIntermediate}'`, { process: process.pid }); process.exit(); } - if ( server.sslCert != "" && !fs.existsSync( server.sslCert ) ) { + if ( server.sslCert != '' && !fs.existsSync( server.sslCert ) ) { winston.error( `Could not find sslIntermediate: '${server.sslCert}'`, { process: process.pid }); process.exit(); } - if ( server.sslRoot != "" && !fs.existsSync( server.sslRoot ) ) { + if ( server.sslRoot != '' && !fs.existsSync( server.sslRoot ) ) { winston.error( `Could not find sslIntermediate: '${server.sslRoot}'`, { process: process.pid }); process.exit(); } - if ( server.sslKey != "" && !fs.existsSync( server.sslKey ) ) { + if ( server.sslKey != '' && !fs.existsSync( server.sslKey ) ) { winston.error( `Could not find sslIntermediate: '${server.sslKey}'`, { process: process.pid }); process.exit(); } - var caChain = [ fs.readFileSync( server.sslIntermediate ), fs.readFileSync( server.sslRoot ) ]; - var privkey = server.sslKey ? fs.readFileSync( server.sslKey ) : null; - var theCert = server.sslCert ? fs.readFileSync( server.sslCert ) : null; - var port = server.portHTTPS ? server.portHTTPS : 443; + const caChain = [ fs.readFileSync( server.sslIntermediate ), fs.readFileSync( server.sslRoot ) ]; + const privkey = server.sslKey ? fs.readFileSync( server.sslKey ) : null; + const theCert = server.sslCert ? fs.readFileSync( server.sslCert ) : null; + const port = server.portHTTPS ? server.portHTTPS : 443; winston.info( `Attempting to start SSL server...`, { process: process.pid }); - var httpsServer = https.createServer( { key: privkey, cert: theCert, passphrase: server.sslPassPhrase, ca: caChain }, app ); - httpsServer.listen( { port: port, host: "localhost" }); + const httpsServer = https.createServer( { key: privkey, cert: theCert, passphrase: server.sslPassPhrase, ca: caChain }, app ); + httpsServer.listen( { port: port, host: 'localhost' }); winston.info( `Listening on HTTPS port ${port}`, { process: process.pid }); } // Initialize all the controllers - for ( var i = 0, l: number = controllers.length; i < l; i++ ) + for ( let i = 0, l: number = controllers.length; i < l; i++ ) controllerPromises.push( controllers[ i ].initialize( db ) ); // Return a promise once all the controllers are complete @@ -129,7 +129,7 @@ export class Server { return this; } catch ( e ) { - throw new Error( `ERROR An error has occurred while setting up the controllers for ${this._server.host}: "${e.message}"` ); + throw new Error( `ERROR An error has occurred while setting up the controllers for ${this._server.host}: '${e.message}'` ); }; } } \ No newline at end of file diff --git a/src/startup.ts b/src/startup.ts index 4fdcf1b7..9c56e243 100644 --- a/src/startup.ts +++ b/src/startup.ts @@ -1,24 +1,24 @@ -import * as express from "express"; -var app = express(); // create our app with express -import * as morgan from "morgan"; // log requests to the console -import * as mongodb from "mongodb"; -import * as http from "http"; -import * as https from "https"; -import * as fs from "fs"; -import * as winston from "winston"; -import * as yargs from "yargs"; -import * as readline from "readline"; -import * as compression from "compression"; -import { MongoWrapper } from "./mongo-wrapper"; -import { IConfig } from "modepress-api"; -import { Controller } from "./controllers/controller" -import { UsersService } from "./users-service"; -import { PathHandler } from "./path-handler"; -import { Server } from "./server"; -import { EventManager } from "./event-manager"; - -var config: IConfig | null = null; -var args = yargs.argv; +import * as express from 'express'; +const app = express(); // create our app with express +import * as morgan from 'morgan'; // log requests to the console +import * as mongodb from 'mongodb'; +import * as http from 'http'; +import * as https from 'https'; +import * as fs from 'fs'; +import * as winston from 'winston'; +import * as yargs from 'yargs'; +import * as readline from 'readline'; +import * as compression from 'compression'; +import { MongoWrapper } from './mongo-wrapper'; +import { IConfig } from 'modepress-api'; +import { Controller } from './controllers/controller' +import { UsersService } from './users-service'; +import { PathHandler } from './path-handler'; +import { Server } from './server'; +import { EventManager } from './event-manager'; + +let config: IConfig | null = null; +const args = yargs.argv; // Add the console colours winston.addColors( { debug: 'green', info: 'cyan', silly: 'magenta', warn: 'yellow', error: 'red' }); @@ -26,18 +26,18 @@ winston.remove( winston.transports.Console ); winston.add( winston.transports.Console, { level: 'debug', colorize: true }); // Saves logs to file -if ( args.logFile && args.logFile.trim() != "" ) +if ( args.logFile && args.logFile.trim() != '' ) winston.add( winston.transports.File, { filename: args.logFile, maxsize: 50000000, maxFiles: 1, tailable: true }); // If no logging - remove all transports -if ( args.logging && args.logging.toLowerCase().trim() == "false" ) { +if ( args.logging && args.logging.toLowerCase().trim() == 'false' ) { winston.clear(); } // Make sure the config path argument is there -if ( !args.config || args.config.trim() == "" ) { - winston.error( "No config file specified. Please start modepress with the config path in the argument list. Eg: node main.js --config='./config.js'", { process: process.pid }); +if ( !args.config || args.config.trim() == '' ) { + winston.error( 'No config file specified. Please start modepress with the config path in the argument list. Eg: node main.js --config="./config.js"', { process: process.pid }); process.exit(); } @@ -49,7 +49,7 @@ if ( !fs.existsSync( args.config ) ) { try { // Try load and parse the config - config = JSON.parse( fs.readFileSync( args.config, "utf8" ) ); + config = JSON.parse( fs.readFileSync( args.config, 'utf8' ) ); } catch ( err ) { winston.error( `Could not parse the config file - make sure its valid JSON`, { process: process.pid }); @@ -58,7 +58,7 @@ catch ( err ) { // Attempt to connect to Users -if ( config!.usersSocketURL != "" ) { +if ( config!.usersSocketURL != '' ) { winston.info( `Attempting to connect to users socket at: '${config!.usersSocketURL}'`, { process: process.pid }); new EventManager( config! ).init().catch( function() { winston.error( `Could not connect to user socket even though it was specified at: '${config!.usersSocketURL}'`, { process: process.pid }); @@ -73,13 +73,13 @@ MongoWrapper.connect( config!.databaseHost, config!.databasePort, config!.databa winston.info( `Starting up HTTP servers...`, { process: process.pid }); // Create each of your controllers here - var promises: Array> = []; + const promises: Array> = []; UsersService.getSingleton( config! ); // Load the controllers - for ( var i = 0, l = config!.servers.length; i < l; i++ ) { - var server = new Server( config!.servers[ i ], config!, db ); + for ( let i = 0, l = config!.servers.length; i < l; i++ ) { + const server = new Server( config!.servers[ i ], config!, db ); promises.push( server.initialize( db ) ); } @@ -88,7 +88,7 @@ MongoWrapper.connect( config!.databaseHost, config!.databasePort, config!.databa winston.info( `Servers up and runnning`, { process: process.pid }); // Create the readline interface - var rl = readline.createInterface( { + const rl = readline.createInterface( { input: process.stdin, output: process.stdout }); @@ -96,18 +96,18 @@ MongoWrapper.connect( config!.databaseHost, config!.databasePort, config!.databa // Set the prompt to be a > rl.setPrompt( '> ' ); rl.prompt(); - var heapdump: any | null = null; + let heapdump: any | null = null; // Now each time the user hits enter - rl.on( "line", function( line: string ) { + rl.on( 'line', function( line: string ) { switch ( line.trim() ) { case 'debug': try { if ( !heapdump ) heapdump = require( 'heapdump' ); - if ( !fs.existsSync( "./snapshots" ) ) { - fs.mkdirSync( "snapshots" ); + if ( !fs.existsSync( './snapshots' ) ) { + fs.mkdirSync( 'snapshots' ); console.log( `Created folder snapshots` ); } @@ -129,10 +129,10 @@ MongoWrapper.connect( config!.databaseHost, config!.databasePort, config!.databa } break; - case "exit": + case 'exit': console.log( `Bye!` ); process.exit( 0 ); - case "gc": + case 'gc': if ( global && global.gc ) { global.gc(); diff --git a/src/users-service.ts b/src/users-service.ts index d1e61b48..2c0e3f6f 100644 --- a/src/users-service.ts +++ b/src/users-service.ts @@ -1,7 +1,7 @@ -import * as express from "express" -import * as http from "http" -import * as request from "request" -import { IConfig } from "modepress-api"; +import * as express from 'express' +import * as http from 'http' +import * as request from 'request' +import { IConfig } from 'modepress-api'; /** * Singleton service for communicating with a webinate-users server @@ -24,7 +24,6 @@ export class UsersService { * @param message The message to send */ sendAdminEmail( message: string ): Promise { - var that = this; return new Promise( function( resolve, reject ) { request.post( `${UsersService.usersURL}/message-webmaster`, { form: { message: message } }, function( error, response, body ) { response; // Supress empty param warning @@ -42,7 +41,6 @@ export class UsersService { * @param user The email or username */ login( user: string, password: string, remember: boolean ): Promise { - var that = this; return new Promise( function( resolve, reject ) { request.post( `${UsersService.usersURL}/login`, { body: { username: user, password: password, rememberMe: remember } }, function( error, response, body ) { response; // Supress empty param warning @@ -64,7 +62,6 @@ export class UsersService { * Checks if a user is logged in and authenticated */ authenticated( req: express.Request ): Promise { - var that = this; return new Promise( function( resolve, reject ) { request.get( `${UsersService.usersURL}/authenticated`, { headers: { cookie: ( req ).headers.cookie } }, function( error, response, body ) { response; // Supress empty param warning @@ -72,7 +69,7 @@ export class UsersService { if ( error ) return reject( error ); - var token: UsersInterface.IAuthenticationResponse = JSON.parse( body ); + const token: UsersInterface.IAuthenticationResponse = JSON.parse( body ); if ( token.error ) return reject( new Error( token.message ) ); @@ -115,7 +112,6 @@ export class UsersService { * Attempts to get a user by username */ getUser( user: string, req: express.Request ): Promise { - var that = this; return new Promise( function( resolve, reject ) { request.get( `${UsersService.usersURL}/users/${user}`, { headers: { cookie: ( req ).headers.cookie } }, function( error, response, body ) { response; // Supress empty param warning diff --git a/src/utils.ts b/src/utils.ts index 301c74bf..25171653 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -7,10 +7,10 @@ export class Utils { * @param str * @returns True if the string is valid */ - static isValidObjectID( str: string = "" ): boolean { + static isValidObjectID( str: string = '' ): boolean { // coerce to string so the function can be generically used to test both strings and native objectIds created by the driver str = str.trim() + ''; - var len = str.length, valid = false; + let len = str.length, valid = false; if ( len == 12 || len == 24 ) valid = /^[0-9a-fA-F]+$/.test( str );