@getanthill/datastore
Version:
Event-Sourced Datastore
192 lines • 6.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateApiDefinition = updateApiDefinition;
exports.getModels = getModels;
exports.getGraph = getGraph;
exports.getSchema = getSchema;
exports.create = create;
exports.update = update;
exports.createModelIndexes = createModelIndexes;
exports.rotateEncryptionKeys = rotateEncryptionKeys;
async function updateApiDefinition(services, openApi) {
const { config, models } = services;
if (config.mode === 'development' ||
config.features.api.updateSpecOnModelsChange === true) {
await models.reset().reload(true);
await (openApi === null || openApi === void 0 ? void 0 : openApi.update());
}
}
function getModels(services) {
return async (req, res, next) => {
// @ts-ignore
if (res.body) {
return next();
}
try {
services.metrics.incrementApiAdminGetModels();
const response = {};
const model = req.query.model;
for (const [modelName, Model] of services.models.MODELS.entries()) {
if (services.models.isInternalModel(modelName) === true) {
continue;
}
if (model && modelName !== model) {
continue;
}
response[modelName] = Model.getModelConfig();
}
res.json(response);
}
catch (err) {
next(err);
}
};
}
function getGraph(services) {
return async (req, res, next) => {
// @ts-ignore
if (res.body) {
return next();
}
try {
services.metrics.incrementApiAdminGetGraph();
const graph = services.models.getGraph(req.query);
res.json(graph);
}
catch (err) {
next(err);
}
};
}
function getSchema(services) {
return async (req, res, next) => {
// @ts-ignore
if (res.body) {
return next();
}
try {
services.metrics.incrementApiAdminGetSchema();
const Model = services.models.getModel(req.params.model);
/**
* Adding the correlation field to the response headers
* @todo need to apply this to every request and in the API documentation
*/
res.set({
'correlation-field': Model.getModelConfig().correlation_field,
});
res.json(Model.getOriginalSchema());
}
catch (err) {
if (err.message === 'Invalid Model') {
err.status = 400;
return next(err);
}
next(err);
}
};
}
function create(services, openApi) {
return async (req, res, next) => {
// @ts-ignore
if (res.body) {
return next();
}
try {
const modelConfig = req.body;
services.metrics.incrementApiAdminCreateModel({
model: modelConfig.name,
});
const internalModel = await services.models.createModel(modelConfig);
await updateApiDefinition(services, openApi);
return res.json(internalModel.state);
}
catch (err) {
if (err.message === 'Event schema validation error') {
err.status = 400;
return next(err);
}
if (err.message === 'Model already exists') {
err.status = 409;
return next(err);
}
next(err);
}
};
}
function update(services, openApi) {
return async (req, res, next) => {
// @ts-ignore
if (res.body) {
return next();
}
try {
const modelConfig = req.body;
services.metrics.incrementApiAdminUpdateModel({
model: modelConfig.name,
});
const updatedModel = await services.models.updateModel(req.params.model, modelConfig);
await updateApiDefinition(services, openApi);
return res.json(updatedModel.state);
}
catch (err) {
if (err.message === 'Invalid Model') {
err.status = 400;
return next(err);
}
if (err.message === 'Event schema validation error') {
err.status = 400;
return next(err);
}
next(err);
}
};
}
function createModelIndexes(services) {
return async (req, res, next) => {
// @ts-ignore
if (res.body) {
return next();
}
try {
const modelConfig = 'indexes' in req.body
? req.body
: services.models.getModel(req.params.model).getModelConfig();
services.metrics.incrementApiAdminUpdateModelIndexes({
model: req.params.model,
});
const modelIndexes = await services.models.createModelIndexes({
name: req.params.model,
...modelConfig,
});
res.json(modelIndexes);
}
catch (err) {
if (err.message === 'Invalid Model') {
err.status = 400;
return next(err);
}
next(err);
}
};
}
function rotateEncryptionKeys(services) {
return async (req, res, next) => {
var _a, _b;
// @ts-ignore
if (res.body) {
return next();
}
try {
services.metrics.incrementApiAdminRotateEncryptionKeys();
res.status(202).end();
const onlyModels = JSON.parse((_b = (_a = req.query) === null || _a === void 0 ? void 0 : _a.q) !== null && _b !== void 0 ? _b : '{}').models;
services.telemetry.logger.info('[admin] Encryption key rotation started');
await services.models.rotateEncryptionKey(onlyModels);
services.telemetry.logger.info('[admin] Encryption key rotation ended');
}
catch (err) {
services.telemetry.logger.error('[admin] Encryption key rotation failed', { err });
}
};
}
//# sourceMappingURL=controllers.js.map