@getanthill/datastore
Version:
Event-Sourced Datastore
186 lines • 6.98 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.graph = exports.models = exports.upsertModel = void 0;
const assert_1 = require("assert");
const fs_1 = __importDefault(require("fs"));
const commander_1 = require("commander");
const utils = __importStar(require("./utils"));
const js_yaml_1 = __importDefault(require("js-yaml"));
function upsertModel(services) {
return async (modelPath, cmd) => {
try {
const datastore = services.datastores.get(cmd.datastore);
if (!datastore) {
return;
}
let modelConfigs = null;
if (cmd.yaml === true) {
modelConfigs = js_yaml_1.default.load(fs_1.default.readFileSync(modelPath, 'utf8'));
}
else {
modelConfigs = require(modelPath);
if ('default' in modelConfigs) {
// @ts-ignore
modelConfigs = modelConfigs.default;
}
}
(0, assert_1.ok)(modelConfigs !== null, 'Invalid model configuration');
(0, assert_1.ok)(cmd.multi !== true || cmd.name === undefined, 'Model name can not be used in conjunction of --multi');
(0, assert_1.ok)(cmd.multi !== true || cmd.description === undefined, 'Model description can not be used in conjunction of --multi');
const models = [];
if (cmd.multi === false) {
models.push(modelConfigs);
}
else if (Array.isArray(modelConfigs)) {
models.push(...modelConfigs);
}
else {
models.push(...Object.values(modelConfigs));
}
for (const modelConfig of models) {
if (cmd.name) {
modelConfig.name = cmd.name;
modelConfig?.indexes?.forEach((index) => {
index.collection = cmd.name;
});
}
if (cmd.description) {
modelConfig.description = cmd.description;
}
let model;
try {
const { data } = await datastore.createModel(modelConfig);
model = data;
}
catch (err) {
if (err.response && err.response.status === 409) {
const { data } = await datastore.updateModel(modelConfig);
model = data;
}
else {
throw err;
}
}
utils.log(model, cmd.format);
if (cmd.withIndexes !== true) {
continue;
}
const { data: indexes } = await datastore.createModelIndexes(modelConfig);
utils.log(indexes, cmd.format);
}
}
catch (err) {
if (err.response) {
utils.log(err.response.data, cmd.format);
return;
}
utils.log(err, cmd.format);
}
};
}
exports.upsertModel = upsertModel;
function models(services) {
return async (cmd) => {
try {
const datastore = services.datastores.get(cmd.datastore);
if (!datastore) {
return;
}
const { data } = await datastore.getModels();
utils.log(Object.keys(data), cmd.format);
}
catch (err) {
if (err.response) {
utils.log(err.response.data, cmd.format);
return;
}
utils.log(err, cmd.format);
}
};
}
exports.models = models;
function graph(services) {
return async (cmd) => {
try {
const datastore = services.datastores.get(cmd.datastore);
if (!datastore) {
return;
}
const { data } = await datastore.getGraph();
utils.log(data, cmd.format);
}
catch (err) {
if (err.response) {
utils.log(err.response.data, cmd.format);
return;
}
utils.log(err, cmd.format);
}
};
}
exports.graph = graph;
function register(services, name = 'admin') {
const program = new commander_1.Command(name);
program.summary('Administration commands');
// Upsert
let c = program.command('upsert <model_path>');
utils.addDatastoreOptions(c, services);
c.option('--name <name>', 'Model name')
.option('--description <description>', 'Model description')
.option('--with-indexes', 'Update indexes', false)
.option('--yaml', 'Is model in YAML format', false)
.option('--multi', 'Do we import multiple models at once', false)
.addOption(new commander_1.Option('--format <format>', 'Response format').choices([
'json',
'yaml',
]))
.description('Admin create or update a model')
.action(upsertModel(services));
// Models
c = program.command('models');
utils.addDatastoreOptions(c, services);
c.addOption(new commander_1.Option('--format <format>', 'Response format').choices([
'json',
'yaml',
]))
.description('Get models available in the Datastore')
.action(models(services));
// Graph
c = program.command('graph');
utils.addDatastoreOptions(c, services);
c.addOption(new commander_1.Option('--format <format>', 'Response format').choices([
'json',
'yaml',
]))
.description('Get the entities dependency graph')
.action(graph(services));
return program;
}
exports.default = register;
//# sourceMappingURL=admin.js.map