aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/Initialization.ts81
-rw-r--r--src/server/database.ts27
-rw-r--r--src/server/index.ts118
3 files changed, 117 insertions, 109 deletions
diff --git a/src/server/Initialization.ts b/src/server/Initialization.ts
index e371a3edb..2c343ae90 100644
--- a/src/server/Initialization.ts
+++ b/src/server/Initialization.ts
@@ -7,8 +7,8 @@ import * as cookieParser from 'cookie-parser';
import expressFlash = require('express-flash');
import flash = require('connect-flash');
import { Database } from './database';
+import { getForgot, getLogin, getLogout, getReset, getSignup, postForgot, postLogin, postReset, postSignup } from './authentication/controllers/user_controller';
const MongoStore = require('connect-mongo')(session);
-import mongoose, { ConnectionStates } from 'mongoose';
import { RouteStore } from './RouteStore';
import RouteManager from './RouteManager';
import * as webpack from 'webpack';
@@ -25,47 +25,26 @@ export interface InitializationOptions {
export default async function InitializeServer(options: InitializationOptions) {
const { listenAtPort, routeSetter } = options;
- const server = injectMiddleware(express());
- const { url } = Database;
- try {
- await connectToDatabase(url);
- } catch (e) {
- console.error(`Mongoose FAILED to establish default connection at ${url}`);
- console.error(e);
- console.log('Since a valid database connection is required to use Dash, killing the server process.\nPlease try again later.');
- process.exit(1);
- }
-
- // static file serving
- server.use(express.static(__dirname + RouteStore.public));
- server.use(RouteStore.images, express.static(__dirname + RouteStore.public));
+ const server = buildWithMiddleware(express());
routeSetter(new RouteManager(server, determineEnvironment()));
+ server.use(express.static(__dirname + RouteStore.public));
+ server.use(RouteStore.images, express.static(__dirname + RouteStore.public));
+
server.use(wdm(compiler, { publicPath: config.output.publicPath }));
server.use(whm(compiler));
server.listen(listenAtPort, () => console.log(`server started at http://localhost:${listenAtPort}`));
- return server;
-}
-
-function determineEnvironment() {
- const isRelease = process.env.RELEASE === "true";
-
- console.log(`running server in ${isRelease ? 'release' : 'debug'} mode`);
- console.log(process.env.PWD);
+ registerAuthenticationRoutes(server);
- let clientUtils = fs.readFileSync("./src/client/util/ClientUtils.ts.temp", "utf8");
- clientUtils = `//AUTO-GENERATED FILE: DO NOT EDIT\n${clientUtils.replace('"mode"', String(isRelease))}`;
- fs.writeFileSync("./src/client/util/ClientUtils.ts", clientUtils, "utf8");
-
- return isRelease;
+ return server;
}
const week = 7 * 24 * 60 * 60 * 1000;
const secret = "64d6866242d3b5a5503c675b32c9605e4e90478e9b77bcf2bc";
-function injectMiddleware(server: express.Express) {
+function buildWithMiddleware(server: express.Express) {
[
cookieParser(),
session({
@@ -90,21 +69,31 @@ function injectMiddleware(server: express.Express) {
return server;
}
-async function connectToDatabase(url: string) {
- const { connection } = mongoose;
- process.on('SIGINT', () => {
- connection.close(() => {
- console.log('Mongoose default connection disconnected through app termination');
- process.exit(0);
- });
- });
- if (connection.readyState === ConnectionStates.disconnected) {
- return new Promise<void>((resolve, reject) => {
- connection.on('error', reject);
- connection.on('connected', () => {
- console.log(`Mongoose established default connection at ${url}`);
- resolve();
- });
- });
- }
+function determineEnvironment() {
+ const isRelease = process.env.RELEASE === "true";
+
+ console.log(`running server in ${isRelease ? 'release' : 'debug'} mode`);
+ console.log(process.env.PWD);
+
+ let clientUtils = fs.readFileSync("./src/client/util/ClientUtils.ts.temp", "utf8");
+ clientUtils = `//AUTO-GENERATED FILE: DO NOT EDIT\n${clientUtils.replace('"mode"', String(isRelease))}`;
+ fs.writeFileSync("./src/client/util/ClientUtils.ts", clientUtils, "utf8");
+
+ return isRelease;
+}
+
+function registerAuthenticationRoutes(server: express.Express) {
+ server.get(RouteStore.signup, getSignup);
+ server.post(RouteStore.signup, postSignup);
+
+ server.get(RouteStore.login, getLogin);
+ server.post(RouteStore.login, postLogin);
+
+ server.get(RouteStore.logout, getLogout);
+
+ server.get(RouteStore.forgot, getForgot);
+ server.post(RouteStore.forgot, postForgot);
+
+ server.get(RouteStore.reset, getReset);
+ server.post(RouteStore.reset, postReset);
} \ No newline at end of file
diff --git a/src/server/database.ts b/src/server/database.ts
index 25e1e67e0..4f93d1ee6 100644
--- a/src/server/database.ts
+++ b/src/server/database.ts
@@ -5,6 +5,7 @@ import { Utils, emptyFunction } from '../Utils';
import { DashUploadUtils } from './DashUploadUtils';
import { Credentials } from 'google-auth-library';
import { GoogleApiServerUtils } from './apis/google/GoogleApiServerUtils';
+import mongoose, { ConnectionStates } from 'mongoose';
export namespace Database {
@@ -12,6 +13,32 @@ export namespace Database {
const port = 27017;
export const url = `mongodb://localhost:${port}/${schema}`;
+ export async function tryInitializeConnection() {
+ try {
+ const { connection } = mongoose;
+ process.on('SIGINT', () => {
+ connection.close(() => {
+ console.log('Mongoose default connection disconnected through app termination');
+ process.exit(0);
+ });
+ });
+ if (connection.readyState === ConnectionStates.disconnected) {
+ await new Promise<void>((resolve, reject) => {
+ connection.on('error', reject);
+ connection.on('connected', () => {
+ console.log(`Mongoose established default connection at ${url}`);
+ resolve();
+ });
+ });
+ }
+ } catch (e) {
+ console.error(`Mongoose FAILED to establish default connection at ${url} with the following error:`);
+ console.error(e);
+ console.log('Since a valid database connection is required to use Dash, the server process will now exit.\nPlease try again later.');
+ process.exit(1);
+ }
+ }
+
class Database {
public static DocumentsCollection = 'documents';
private MongoClient = mongodb.MongoClient;
diff --git a/src/server/index.ts b/src/server/index.ts
index ad18857b6..ef618472b 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -11,7 +11,6 @@ import * as request from 'request';
import io from 'socket.io';
import { Socket } from 'socket.io';
import { Utils } from '../Utils';
-import { getForgot, getLogin, getLogout, getReset, getSignup, postForgot, postLogin, postReset, postSignup } from './authentication/controllers/user_controller';
import { Client } from './Client';
import { Database } from './database';
import { MessageStore, Transferable, Types, Diff, YoutubeQueryTypes as YoutubeQueryType, YoutubeQueryInput } from "./Message";
@@ -27,7 +26,6 @@ import { Response } from 'express-serve-static-core';
import { GoogleApiServerUtils } from "./apis/google/GoogleApiServerUtils";
const probe = require("probe-image-size");
const pdf = require('pdf-parse');
-var findInFiles = require('find-in-files');
import { GooglePhotosUploadUtils } from './apis/google/GooglePhotosUploadUtils';
import { Opt } from '../new_fields/Doc';
import { DashUploadUtils } from './DashUploadUtils';
@@ -38,6 +36,7 @@ import RouteSubscriber from './RouteSubscriber';
import InitializeServer from './Initialization';
import { Method, _success, _permission_denied, _error, _invalid } from './RouteManager';
import { command_line, read_text_file } from './ActionUtilities';
+var findInFiles = require('find-in-files');
let youtubeApiKey: string;
@@ -51,10 +50,22 @@ export interface NewMediaItem {
};
}
-(async () => {
- YoutubeApi.readApiKey((apiKey: string) => youtubeApiKey = apiKey);
+const pngTypes = [".png", ".PNG"];
+const jpgTypes = [".jpg", ".JPG", ".jpeg", ".JPEG"];
+const uploadDirectory = __dirname + "/public/files/";
+const pdfDirectory = uploadDirectory + "text";
+const solrURL = "http://localhost:8983/solr/#/dash";
+
+YoutubeApi.readApiKey((apiKey: string) => youtubeApiKey = apiKey);
+
+async function PreliminaryFunctions() {
await GoogleApiServerUtils.LoadOAuthClient();
+ await DashUploadUtils.createIfNotExists(pdfDirectory);
+ await Database.tryInitializeConnection();
+}
+(async () => {
+ await PreliminaryFunctions();
await InitializeServer({
listenAtPort: 1050,
routeSetter: router => {
@@ -75,6 +86,26 @@ export interface NewMediaItem {
router.addSupervisedRoute({
method: Method.GET,
+ subscription: "/textsearch",
+ onValidation: async (_user, req, res) => {
+ let q = req.query.q;
+ if (q === undefined) {
+ res.send([]);
+ return;
+ }
+ let results = await findInFiles.find({ 'term': q, 'flags': 'ig' }, uploadDirectory + "text", ".txt$");
+ let resObj: { ids: string[], numFound: number, lines: string[] } = { ids: [], numFound: 0, lines: [] };
+ for (var result in results) {
+ resObj.ids.push(path.basename(result, ".txt").replace(/upload_/, ""));
+ resObj.lines.push(results[result].line);
+ resObj.numFound++;
+ }
+ res.send(resObj);
+ }
+ });
+
+ router.addSupervisedRoute({
+ method: Method.GET,
subscription: "/buxton",
onValidation: (_user, _req, res) => {
let cwd = '../scraping/buxton';
@@ -101,36 +132,19 @@ export interface NewMediaItem {
}
});
- // SEARCH
- const solrURL = "http://localhost:8983/solr/#/dash";
-
- // GETTERS
-
- DashServer.get("/textsearch", async (req, res) => {
- let q = req.query.q;
- if (q === undefined) {
- res.send([]);
- return;
- }
- let results = await findInFiles.find({ 'term': q, 'flags': 'ig' }, uploadDirectory + "text", ".txt$");
- let resObj: { ids: string[], numFound: number, lines: string[] } = { ids: [], numFound: 0, lines: [] };
- for (var result in results) {
- resObj.ids.push(path.basename(result, ".txt").replace(/upload_/, ""));
- resObj.lines.push(results[result].line);
- resObj.numFound++;
- }
- res.send(resObj);
- });
-
- DashServer.get("/search", async (req, res) => {
- const solrQuery: any = {};
- ["q", "fq", "start", "rows", "hl", "hl.fl"].forEach(key => solrQuery[key] = req.query[key]);
- if (solrQuery.q === undefined) {
- res.send([]);
- return;
+ router.addSupervisedRoute({
+ method: Method.GET,
+ subscription: "/search",
+ onValidation: async (_user, req, res) => {
+ const solrQuery: any = {};
+ ["q", "fq", "start", "rows", "hl", "hl.fl"].forEach(key => solrQuery[key] = req.query[key]);
+ if (solrQuery.q === undefined) {
+ res.send([]);
+ return;
+ }
+ let results = await Search.Instance.search(solrQuery);
+ res.send(results);
}
- let results = await Search.Instance.search(solrQuery);
- res.send(results);
});
function msToTime(duration: number) {
@@ -210,9 +224,14 @@ export interface NewMediaItem {
await Database.Instance.visit([id], fn);
return { id, docs, files };
}
- DashServer.get("/serializeDoc/:docId", async (req, res) => {
- const { docs, files } = await getDocs(req.params.docId);
- res.send({ docs, files: Array.from(files) });
+
+ router.addSupervisedRoute({
+ method: Method.GET,
+ subscription: new RouteSubscriber("/serializeDoc").add("docId"),
+ onValidation: async (_user, req, res) => {
+ const { docs, files } = await getDocs(req.params.docId);
+ res.send({ docs, files: Array.from(files) });
+ }
});
router.addSupervisedRoute({
@@ -554,12 +573,6 @@ export interface NewMediaItem {
}
}
- const pngTypes = [".png", ".PNG"];
- const jpgTypes = [".jpg", ".JPG", ".jpeg", ".JPEG"];
- const uploadDirectory = __dirname + "/public/files/";
- const pdfDirectory = uploadDirectory + "text";
- DashUploadUtils.createIfNotExists(pdfDirectory);
-
interface ImageFileResponse {
name: string;
path: string;
@@ -657,27 +670,6 @@ export interface NewMediaItem {
}
});
- // AUTHENTICATION
-
- // Sign Up
- DashServer.get(RouteStore.signup, getSignup);
- DashServer.post(RouteStore.signup, postSignup);
-
- // Log In
- DashServer.get(RouteStore.login, getLogin);
- DashServer.post(RouteStore.login, postLogin);
-
- // Log Out
- DashServer.get(RouteStore.logout, getLogout);
-
- // FORGOT PASSWORD EMAIL HANDLING
- DashServer.get(RouteStore.forgot, getForgot);
- DashServer.post(RouteStore.forgot, postForgot);
-
- // RESET PASSWORD EMAIL HANDLING
- DashServer.get(RouteStore.reset, getReset);
- DashServer.post(RouteStore.reset, postReset);
-
const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
DashServer.use(RouteStore.corsProxy, (req, res) => {
req.pipe(request(decodeURIComponent(req.url.substring(1)))).on("response", res => {