BfF Core
General
This package is intended to summarize the experience of developing a customization backend.
The base distribution assumes that the package will be used as is, without any changes. In most cases, this will be sufficient to deploy the base environment.
Basic Usage
Here is basic example of usage.
$ npm install @invent/fe-be-core@latest
/*
* index.ts
*/
import express from 'express';
import cors from 'cors';
import compression from 'compression';
import helmet from 'helmet';
import {
validateRequestTokenMiddlewareFabric,
tokenErrorHandler,
endpointConfig,
connectToMongo,
hydrate
} from '@invent/fe-be-core';
const PORT = process.env.PORT || 1337;
process.on('unhandledRejection', function (err) {
console.log(err);
});
connectToMongo()
.catch((e) => {
console.error('Connection to MongoDB failed', e);
throw e;
})
.then(() => {
const app = express();
// Removes 'x-powered-by` header for security matters
app.disable('x-powered-by');
// Allows compression for data transfer
app.use(compression());
// Allows CORS policy
app.use(cors());
// Attaches security headers
app.use(helmet());
// Adds static folders for serving
app.use('/images', express.static('images'));
app.use('/templates/assets/fonts', express.static('fonts'));
/*
Adds exceptions for protected routes.
Next list of endpoints will be not checked for OAuth token.
*/
app.use(
validateRequestTokenMiddlewareFabric([
'/images',
'/templates/assets/fonts',
'/theme',
'/theme/My-theme-default',
'/tenent'
])
);
// handler for failed token validation
app.use(tokenErrorHandler);
// Will mount default list of endpoinds and handlers.
endpointConfig.forEach((domain) => hydrate(app, domain));
app.get('/', (_, res) => {
res.send('My customization server');
});
// Mounts application on port.
app.listen(PORT, () => {
console.log(`⚡️[server]: Server is running at https://0.0.0.0:${PORT}`);
});
});
The override case
/*
* Some file with overrides.
* We have no strict rules for place or name for override files.
*/
import { Request, Response } from 'express';
import { v4 } from 'uuid';
import { extendDomainWith, DashboardMeta } from '@invent/fe-be-core';
async function listOfDashboards(req: Request, res: Response) {
res.send(await DashboardMeta.find({}));
}
export function overrideRoutes() {
extendDomainWith('dashboards', [
{
route: '',
method: 'get',
handler: listOfDashboards
},
]);
}
/*
* index.ts
* The next code will be mostly copy the prev example.
* Only difference is usage of 'overrideRoutes();'
*/
import express from 'express';
import cors from 'cors';
import compression from 'compression';
import helmet from 'helmet';
import {
validateRequestTokenMiddlewareFabric,
tokenErrorHandler,
endpointConfig,
connectToMongo,
hydrate
} from '@invent/fe-be-core';
import { overrideRoutes } from './overrides/endpoint-overrides';
const PORT = process.env.PORT || 1337;
process.on('unhandledRejection', function (err) {
console.log(err);
});
connectToMongo()
.then()
.catch((e) => {
console.error('Connection to MongoDB failed', e);
throw e;
})
.then(() => {
const app = express();
app.disable('x-powered-by');
app.use(compression());
app.use(cors());
app.use(helmet());
app.use('/images', express.static('images'));
app.use('/templates/assets/fonts', express.static('fonts'));
app.use(
validateRequestTokenMiddlewareFabric([
'/images',
'/templates/assets/fonts',
'/theme',
'/theme/My-theme-default',
'/tenent'
])
);
app.use(tokenErrorHandler);
// Apply overrided route.
overrideRoutes();
endpointConfig.forEach((domain) => hydrate(app, domain));
app.get('/', (_, res) => {
res.send('My customization server');
});
app.listen(PORT, () => {
console.log(`⚡️[server]: Server is running at https://0.0.0.0:${PORT}`);
});
});