UNPKG

@getanthill/datastore

Version:

Event-Sourced Datastore

192 lines 6.27 kB
"use strict"; 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