diff --git a/tdrive/connectors/onlyoffice-connector/src/app.ts b/tdrive/connectors/onlyoffice-connector/src/app.ts index 95e2d37d..9b5f1bd2 100644 --- a/tdrive/connectors/onlyoffice-connector/src/app.ts +++ b/tdrive/connectors/onlyoffice-connector/src/app.ts @@ -1,16 +1,13 @@ +import path from 'path'; import express from 'express'; -import { Routes } from '@interfaces/routes.interface'; -import { NODE_ENV } from '@config'; import cors from 'cors'; 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 apiService from './services/api.service'; -import onlyofficeService from './services/onlyoffice.service'; -import { makeURLTo, mountRoutes } from './routes'; + +import { NODE_ENV, SERVER_BIND, SERVER_PORT } from '@config'; +import logger from './lib/logger'; +import errorMiddleware from './middlewares/error.middleware'; +import { mountRoutes } from './routes'; class App { public app: express.Application; @@ -28,8 +25,9 @@ class App { } public listen = () => { - this.app.listen(parseInt(SERVER_PORT, 10), '0.0.0.0', () => { - logger.info(`🚀 App listening on port ${SERVER_PORT}`); + const binding_host = SERVER_BIND || '0.0.0.0'; + 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); - - 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 = () => { diff --git a/tdrive/connectors/onlyoffice-connector/src/controllers/browser-editor.controller.ts b/tdrive/connectors/onlyoffice-connector/src/controllers/browser-editor.controller.ts index e1bcf19f..a32b98b4 100644 --- a/tdrive/connectors/onlyoffice-connector/src/controllers/browser-editor.controller.ts +++ b/tdrive/connectors/onlyoffice-connector/src/controllers/browser-editor.controller.ts @@ -5,7 +5,7 @@ import jwt from 'jsonwebtoken'; import driveService from '@/services/drive.service'; import { DriveFileType } from '@/interfaces/drive.interface'; 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 { makeURLTo } from '@/routes'; diff --git a/tdrive/connectors/onlyoffice-connector/src/controllers/health-status.controller.ts b/tdrive/connectors/onlyoffice-connector/src/controllers/health-status.controller.ts new file mode 100644 index 00000000..88ccb136 --- /dev/null +++ b/tdrive/connectors/onlyoffice-connector/src/controllers/health-status.controller.ts @@ -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 { + 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), + ); + }, +}; diff --git a/tdrive/connectors/onlyoffice-connector/src/controllers/onlyoffice.controller.ts b/tdrive/connectors/onlyoffice-connector/src/controllers/onlyoffice.controller.ts index 1605dcfc..1293a953 100644 --- a/tdrive/connectors/onlyoffice-connector/src/controllers/onlyoffice.controller.ts +++ b/tdrive/connectors/onlyoffice-connector/src/controllers/onlyoffice.controller.ts @@ -1,5 +1,5 @@ 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 fileService from '@/services/file.service'; import logger from '@/lib/logger'; diff --git a/tdrive/connectors/onlyoffice-connector/src/interfaces/drive.interface.ts b/tdrive/connectors/onlyoffice-connector/src/interfaces/drive.interface.ts index c7b94f3a..4249f575 100644 --- a/tdrive/connectors/onlyoffice-connector/src/interfaces/drive.interface.ts +++ b/tdrive/connectors/onlyoffice-connector/src/interfaces/drive.interface.ts @@ -21,6 +21,6 @@ export interface IDriveService { get: (params: DriveRequestParams) => Promise; createVersion: (params: { company_id: string; drive_file_id: string; file_id: string }) => Promise; beginEditingSession: (company_id: string, drive_file_id: string) => Promise; - endEditing: (company_id: string, editing_session_key: string, file_source_url: string) => Promise; + endEditing: (company_id: string, editing_session_key: string, url: string) => Promise; getByEditingSessionKey: (params: { company_id: string; editing_session_key: string; user_token?: string }) => Promise; } diff --git a/tdrive/connectors/onlyoffice-connector/src/interfaces/routes.interface.ts b/tdrive/connectors/onlyoffice-connector/src/interfaces/office-token.interface.ts similarity index 68% rename from tdrive/connectors/onlyoffice-connector/src/interfaces/routes.interface.ts rename to tdrive/connectors/onlyoffice-connector/src/interfaces/office-token.interface.ts index bced3c8d..a52fc337 100644 --- a/tdrive/connectors/onlyoffice-connector/src/interfaces/routes.interface.ts +++ b/tdrive/connectors/onlyoffice-connector/src/interfaces/office-token.interface.ts @@ -1,10 +1,3 @@ -import { Router } from 'express'; - -export interface Routes { - path?: string; - router: Router; -} - export interface OfficeToken { user_id: string; company_id: string; diff --git a/tdrive/connectors/onlyoffice-connector/src/routes/index.ts b/tdrive/connectors/onlyoffice-connector/src/routes/index.ts index 758ee1a7..930c6e12 100644 --- a/tdrive/connectors/onlyoffice-connector/src/routes/index.ts +++ b/tdrive/connectors/onlyoffice-connector/src/routes/index.ts @@ -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 { SERVER_ORIGIN, SERVER_PREFIX } from '@config'; +import { HealthStatusController } from '@/controllers/health-status.controller'; import { TwakeDriveBackendCallbackRoutes } from './backend-callbacks.route'; import { BrowserEditorRoutes } from './browser-editor.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) { + // 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 const proxiedRouter = Router(); BrowserEditorRoutes.mount(proxiedRouter); OnlyOfficeRoutes.mount(proxiedRouter); - console.log('Mounting at ' + SERVER_PREFIX); - app.use(SERVER_PREFIX, proxiedRouter); + mountAssetsRoutes(proxiedRouter); + app.use(SERVER_PREFIX /* usually "plugins/onlyoffice" */, proxiedRouter); // These endpoints should only be accessible to the Twake Drive backend const apiRouter = Router(); - console.log('Mounting at ' + SERVER_TDRIVE_API_PREFIX); TwakeDriveBackendCallbackRoutes.mount(apiRouter); - app.use(SERVER_TDRIVE_API_PREFIX, apiRouter); + app.use('/tdriveApi/1', apiRouter); } export const makeURLTo = { @@ -30,14 +45,3 @@ export const makeURLTo = { 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, -// }); -// }