nesoi 3.0.9 → 3.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/compiler/apps/monolyth/monolyth_compiler.d.ts +1 -1
- package/lib/compiler/apps/monolyth/monolyth_compiler.js +7 -7
- package/lib/elements/blocks/block.builder.js +1 -1
- package/lib/elements/blocks/job/job.builder.js +3 -2
- package/lib/elements/blocks/machine/machine.builder.js +12 -1
- package/lib/elements/blocks/machine/machine.schema.d.ts +2 -1
- package/lib/elements/blocks/machine/machine.schema.js +2 -1
- package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +3 -1
- package/lib/elements/edge/controller/adapters/controller_adapter.js +2 -1
- package/lib/elements/edge/controller/controller.config.d.ts +3 -2
- package/lib/elements/edge/controller/controller.d.ts +3 -3
- package/lib/elements/edge/controller/controller.js +3 -3
- package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +2 -1
- package/lib/elements/entities/bucket/bucket.config.d.ts +3 -3
- package/lib/elements/entities/bucket/bucket.d.ts +3 -2
- package/lib/elements/entities/bucket/bucket.js +4 -4
- package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +1 -1
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +4 -0
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +3 -0
- package/lib/elements/entities/bucket/query/nql_compiler.js +2 -1
- package/lib/elements/entities/message/template/message_template_field.builder.d.ts +6 -0
- package/lib/elements/entities/message/template/message_template_field.builder.js +3 -0
- package/lib/elements/entities/message/template/message_template_parser.js +5 -0
- package/lib/engine/apps/app.config.d.ts +12 -11
- package/lib/engine/apps/app.d.ts +11 -22
- package/lib/engine/apps/app.js +9 -9
- package/lib/engine/apps/inline.app.d.ts +9 -8
- package/lib/engine/apps/inline.app.js +24 -24
- package/lib/engine/apps/monolyth/monolyth.app.d.ts +5 -5
- package/lib/engine/apps/monolyth/monolyth.app.js +6 -6
- package/lib/engine/apps/service.d.ts +30 -0
- package/lib/engine/apps/service.js +15 -0
- package/lib/engine/auth/authn.d.ts +10 -1
- package/lib/engine/auth/zero.authn_provider.d.ts +7 -3
- package/lib/engine/auth/zero.authn_provider.js +9 -2
- package/lib/engine/cli/cli.d.ts +2 -2
- package/lib/engine/cli/cli.js +1 -1
- package/lib/engine/cli/ui.js +1 -1
- package/lib/engine/daemon.d.ts +12 -12
- package/lib/engine/daemon.js +18 -18
- package/lib/engine/data/duration.d.ts +53 -0
- package/lib/engine/data/duration.js +62 -0
- package/lib/engine/data/error.d.ts +7 -0
- package/lib/engine/data/error.js +9 -1
- package/lib/engine/dependency.d.ts +2 -1
- package/lib/engine/dependency.js +18 -0
- package/lib/engine/module.d.ts +6 -4
- package/lib/engine/module.js +25 -10
- package/lib/engine/transaction/nodes/bucket.trx_node.js +1 -2
- package/lib/engine/transaction/nodes/bucket_query.trx_node.js +5 -10
- package/lib/engine/transaction/nodes/job.trx_node.js +2 -4
- package/lib/engine/transaction/nodes/machine.trx_node.js +2 -4
- package/lib/engine/transaction/nodes/queue.trx_node.js +1 -2
- package/lib/engine/transaction/nodes/resource.trx_node.js +2 -4
- package/lib/engine/transaction/trx.d.ts +6 -4
- package/lib/engine/transaction/trx.js +2 -1
- package/lib/engine/transaction/trx_engine.config.d.ts +2 -2
- package/lib/engine/transaction/trx_engine.d.ts +4 -3
- package/lib/engine/transaction/trx_engine.js +20 -17
- package/lib/engine/transaction/trx_node.d.ts +4 -2
- package/lib/engine/transaction/trx_node.js +13 -1
- package/lib/engine/tree.js +6 -17
- package/lib/engine/util/i18n.js +3 -3
- package/lib/engine/util/parse.d.ts +5 -0
- package/lib/engine/util/parse.js +10 -0
- package/lib/schema.d.ts +1 -1
- package/package.json +2 -3
- package/tools/joaquin/job.js +2 -2
- package/tools/joaquin/message.js +2 -2
- package/tools/joaquin/mock.d.ts +6 -6
- package/tsconfig.build.tsbuildinfo +1 -1
- package/lib/adapters/postgres/src/migrator/csv.d.ts +0 -7
- package/lib/adapters/postgres/src/migrator/csv.js +0 -72
- package/lib/adapters/postgres/src/migrator/database.d.ts +0 -34
- package/lib/adapters/postgres/src/migrator/database.js +0 -88
- package/lib/adapters/postgres/src/migrator/generator/generator.d.ts +0 -22
- package/lib/adapters/postgres/src/migrator/generator/generator.js +0 -326
- package/lib/adapters/postgres/src/migrator/generator/migration.d.ts +0 -66
- package/lib/adapters/postgres/src/migrator/generator/migration.js +0 -249
- package/lib/adapters/postgres/src/migrator/generator/provider.d.ts +0 -19
- package/lib/adapters/postgres/src/migrator/generator/provider.js +0 -74
- package/lib/adapters/postgres/src/migrator/index.d.ts +0 -47
- package/lib/adapters/postgres/src/migrator/index.js +0 -22
- package/lib/adapters/postgres/src/migrator/runner/runner.d.ts +0 -17
- package/lib/adapters/postgres/src/migrator/runner/runner.js +0 -249
- package/lib/adapters/postgres/src/migrator/runner/status.d.ts +0 -17
- package/lib/adapters/postgres/src/migrator/runner/status.js +0 -55
- package/lib/adapters/postgres/src/postgres.bucket_adapter.d.ts +0 -42
- package/lib/adapters/postgres/src/postgres.bucket_adapter.js +0 -294
- package/lib/adapters/postgres/src/postgres.cli.d.ts +0 -76
- package/lib/adapters/postgres/src/postgres.cli.js +0 -207
- package/lib/adapters/postgres/src/postgres.config.d.ts +0 -5
- package/lib/adapters/postgres/src/postgres.config.js +0 -2
- package/lib/adapters/postgres/src/postgres.nql.d.ts +0 -16
- package/lib/adapters/postgres/src/postgres.nql.js +0 -123
- package/lib/adapters/postgres/src/postgres.provider.d.ts +0 -18
- package/lib/adapters/postgres/src/postgres.provider.js +0 -77
- package/lib/adapters/postgres/test/postgres.bucket_adapter.test.d.ts +0 -1
- package/lib/adapters/postgres/test/postgres.bucket_adapter.test.js +0 -210
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.PostgresCLI = exports.cmd_import_csv = exports.cmd_query = exports.cmd_migrate_one_down = exports.cmd_migrate_down = exports.cmd_migrate_one_up = exports.cmd_migrate_up = exports.cmd_make_migrations = exports.cmd_make_empty_migration = exports.cmd_status = exports.cmd_create_db = exports.cmd_tables = exports.cmd_check = void 0;
|
|
7
|
-
const cli_adapter_1 = require("../../../engine/cli/cli_adapter");
|
|
8
|
-
const database_1 = require("./migrator/database");
|
|
9
|
-
const provider_1 = require("./migrator/generator/provider");
|
|
10
|
-
const ui_1 = __importDefault(require("../../../engine/cli/ui"));
|
|
11
|
-
const daemon_1 = require("../../../engine/daemon");
|
|
12
|
-
const postgres_bucket_adapter_1 = require("./postgres.bucket_adapter");
|
|
13
|
-
const csv_1 = require("./migrator/csv");
|
|
14
|
-
const runner_1 = require("./migrator/runner/runner");
|
|
15
|
-
const migration_1 = require("./migrator/generator/migration");
|
|
16
|
-
class cmd_check extends cli_adapter_1.CLICommand {
|
|
17
|
-
constructor(provider) {
|
|
18
|
-
super('any', 'check', 'check', 'Check if the connection to PostgreSQL is working properly');
|
|
19
|
-
this.provider = provider;
|
|
20
|
-
}
|
|
21
|
-
async run(daemon) {
|
|
22
|
-
const res = await database_1.Database.checkConnection(this.provider.sql);
|
|
23
|
-
if (res == true)
|
|
24
|
-
ui_1.default.result('ok', 'Connection to PostgreSQL working.');
|
|
25
|
-
else
|
|
26
|
-
ui_1.default.result('error', 'Connection to PostgreSQL not working.', res);
|
|
27
|
-
await provider_1.MigrationProvider.create(daemon, this.provider.sql);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
exports.cmd_check = cmd_check;
|
|
31
|
-
class cmd_tables extends cli_adapter_1.CLICommand {
|
|
32
|
-
constructor(provider) {
|
|
33
|
-
super('any', 'tables', 'tables', 'List the tables present on the database');
|
|
34
|
-
this.provider = provider;
|
|
35
|
-
}
|
|
36
|
-
async run() {
|
|
37
|
-
const res = await database_1.Database.listTables(this.provider.sql);
|
|
38
|
-
ui_1.default.list(res);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
exports.cmd_tables = cmd_tables;
|
|
42
|
-
class cmd_create_db extends cli_adapter_1.CLICommand {
|
|
43
|
-
constructor(provider) {
|
|
44
|
-
super('any', 'create db', 'create db( NAME)', 'Create the database used by the application', /(\w*)/, ['name']);
|
|
45
|
-
this.provider = provider;
|
|
46
|
-
}
|
|
47
|
-
async run(daemon, $) {
|
|
48
|
-
let name = $.name;
|
|
49
|
-
const config = this.provider.config?.connection;
|
|
50
|
-
if (!name) {
|
|
51
|
-
if (!config?.db) {
|
|
52
|
-
ui_1.default.result('error', 'Database name not configured on PostgresConfig used', config);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
name = config.db;
|
|
56
|
-
}
|
|
57
|
-
try {
|
|
58
|
-
await database_1.Database.createDatabase(name, config);
|
|
59
|
-
ui_1.default.result('ok', `Database ${name} created`);
|
|
60
|
-
}
|
|
61
|
-
catch (e) {
|
|
62
|
-
ui_1.default.result('error', `Failed to create database ${name}`, e);
|
|
63
|
-
}
|
|
64
|
-
await provider_1.MigrationProvider.create(daemon, this.provider.sql);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
exports.cmd_create_db = cmd_create_db;
|
|
68
|
-
class cmd_status extends cli_adapter_1.CLICommand {
|
|
69
|
-
constructor(provider) {
|
|
70
|
-
super('any', 'status', 'status', 'Show the status of migrations on the current database');
|
|
71
|
-
this.provider = provider;
|
|
72
|
-
}
|
|
73
|
-
async run(daemon) {
|
|
74
|
-
const migrator = await provider_1.MigrationProvider.create(daemon, this.provider.sql);
|
|
75
|
-
console.log(migrator.status.describe());
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
exports.cmd_status = cmd_status;
|
|
79
|
-
class cmd_make_empty_migration extends cli_adapter_1.CLICommand {
|
|
80
|
-
constructor(cli, provider) {
|
|
81
|
-
super('any', 'make empty migration', 'make empty migration( NAME)', 'Generate an empty migration to be filled by the user', /(\w*)/, ['name']);
|
|
82
|
-
this.cli = cli;
|
|
83
|
-
this.provider = provider;
|
|
84
|
-
}
|
|
85
|
-
async run(daemon, $) {
|
|
86
|
-
const module = await ui_1.default.select('Pick a module to create the migration into:', daemon_1.Daemon.getModules(daemon).map(m => m.name));
|
|
87
|
-
const name = $.name || await ui_1.default.question('Migration name');
|
|
88
|
-
const migration = migration_1.$Migration.empty(module.value, name);
|
|
89
|
-
const filepath = migration.save();
|
|
90
|
-
this.cli.openEditor(filepath);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
exports.cmd_make_empty_migration = cmd_make_empty_migration;
|
|
94
|
-
class cmd_make_migrations extends cli_adapter_1.CLICommand {
|
|
95
|
-
constructor(provider) {
|
|
96
|
-
super('any', 'make migrations', 'make migrations( TAG)', 'Generate migrations for the bucket(s) using PostgresBucketAdapter', /(\w*)/, ['tag']);
|
|
97
|
-
this.provider = provider;
|
|
98
|
-
}
|
|
99
|
-
async run(daemon, $) {
|
|
100
|
-
console.clear();
|
|
101
|
-
// TODO: restrict by tag
|
|
102
|
-
const migrator = await provider_1.MigrationProvider.create(daemon, this.provider.sql);
|
|
103
|
-
const migrations = await migrator.generate();
|
|
104
|
-
for (const migration of migrations) {
|
|
105
|
-
migration.save();
|
|
106
|
-
}
|
|
107
|
-
await runner_1.MigrationRunner.up(daemon, this.provider.sql, 'batch');
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
exports.cmd_make_migrations = cmd_make_migrations;
|
|
111
|
-
class cmd_migrate_up extends cli_adapter_1.CLICommand {
|
|
112
|
-
constructor(provider) {
|
|
113
|
-
super('any', 'migrate up', 'migrate up', 'Run ALL the pending migrations up (batch)');
|
|
114
|
-
this.provider = provider;
|
|
115
|
-
}
|
|
116
|
-
async run(daemon) {
|
|
117
|
-
console.clear();
|
|
118
|
-
await runner_1.MigrationRunner.up(daemon, this.provider.sql, 'batch');
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
exports.cmd_migrate_up = cmd_migrate_up;
|
|
122
|
-
class cmd_migrate_one_up extends cli_adapter_1.CLICommand {
|
|
123
|
-
constructor(provider) {
|
|
124
|
-
super('any', 'migrate one up', 'migrate one up', 'Run ONE pending migration up');
|
|
125
|
-
this.provider = provider;
|
|
126
|
-
}
|
|
127
|
-
async run(daemon) {
|
|
128
|
-
console.clear();
|
|
129
|
-
await runner_1.MigrationRunner.up(daemon, this.provider.sql, 'one');
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
exports.cmd_migrate_one_up = cmd_migrate_one_up;
|
|
133
|
-
class cmd_migrate_down extends cli_adapter_1.CLICommand {
|
|
134
|
-
constructor(provider) {
|
|
135
|
-
super('any', 'migrate down', 'migrate down', 'Rollback the last batch of migrations');
|
|
136
|
-
this.provider = provider;
|
|
137
|
-
}
|
|
138
|
-
async run(daemon) {
|
|
139
|
-
console.clear();
|
|
140
|
-
await runner_1.MigrationRunner.down(daemon, this.provider.sql, 'batch');
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
exports.cmd_migrate_down = cmd_migrate_down;
|
|
144
|
-
class cmd_migrate_one_down extends cli_adapter_1.CLICommand {
|
|
145
|
-
constructor(provider) {
|
|
146
|
-
super('any', 'migrate one down', 'migrate one down', 'Rollback the last migration');
|
|
147
|
-
this.provider = provider;
|
|
148
|
-
}
|
|
149
|
-
async run(daemon) {
|
|
150
|
-
console.clear();
|
|
151
|
-
await runner_1.MigrationRunner.down(daemon, this.provider.sql, 'one');
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
exports.cmd_migrate_one_down = cmd_migrate_one_down;
|
|
155
|
-
class cmd_query extends cli_adapter_1.CLICommand {
|
|
156
|
-
constructor(provider) {
|
|
157
|
-
super('any', 'query', 'query', 'Run a SQL query on the database server');
|
|
158
|
-
this.provider = provider;
|
|
159
|
-
}
|
|
160
|
-
async run() {
|
|
161
|
-
const query = await ui_1.default.question('SQL');
|
|
162
|
-
const res = await this.provider.sql.unsafe(query);
|
|
163
|
-
console.log(res);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
exports.cmd_query = cmd_query;
|
|
167
|
-
class cmd_import_csv extends cli_adapter_1.CLICommand {
|
|
168
|
-
constructor(provider) {
|
|
169
|
-
super('any', 'import csv', 'import csv PATH', 'Run a SQL query on the database server', /(.+)/, ['path']);
|
|
170
|
-
this.provider = provider;
|
|
171
|
-
}
|
|
172
|
-
async run(daemon, input) {
|
|
173
|
-
const buckets = daemon_1.Daemon.getModules(daemon)
|
|
174
|
-
.map(module => Object.values(module.buckets)
|
|
175
|
-
.filter(bucket => bucket.adapter instanceof postgres_bucket_adapter_1.PostgresBucketAdapter)
|
|
176
|
-
.map(bucket => ({
|
|
177
|
-
name: `${module.name}::${bucket.schema.name}`,
|
|
178
|
-
tableName: bucket.adapter.tableName
|
|
179
|
-
})))
|
|
180
|
-
.flat(1);
|
|
181
|
-
const bucket = await ui_1.default.select('Bucket', buckets, b => b.name);
|
|
182
|
-
await csv_1.CSV.import(this.provider.sql, bucket.value.tableName, input.path);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
exports.cmd_import_csv = cmd_import_csv;
|
|
186
|
-
class PostgresCLI extends cli_adapter_1.CLIAdapter {
|
|
187
|
-
constructor(cli, provider) {
|
|
188
|
-
super(cli);
|
|
189
|
-
this.cli = cli;
|
|
190
|
-
this.provider = provider;
|
|
191
|
-
this.commands = {
|
|
192
|
-
'check': new cmd_check(provider),
|
|
193
|
-
'tables': new cmd_tables(provider),
|
|
194
|
-
'create db': new cmd_create_db(provider),
|
|
195
|
-
'status': new cmd_status(provider),
|
|
196
|
-
'make migrations': new cmd_make_migrations(provider),
|
|
197
|
-
'make empty migration': new cmd_make_empty_migration(cli, provider),
|
|
198
|
-
'migrate up': new cmd_migrate_up(provider),
|
|
199
|
-
'migrate one up': new cmd_migrate_one_up(provider),
|
|
200
|
-
'migrate down': new cmd_migrate_down(provider),
|
|
201
|
-
'migrate one down': new cmd_migrate_one_down(provider),
|
|
202
|
-
'query': new cmd_query(provider),
|
|
203
|
-
'import csv': new cmd_import_csv(provider),
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
exports.PostgresCLI = PostgresCLI;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { AnyTrxNode } from "../../../engine/transaction/trx_node";
|
|
2
|
-
import { NQLRunner } from "../../../elements/entities/bucket/query/nql_engine";
|
|
3
|
-
import { NQL_Pagination, NQL_Part } from "../../../elements/entities/bucket/query/nql.schema";
|
|
4
|
-
import postgres from 'postgres';
|
|
5
|
-
type Obj = Record<string, any>;
|
|
6
|
-
export declare class PostgresNQLRunner extends NQLRunner {
|
|
7
|
-
protected sql?: postgres.Sql<any>;
|
|
8
|
-
constructor();
|
|
9
|
-
run(trx: AnyTrxNode, part: NQL_Part, params: Obj, pagination?: NQL_Pagination): Promise<{
|
|
10
|
-
data: Obj[];
|
|
11
|
-
count: number | undefined;
|
|
12
|
-
page: number | undefined;
|
|
13
|
-
perPage: number | undefined;
|
|
14
|
-
}>;
|
|
15
|
-
}
|
|
16
|
-
export {};
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PostgresNQLRunner = void 0;
|
|
4
|
-
const nql_engine_1 = require("../../../elements/entities/bucket/query/nql_engine");
|
|
5
|
-
const trx_1 = require("../../../engine/transaction/trx");
|
|
6
|
-
const postgres_bucket_adapter_1 = require("./postgres.bucket_adapter");
|
|
7
|
-
const log_1 = require("../../../engine/util/log");
|
|
8
|
-
class PostgresNQLRunner extends nql_engine_1.NQLRunner {
|
|
9
|
-
constructor() {
|
|
10
|
-
super();
|
|
11
|
-
}
|
|
12
|
-
async run(trx, part, params, pagination) {
|
|
13
|
-
const sql = trx_1.Trx.get(trx, 'sql');
|
|
14
|
-
const { tableName, meta } = postgres_bucket_adapter_1.PostgresBucketAdapter.getTableMeta(trx, part.union.meta);
|
|
15
|
-
const sql_params = [];
|
|
16
|
-
const _sql = (part) => {
|
|
17
|
-
let where = _union(part.union);
|
|
18
|
-
if (where) {
|
|
19
|
-
where = 'WHERE ' + where;
|
|
20
|
-
}
|
|
21
|
-
const sql_str = `FROM ${tableName} ${where}`;
|
|
22
|
-
return sql_str;
|
|
23
|
-
};
|
|
24
|
-
const _union = (union) => {
|
|
25
|
-
const inters = union.inters.map(i => _inter(i)).filter(r => !!r).join(' OR ');
|
|
26
|
-
if (!inters)
|
|
27
|
-
return '';
|
|
28
|
-
return `(${inters})`;
|
|
29
|
-
};
|
|
30
|
-
const _inter = (inter) => {
|
|
31
|
-
const rules = inter.rules.map(r => (('value' in r) ? _rule(r) : _union(r))).filter(r => !!r).join(' AND ');
|
|
32
|
-
if (!rules)
|
|
33
|
-
return '';
|
|
34
|
-
return `(${rules})`;
|
|
35
|
-
};
|
|
36
|
-
const _rule = (rule) => {
|
|
37
|
-
// Replace '.' of fieldpath with '->' (JSONB compatible)
|
|
38
|
-
let column = rule.fieldpath.replace(/\./g, '->');
|
|
39
|
-
// TODO: handle '.#'
|
|
40
|
-
// Special case: "present" operation
|
|
41
|
-
if (rule.op === 'present') {
|
|
42
|
-
if (rule.not) {
|
|
43
|
-
return `"${column}" IS NULL`;
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
return `"${column}" IS NOT NULL`;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// Fetch value
|
|
50
|
-
let value;
|
|
51
|
-
if ('static' in rule.value) {
|
|
52
|
-
value = rule.value.static;
|
|
53
|
-
}
|
|
54
|
-
else if ('param' in rule.value) {
|
|
55
|
-
value = params[rule.value.param]; // TODO: deal with param[]
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
throw new Error('Sub-queries not implemented yet.'); // TODO: subquery
|
|
59
|
-
}
|
|
60
|
-
// Don't add condition if value is null
|
|
61
|
-
if (value === undefined) {
|
|
62
|
-
return '';
|
|
63
|
-
}
|
|
64
|
-
// Translate operation
|
|
65
|
-
let op = {
|
|
66
|
-
'==': '=',
|
|
67
|
-
'<': '<',
|
|
68
|
-
'>': '>',
|
|
69
|
-
'<=': '<=',
|
|
70
|
-
'>=': '>=',
|
|
71
|
-
'in': 'IN',
|
|
72
|
-
'contains': 'LIKE',
|
|
73
|
-
'contains_any': '' // TODO
|
|
74
|
-
}[rule.op];
|
|
75
|
-
// Apply case insensitive modifier
|
|
76
|
-
if (rule.case_i) {
|
|
77
|
-
if (rule.op === '==') {
|
|
78
|
-
column = `LOWER(${column})`;
|
|
79
|
-
}
|
|
80
|
-
else if (rule.op === 'contains') {
|
|
81
|
-
op = 'ILIKE';
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
// Special case: "contains" operation
|
|
85
|
-
if (rule.op === 'contains') {
|
|
86
|
-
value = `%${value}%`;
|
|
87
|
-
}
|
|
88
|
-
sql_params.push(value);
|
|
89
|
-
return `${rule.not ? 'NOT ' : ''} "${column}" ${op} $${sql_params.length}`;
|
|
90
|
-
};
|
|
91
|
-
// Debug
|
|
92
|
-
// const str = await _sql(part).describe().catch(e => {
|
|
93
|
-
// Log.error('postgres' as any, 'nql', e.query, e);
|
|
94
|
-
// })
|
|
95
|
-
// console.log((str as any).string);
|
|
96
|
-
// End of Debug
|
|
97
|
-
const sql_str = await _sql(part);
|
|
98
|
-
const order = part.union.order;
|
|
99
|
-
const order_str = `ORDER BY ${order?.by || meta.updated_at} ${order?.dir === 'asc' ? 'ASC' : 'DESC'}`;
|
|
100
|
-
let limit_str = '';
|
|
101
|
-
if (pagination?.page || pagination?.perPage) {
|
|
102
|
-
const limit = pagination.perPage || 10;
|
|
103
|
-
const offset = ((pagination.page || 1) - 1) * limit;
|
|
104
|
-
limit_str = `OFFSET ${offset} LIMIT ${limit}`;
|
|
105
|
-
}
|
|
106
|
-
let count = undefined;
|
|
107
|
-
if (pagination?.count) {
|
|
108
|
-
const res_count = await sql.unsafe(`SELECT count(*) ${sql_str}`, sql_params);
|
|
109
|
-
count = parseInt(res_count[0].count);
|
|
110
|
-
}
|
|
111
|
-
const data = await sql.unsafe(`SELECT * ${sql_str} ${order_str} ${limit_str}`, sql_params).catch(e => {
|
|
112
|
-
log_1.Log.error('bucket', 'postgres', e.toString(), e);
|
|
113
|
-
throw new Error('Database error.');
|
|
114
|
-
});
|
|
115
|
-
return {
|
|
116
|
-
data,
|
|
117
|
-
count,
|
|
118
|
-
page: pagination?.page,
|
|
119
|
-
perPage: pagination?.perPage,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
exports.PostgresNQLRunner = PostgresNQLRunner;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import postgres from 'postgres';
|
|
2
|
-
import { PostgresNQLRunner } from './postgres.nql';
|
|
3
|
-
import { AnyTrx } from "../../../engine/transaction/trx";
|
|
4
|
-
import { TrxEngineWrapFn } from "../../../engine/transaction/trx_engine.config";
|
|
5
|
-
import { PostgresConfig } from './postgres.config';
|
|
6
|
-
export declare class PostgresProvider {
|
|
7
|
-
config?: PostgresConfig | undefined;
|
|
8
|
-
static make<Name extends string>(name: Name, config?: PostgresConfig): {
|
|
9
|
-
name: Name;
|
|
10
|
-
libPaths: string[];
|
|
11
|
-
up: () => PostgresProvider;
|
|
12
|
-
down: () => void;
|
|
13
|
-
};
|
|
14
|
-
sql: postgres.Sql<any>;
|
|
15
|
-
nql: PostgresNQLRunner;
|
|
16
|
-
private constructor();
|
|
17
|
-
static wrap(provider: string): (trx: AnyTrx, fn: TrxEngineWrapFn<any, any>, providers: Record<string, any>) => Promise<import("../../../engine/transaction/trx_node").TrxNodeStatus>;
|
|
18
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PostgresProvider = void 0;
|
|
4
|
-
const log_1 = require("../../../engine/util/log");
|
|
5
|
-
const date_1 = require("../../../engine/data/date");
|
|
6
|
-
const datetime_1 = require("../../../engine/data/datetime");
|
|
7
|
-
const decimal_1 = require("../../../engine/data/decimal");
|
|
8
|
-
const postgres_nql_1 = require("./postgres.nql");
|
|
9
|
-
const trx_1 = require("../../../engine/transaction/trx");
|
|
10
|
-
const database_1 = require("./migrator/database");
|
|
11
|
-
class PostgresProvider {
|
|
12
|
-
static make(name, config) {
|
|
13
|
-
return {
|
|
14
|
-
name: name,
|
|
15
|
-
libPaths: [
|
|
16
|
-
'modules/*/migrations'
|
|
17
|
-
],
|
|
18
|
-
up: () => new PostgresProvider(config),
|
|
19
|
-
down: () => { }
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
constructor(config) {
|
|
23
|
-
this.config = config;
|
|
24
|
-
log_1.Log.info('postgres', 'provider', 'Connecting to Postgres database');
|
|
25
|
-
this.sql = database_1.Database.connect({
|
|
26
|
-
...(config?.connection || {}),
|
|
27
|
-
debug: true,
|
|
28
|
-
types: {
|
|
29
|
-
char: {
|
|
30
|
-
to: 1042,
|
|
31
|
-
from: [1042],
|
|
32
|
-
serialize: (val) => val?.trim?.(),
|
|
33
|
-
parse: (val) => val?.trim?.()
|
|
34
|
-
},
|
|
35
|
-
date: {
|
|
36
|
-
to: 1082,
|
|
37
|
-
from: [1082],
|
|
38
|
-
serialize: (val) => val?.toISO(),
|
|
39
|
-
parse: (val) => val ? date_1.NesoiDate.fromISO(val) : undefined
|
|
40
|
-
},
|
|
41
|
-
datetime: {
|
|
42
|
-
to: 1114,
|
|
43
|
-
from: [1114],
|
|
44
|
-
serialize: (val) => typeof val === 'string'
|
|
45
|
-
? val
|
|
46
|
-
: val?.toISO(),
|
|
47
|
-
parse: (val) => datetime_1.NesoiDatetime.fromISO(val?.replace(' ', 'T') + 'Z')
|
|
48
|
-
},
|
|
49
|
-
datetime_z: {
|
|
50
|
-
to: 1184,
|
|
51
|
-
from: [1184],
|
|
52
|
-
serialize: (val) => typeof val === 'string'
|
|
53
|
-
? val
|
|
54
|
-
: val?.toISO(),
|
|
55
|
-
parse: (val) => datetime_1.NesoiDatetime.fromISO(val?.replace(' ', 'T') + 'Z')
|
|
56
|
-
},
|
|
57
|
-
decimal: {
|
|
58
|
-
to: 1700,
|
|
59
|
-
from: [1700],
|
|
60
|
-
serialize: (val) => val?.toString(),
|
|
61
|
-
parse: (val) => val ? new decimal_1.NesoiDecimal(val) : undefined
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
this.nql = new postgres_nql_1.PostgresNQLRunner();
|
|
66
|
-
}
|
|
67
|
-
static wrap(provider) {
|
|
68
|
-
return (trx, fn, providers) => {
|
|
69
|
-
const postgres = providers[provider].sql;
|
|
70
|
-
return postgres.begin(sql => {
|
|
71
|
-
trx_1.Trx.set(trx.root, 'sql', sql);
|
|
72
|
-
return fn(trx.root);
|
|
73
|
-
});
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
exports.PostgresProvider = PostgresProvider;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const mock_1 = require("../../../../tools/joaquin/mock");
|
|
4
|
-
const bucket_builder_1 = require("../../../elements/entities/bucket/bucket.builder");
|
|
5
|
-
const log_1 = require("../../../engine/util/log");
|
|
6
|
-
const inline_app_1 = require("../../../engine/apps/inline.app");
|
|
7
|
-
const postgres_provider_1 = require("../src/postgres.provider");
|
|
8
|
-
const postgres_bucket_adapter_1 = require("../src/postgres.bucket_adapter");
|
|
9
|
-
const datetime_1 = require("../../../engine/data/datetime");
|
|
10
|
-
const provider_1 = require("../src/migrator/generator/provider");
|
|
11
|
-
const runner_1 = require("../src/migrator/runner/runner");
|
|
12
|
-
log_1.Log.level = 'warn';
|
|
13
|
-
// TODO: read this from env
|
|
14
|
-
const PostgresConfig = {
|
|
15
|
-
meta: {
|
|
16
|
-
created_at: 'created_at',
|
|
17
|
-
created_by: 'created_by',
|
|
18
|
-
updated_at: 'updated_at',
|
|
19
|
-
updated_by: 'updated_by',
|
|
20
|
-
},
|
|
21
|
-
connection: {
|
|
22
|
-
host: 'localhost',
|
|
23
|
-
port: 5432,
|
|
24
|
-
user: 'postgres',
|
|
25
|
-
pass: 'postgres',
|
|
26
|
-
db: 'NESOI_TEST',
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
let daemon;
|
|
30
|
-
async function setup() {
|
|
31
|
-
if (daemon) {
|
|
32
|
-
return daemon;
|
|
33
|
-
}
|
|
34
|
-
// Build bucket used for test
|
|
35
|
-
const bucket = new bucket_builder_1.BucketBuilder('MODULE', 'BUCKET')
|
|
36
|
-
.model($ => ({
|
|
37
|
-
id: $.int,
|
|
38
|
-
p_boolean: $.boolean,
|
|
39
|
-
p_date: $.date,
|
|
40
|
-
p_datetime: $.datetime,
|
|
41
|
-
p_decimal: $.decimal(),
|
|
42
|
-
p_enum: $.enum(['a', 'b', 'c']),
|
|
43
|
-
p_int: $.int,
|
|
44
|
-
p_float: $.float,
|
|
45
|
-
p_string: $.string,
|
|
46
|
-
p_obj: $.obj({
|
|
47
|
-
a: $.int,
|
|
48
|
-
b: $.string
|
|
49
|
-
}),
|
|
50
|
-
p_dict: $.dict($.boolean)
|
|
51
|
-
}));
|
|
52
|
-
// Build test app
|
|
53
|
-
const app = new inline_app_1.InlineApp('RUNTIME', [
|
|
54
|
-
bucket
|
|
55
|
-
])
|
|
56
|
-
.provider(postgres_provider_1.PostgresProvider.make('pg', PostgresConfig))
|
|
57
|
-
.config.buckets({
|
|
58
|
-
'MODULE': {
|
|
59
|
-
'BUCKET': {
|
|
60
|
-
adapter: ($, { pg }) => new postgres_bucket_adapter_1.PostgresBucketAdapter($, pg, 'nesoi_test_table')
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
})
|
|
64
|
-
.config.trx({
|
|
65
|
-
'MODULE': {
|
|
66
|
-
wrap: postgres_provider_1.PostgresProvider.wrap('pg')
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
// Run test daemon
|
|
70
|
-
daemon = await app.daemon();
|
|
71
|
-
// Prepare database using daemon
|
|
72
|
-
// TODO: encapsulate this
|
|
73
|
-
// await Database.createDatabase('NESOI_TEST', PostgresConfig.connection, { if_exists: 'delete' });
|
|
74
|
-
const pg = postgres_provider_1.PostgresProvider.make('pg', PostgresConfig).up();
|
|
75
|
-
const migrator = await provider_1.MigrationProvider.create(daemon, pg.sql);
|
|
76
|
-
const migration = await migrator.generateForBucket('MODULE', 'BUCKET', 'nesoi_test_table');
|
|
77
|
-
if (migration) {
|
|
78
|
-
migration.name = 'postgres.bucket_adapter.test';
|
|
79
|
-
await runner_1.MigrationRunner.fromSchema.up(daemon, pg.sql, migration);
|
|
80
|
-
}
|
|
81
|
-
// migration?.save();
|
|
82
|
-
// await MigrationRunner.up(daemon, 'one', PostgresConfig);
|
|
83
|
-
return daemon;
|
|
84
|
-
}
|
|
85
|
-
const mock = new mock_1.Mock();
|
|
86
|
-
beforeAll(async () => {
|
|
87
|
-
await setup();
|
|
88
|
-
}, 30000);
|
|
89
|
-
describe('Postgres Bucket Adapter', () => {
|
|
90
|
-
// it ('!', () => {
|
|
91
|
-
// expect(1+1).toEqual(2);
|
|
92
|
-
// })
|
|
93
|
-
describe('CRUD', () => {
|
|
94
|
-
it('create should return unmodified object', async () => {
|
|
95
|
-
const response = await daemon.trx('MODULE').run(async (trx) => {
|
|
96
|
-
// given
|
|
97
|
-
const BUCKET = trx.bucket('BUCKET');
|
|
98
|
-
const input = mock.bucket('MODULE', 'BUCKET')
|
|
99
|
-
.obj({ id: undefined }).raw(daemon);
|
|
100
|
-
// when
|
|
101
|
-
const created = await BUCKET.create(input);
|
|
102
|
-
return { input, created };
|
|
103
|
-
});
|
|
104
|
-
const { input, created: { id, ...obj } } = response.output;
|
|
105
|
-
// then
|
|
106
|
-
expect(id).toBeTruthy();
|
|
107
|
-
expect(obj).toEqual({
|
|
108
|
-
...input,
|
|
109
|
-
created_at: expect.any(datetime_1.NesoiDatetime),
|
|
110
|
-
updated_at: expect.any(datetime_1.NesoiDatetime),
|
|
111
|
-
created_by: null,
|
|
112
|
-
updated_by: null
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
it('read should return unmodified object after create', async () => {
|
|
116
|
-
const response = await daemon.trx('MODULE').run(async (trx) => {
|
|
117
|
-
// given
|
|
118
|
-
const BUCKET = trx.bucket('BUCKET');
|
|
119
|
-
const input = mock.bucket('MODULE', 'BUCKET')
|
|
120
|
-
.obj({ id: undefined }).raw(daemon);
|
|
121
|
-
// when
|
|
122
|
-
const created = await BUCKET.create(input);
|
|
123
|
-
const updated = await BUCKET.readOneOrFail(created.id);
|
|
124
|
-
return { input, updated };
|
|
125
|
-
});
|
|
126
|
-
const { input, updated: { id, ...obj } } = response.output;
|
|
127
|
-
// then
|
|
128
|
-
expect(id).toBeTruthy();
|
|
129
|
-
expect(obj).toEqual({
|
|
130
|
-
...input,
|
|
131
|
-
created_at: expect.any(datetime_1.NesoiDatetime),
|
|
132
|
-
updated_at: expect.any(datetime_1.NesoiDatetime),
|
|
133
|
-
created_by: null,
|
|
134
|
-
updated_by: null
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
it('update should modify object after insert', async () => {
|
|
138
|
-
const response = await daemon.trx('MODULE').run(async (trx) => {
|
|
139
|
-
// given
|
|
140
|
-
const BUCKET = trx.bucket('BUCKET');
|
|
141
|
-
const input1 = mock.bucket('MODULE', 'BUCKET')
|
|
142
|
-
.obj({ id: undefined }).raw(daemon);
|
|
143
|
-
const input2 = mock.bucket('MODULE', 'BUCKET')
|
|
144
|
-
.obj({ id: undefined }).raw(daemon);
|
|
145
|
-
// when
|
|
146
|
-
const created = await BUCKET.create(input1);
|
|
147
|
-
const updated = await BUCKET.patch({
|
|
148
|
-
...input2,
|
|
149
|
-
id: created.id
|
|
150
|
-
});
|
|
151
|
-
return { input1, input2, created, updated };
|
|
152
|
-
});
|
|
153
|
-
const { input1, input2, created: { id: id_create, ...created }, updated: { id: id_update, ...updated }, } = response.output;
|
|
154
|
-
// then
|
|
155
|
-
expect(id_create).toBeTruthy();
|
|
156
|
-
expect(id_update).toEqual(id_create);
|
|
157
|
-
expect(created).toEqual({
|
|
158
|
-
...input1,
|
|
159
|
-
created_at: expect.any(datetime_1.NesoiDatetime),
|
|
160
|
-
updated_at: expect.any(datetime_1.NesoiDatetime),
|
|
161
|
-
created_by: null,
|
|
162
|
-
updated_by: null
|
|
163
|
-
});
|
|
164
|
-
expect(updated).toEqual({
|
|
165
|
-
...input2,
|
|
166
|
-
created_at: expect.any(datetime_1.NesoiDatetime),
|
|
167
|
-
updated_at: expect.any(datetime_1.NesoiDatetime),
|
|
168
|
-
created_by: null,
|
|
169
|
-
updated_by: null
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
it('delete should remove object from database', async () => {
|
|
173
|
-
const response = await daemon.trx('MODULE').run(async (trx) => {
|
|
174
|
-
// given
|
|
175
|
-
const BUCKET = trx.bucket('BUCKET');
|
|
176
|
-
const input = mock.bucket('MODULE', 'BUCKET')
|
|
177
|
-
.obj({ id: undefined }).raw(daemon);
|
|
178
|
-
// when
|
|
179
|
-
const created = await BUCKET.create(input);
|
|
180
|
-
const read = await BUCKET.readOneOrFail(created.id);
|
|
181
|
-
await BUCKET.delete(read.id);
|
|
182
|
-
const read2 = await BUCKET.readOne(read.id);
|
|
183
|
-
return { read2 };
|
|
184
|
-
});
|
|
185
|
-
const { read2 } = response.output;
|
|
186
|
-
// then
|
|
187
|
-
expect(read2).toBeUndefined();
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
describe('Query', () => {
|
|
191
|
-
it('query first by existing id should return object', async () => {
|
|
192
|
-
const response = await daemon.trx('MODULE').run(async (trx) => {
|
|
193
|
-
// given
|
|
194
|
-
const BUCKET = trx.bucket('BUCKET');
|
|
195
|
-
const input = mock.bucket('MODULE', 'BUCKET')
|
|
196
|
-
.obj({ id: undefined }).raw(daemon);
|
|
197
|
-
// when
|
|
198
|
-
const created = await BUCKET.create(input);
|
|
199
|
-
const queried = await BUCKET.query({
|
|
200
|
-
'id': created.id
|
|
201
|
-
}).all();
|
|
202
|
-
return { queried, created };
|
|
203
|
-
});
|
|
204
|
-
const { queried, created } = response.output;
|
|
205
|
-
// then
|
|
206
|
-
expect(queried.length).toEqual(1);
|
|
207
|
-
expect(queried[0].id).toEqual(created.id);
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
});
|