UNPKG

@thisisagile/easy-express

Version:

Straightforward library for building domain-driven microservice architectures

94 lines (93 loc) 2.88 kB
import { checkLabCoat, checkScope, checkToken, checkUseCase } from "../chunk-G54PL2JB.mjs"; import "../chunk-RL5ICAHT.mjs"; // src/express/ExpressProvider.ts import express from "express"; import { HttpStatus, isEmpty, rest, toList, toReq } from "@thisisagile/easy"; import { routes, Service, toOriginatedError, toVerbOptions } from "@thisisagile/easy-service"; var ExpressProvider = class { constructor(app = express()) { this.app = app; this.app.set("trust proxy", ["loopback", "linklocal", "uniquelocal"]); } use = (handler) => { this.app.use(handler); }; route = (service2, resource) => { const { route, endpoints, middleware } = routes(resource); const router = express.Router({ mergeParams: true }); if (!isEmpty(middleware)) router.all(route.route(service2.name), middleware); endpoints.forEach(({ endpoint, verb, requires, middleware: middleware2 }) => { console.log(verb.verb.code, route.route(service2.name)); router[verb.verb.toString()]( route.route(service2.name), ...this.addSecurityMiddleware(requires), ...middleware2, this.handle(endpoint, verb.options, requires) ); }); this.app.use(router); }; listen = (port, message = `Service is listening on port ${port}.`) => { this.app.listen(port, () => { console.log(message); }); }; addSecurityMiddleware(requires) { const middleware = []; if (requires.labCoat) middleware.push(checkLabCoat()); if (requires.token) middleware.push(checkToken()); if (requires.scope) middleware.push(checkScope(requires.scope)); if (requires.uc) middleware.push(checkUseCase(requires.uc)); return middleware; } handle = (endpoint, options, requires) => (req, res, next) => endpoint(toReq(req)).then((r) => this.toResponse(res, r, toVerbOptions(options))).catch((error) => next(toOriginatedError(error, options))); toResponse(res, result, options) { res.status(options.onOk.status); res.type(options.type.code); if (options.cache.enabled) res.setHeader(options.cache.name, options.cache.value()); (this[options.type.name] ?? this.json)(res, result, options); } // Handling responses depending on content type json(res, result, options) { if (HttpStatus.NoContent.equals(options.onOk)) { res.send(); } else { res.json(rest.toData(options.onOk, toList(result), result?.total, result?.meta)); } } rawJson(res, result, options) { if (HttpStatus.NoContent.equals(options.onOk)) { res.send(); } else { res.json(result); } } stream(res, result) { res.end(result); } text(res, data) { res.send(data); } }; var service = (name) => new Service(name, new ExpressProvider()); export { ExpressProvider, service }; //# sourceMappingURL=ExpressProvider.mjs.map