♻️ ooconnector: routing refactor (#525)
This commit is contained in:
@@ -1,16 +1,13 @@
|
|||||||
|
import path from 'path';
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
import { Routes } from '@interfaces/routes.interface';
|
|
||||||
import { NODE_ENV } from '@config';
|
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
import { renderFile } from 'eta';
|
import { renderFile } from 'eta';
|
||||||
import path from 'path';
|
|
||||||
import errorMiddleware from './middlewares/error.middleware';
|
|
||||||
import { SERVER_PORT } from '@config';
|
|
||||||
import logger from './lib/logger';
|
|
||||||
import cookieParser from 'cookie-parser';
|
import cookieParser from 'cookie-parser';
|
||||||
import apiService from './services/api.service';
|
|
||||||
import onlyofficeService from './services/onlyoffice.service';
|
import { NODE_ENV, SERVER_BIND, SERVER_PORT } from '@config';
|
||||||
import { makeURLTo, mountRoutes } from './routes';
|
import logger from './lib/logger';
|
||||||
|
import errorMiddleware from './middlewares/error.middleware';
|
||||||
|
import { mountRoutes } from './routes';
|
||||||
|
|
||||||
class App {
|
class App {
|
||||||
public app: express.Application;
|
public app: express.Application;
|
||||||
@@ -28,8 +25,9 @@ class App {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public listen = () => {
|
public listen = () => {
|
||||||
this.app.listen(parseInt(SERVER_PORT, 10), '0.0.0.0', () => {
|
const binding_host = SERVER_BIND || '0.0.0.0';
|
||||||
logger.info(`🚀 App listening on port ${SERVER_PORT}`);
|
this.app.listen(parseInt(SERVER_PORT, 10), binding_host, () => {
|
||||||
|
logger.info(`🚀 App listening at http://${binding_host}:${SERVER_PORT}`);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -42,29 +40,6 @@ class App {
|
|||||||
});
|
});
|
||||||
|
|
||||||
mountRoutes(this.app);
|
mountRoutes(this.app);
|
||||||
|
|
||||||
this.app.get('/health', (_req, res) => {
|
|
||||||
Promise.all([onlyofficeService.getLatestLicence(), apiService.hasToken(), onlyofficeService.getForgottenList()]).then(
|
|
||||||
([onlyOfficeLicense, twakeDriveToken, forgottenKeys]) =>
|
|
||||||
res.status(onlyOfficeLicense && twakeDriveToken ? 200 : 500).send({
|
|
||||||
uptime: process.uptime(),
|
|
||||||
onlyOfficeLicense,
|
|
||||||
twakeDriveToken,
|
|
||||||
forgottenKeys,
|
|
||||||
}),
|
|
||||||
err => res.status(500).send(err),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.app.use(
|
|
||||||
makeURLTo.assets(),
|
|
||||||
(req, res, next) => {
|
|
||||||
res.header('Access-Control-Allow-Origin', '*');
|
|
||||||
res.header('Access-Control-Allow-Headers', 'X-Requested-With');
|
|
||||||
next();
|
|
||||||
},
|
|
||||||
express.static(path.join(__dirname, '../assets')),
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private initMiddlewares = () => {
|
private initMiddlewares = () => {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import jwt from 'jsonwebtoken';
|
|||||||
import driveService from '@/services/drive.service';
|
import driveService from '@/services/drive.service';
|
||||||
import { DriveFileType } from '@/interfaces/drive.interface';
|
import { DriveFileType } from '@/interfaces/drive.interface';
|
||||||
import fileService from '@/services/file.service';
|
import fileService from '@/services/file.service';
|
||||||
import { OfficeToken } from '@/interfaces/routes.interface';
|
import { OfficeToken } from '@/interfaces/office-token.interface';
|
||||||
import logger from '@/lib/logger';
|
import logger from '@/lib/logger';
|
||||||
import { makeURLTo } from '@/routes';
|
import { makeURLTo } from '@/routes';
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import { NextFunction, Request, Response } from 'express';
|
||||||
|
import onlyofficeService from '@/services/onlyoffice.service';
|
||||||
|
import apiService from '@/services/api.service';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Health response for devops operational purposes. Should not be exposed.
|
||||||
|
*/
|
||||||
|
export const HealthStatusController = {
|
||||||
|
async get(req: Request<{}, {}, {}, {}>, res: Response, next: NextFunction): Promise<void> {
|
||||||
|
Promise.all([onlyofficeService.getLatestLicence(), apiService.hasToken(), onlyofficeService.getForgottenList()]).then(
|
||||||
|
([onlyOfficeLicense, twakeDriveToken, forgottenKeys]) =>
|
||||||
|
res.status(onlyOfficeLicense && twakeDriveToken ? 200 : 500).send({
|
||||||
|
uptimeS: Math.floor(process.uptime()),
|
||||||
|
onlyOfficeLicense,
|
||||||
|
twakeDriveToken,
|
||||||
|
forgottenCount: forgottenKeys?.length ?? 0,
|
||||||
|
}),
|
||||||
|
err => res.status(500).send(err),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { CREDENTIALS_SECRET } from '@/config';
|
import { CREDENTIALS_SECRET } from '@/config';
|
||||||
import { OfficeToken } from '@/interfaces/routes.interface';
|
import { OfficeToken } from '@/interfaces/office-token.interface';
|
||||||
import driveService from '@/services/drive.service';
|
import driveService from '@/services/drive.service';
|
||||||
import fileService from '@/services/file.service';
|
import fileService from '@/services/file.service';
|
||||||
import logger from '@/lib/logger';
|
import logger from '@/lib/logger';
|
||||||
|
|||||||
@@ -21,6 +21,6 @@ export interface IDriveService {
|
|||||||
get: (params: DriveRequestParams) => Promise<DriveFileType>;
|
get: (params: DriveRequestParams) => Promise<DriveFileType>;
|
||||||
createVersion: (params: { company_id: string; drive_file_id: string; file_id: string }) => Promise<DriveFileType['item']['last_version_cache']>;
|
createVersion: (params: { company_id: string; drive_file_id: string; file_id: string }) => Promise<DriveFileType['item']['last_version_cache']>;
|
||||||
beginEditingSession: (company_id: string, drive_file_id: string) => Promise<string>;
|
beginEditingSession: (company_id: string, drive_file_id: string) => Promise<string>;
|
||||||
endEditing: (company_id: string, editing_session_key: string, file_source_url: string) => Promise<void>;
|
endEditing: (company_id: string, editing_session_key: string, url: string) => Promise<void>;
|
||||||
getByEditingSessionKey: (params: { company_id: string; editing_session_key: string; user_token?: string }) => Promise<DriveFileType['item']>;
|
getByEditingSessionKey: (params: { company_id: string; editing_session_key: string; user_token?: string }) => Promise<DriveFileType['item']>;
|
||||||
}
|
}
|
||||||
|
|||||||
-7
@@ -1,10 +1,3 @@
|
|||||||
import { Router } from 'express';
|
|
||||||
|
|
||||||
export interface Routes {
|
|
||||||
path?: string;
|
|
||||||
router: Router;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface OfficeToken {
|
export interface OfficeToken {
|
||||||
user_id: string;
|
user_id: string;
|
||||||
company_id: string;
|
company_id: string;
|
||||||
@@ -1,26 +1,41 @@
|
|||||||
import { Application, Router } from 'express';
|
import * as path from 'path';
|
||||||
|
import { static as expressStatic, Application, Router } from 'express';
|
||||||
|
|
||||||
import * as Utils from '@/utils';
|
import * as Utils from '@/utils';
|
||||||
|
import { SERVER_ORIGIN, SERVER_PREFIX } from '@config';
|
||||||
|
|
||||||
|
import { HealthStatusController } from '@/controllers/health-status.controller';
|
||||||
import { TwakeDriveBackendCallbackRoutes } from './backend-callbacks.route';
|
import { TwakeDriveBackendCallbackRoutes } from './backend-callbacks.route';
|
||||||
import { BrowserEditorRoutes } from './browser-editor.route';
|
import { BrowserEditorRoutes } from './browser-editor.route';
|
||||||
import { OnlyOfficeRoutes } from './onlyoffice.route';
|
import { OnlyOfficeRoutes } from './onlyoffice.route';
|
||||||
|
|
||||||
import { SERVER_ORIGIN, SERVER_PREFIX, SERVER_TDRIVE_API_PREFIX } from '@config';
|
function mountAssetsRoutes(router: Router) {
|
||||||
|
router.use(
|
||||||
|
'/assets',
|
||||||
|
(req, res, next) => {
|
||||||
|
res.header('Access-Control-Allow-Origin', '*');
|
||||||
|
res.header('Access-Control-Allow-Headers', 'X-Requested-With');
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
expressStatic(path.join(__dirname, '../../assets')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function mountRoutes(app: Application) {
|
export function mountRoutes(app: Application) {
|
||||||
|
// Technical routes for ops. Should not be exposed.
|
||||||
|
app.get('/health', HealthStatusController.get);
|
||||||
|
|
||||||
// These routes are forwarded through the Twake Drive front, back and here
|
// These routes are forwarded through the Twake Drive front, back and here
|
||||||
const proxiedRouter = Router();
|
const proxiedRouter = Router();
|
||||||
BrowserEditorRoutes.mount(proxiedRouter);
|
BrowserEditorRoutes.mount(proxiedRouter);
|
||||||
OnlyOfficeRoutes.mount(proxiedRouter);
|
OnlyOfficeRoutes.mount(proxiedRouter);
|
||||||
console.log('Mounting at ' + SERVER_PREFIX);
|
mountAssetsRoutes(proxiedRouter);
|
||||||
app.use(SERVER_PREFIX, proxiedRouter);
|
app.use(SERVER_PREFIX /* usually "plugins/onlyoffice" */, proxiedRouter);
|
||||||
|
|
||||||
// These endpoints should only be accessible to the Twake Drive backend
|
// These endpoints should only be accessible to the Twake Drive backend
|
||||||
const apiRouter = Router();
|
const apiRouter = Router();
|
||||||
console.log('Mounting at ' + SERVER_TDRIVE_API_PREFIX);
|
|
||||||
TwakeDriveBackendCallbackRoutes.mount(apiRouter);
|
TwakeDriveBackendCallbackRoutes.mount(apiRouter);
|
||||||
app.use(SERVER_TDRIVE_API_PREFIX, apiRouter);
|
app.use('/tdriveApi/1', apiRouter);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const makeURLTo = {
|
export const makeURLTo = {
|
||||||
@@ -30,14 +45,3 @@ export const makeURLTo = {
|
|||||||
return Utils.joinURL([SERVER_ORIGIN ?? '', SERVER_PREFIX, 'editor'], params);
|
return Utils.joinURL([SERVER_ORIGIN ?? '', SERVER_PREFIX, 'editor'], params);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// export function makeURLToEditor2() {
|
|
||||||
// const initResponse = await editorService.init(company_id, file_name, file_id, user, preview, drive_file_id || file_id);
|
|
||||||
|
|
||||||
// res.render('index', {
|
|
||||||
// ...initResponse,
|
|
||||||
// docId: preview ? file_id : editing_session_key,
|
|
||||||
// server: Utils.joinURL([SERVER_ORIGIN, SERVER_PREFIX]),
|
|
||||||
// token: inPageToken,
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|||||||
Reference in New Issue
Block a user