@thisisagile/easy-express
Version:
Straightforward library for building domain-driven microservice architectures
94 lines (93 loc) • 2.88 kB
JavaScript
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