UNPKG

@getanthill/datastore

Version:

Event-Sourced Datastore

194 lines 6.31 kB
"use strict"; 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