@getanthill/datastore
Version:
Event-Sourced Datastore
194 lines • 6.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.rotateEncryptionKeys = exports.createModelIndexes = exports.update = exports.create = exports.getSchema = exports.getGraph = exports.getModels = exports.updateApiDefinition = void 0;
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?.update();
}
}
exports.updateApiDefinition = updateApiDefinition;
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);
}
};
}
exports.getModels = getModels;
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);
}
};
}
exports.getGraph = getGraph;
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);
}
};
}
exports.getSchema = getSchema;
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);
}
};
}
exports.create = create;
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);
}
};
}
exports.update = update;
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);
}
};
}
exports.createModelIndexes = createModelIndexes;
function rotateEncryptionKeys(services) {
return async (req, res, next) => {
// @ts-ignore
if (res.body) {
return next();
}
try {
services.metrics.incrementApiAdminRotateEncryptionKeys();
res.status(202).end();
const onlyModels = req.query.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,
});
}
};
}
exports.rotateEncryptionKeys = rotateEncryptionKeys;
//# sourceMappingURL=controllers.js.map