primitive-admin 1.1.0-alpha.10 → 1.1.0-alpha.12
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/README.md +2 -10
- package/dist/bin/primitive.js +4 -0
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/database-types.js +427 -0
- package/dist/src/commands/database-types.js.map +1 -0
- package/dist/src/commands/databases.js +108 -280
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/group-type-configs.js +189 -0
- package/dist/src/commands/group-type-configs.js.map +1 -0
- package/dist/src/commands/groups.js +0 -66
- package/dist/src/commands/groups.js.map +1 -1
- package/dist/src/commands/rule-sets.js +110 -18
- package/dist/src/commands/rule-sets.js.map +1 -1
- package/dist/src/commands/workflows.js +11 -3
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/api-client.js +70 -28
- package/dist/src/lib/api-client.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -283,14 +283,7 @@ primitive databases permissions grant <database-id> --user-id <uid> --permission
|
|
|
283
283
|
primitive databases permissions revoke <database-id> <user-id> [app-id]
|
|
284
284
|
```
|
|
285
285
|
|
|
286
|
-
|
|
287
|
-
```bash
|
|
288
|
-
primitive databases group-permissions list <database-id>
|
|
289
|
-
primitive databases group-permissions grant <database-id> --group-type <type> --group-id <id> --permission <perm>
|
|
290
|
-
primitive databases group-permissions revoke <database-id> <group-type> <group-id>
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
Permission values: `owner`, `read-write`, `reader`
|
|
286
|
+
Permission values: `owner` (set at creation), `manager`
|
|
294
287
|
|
|
295
288
|
### Documents
|
|
296
289
|
|
|
@@ -336,11 +329,10 @@ primitive groups memberships <user-id> [app-id] # List user's group mem
|
|
|
336
329
|
|
|
337
330
|
**Group resource access:**
|
|
338
331
|
```bash
|
|
339
|
-
primitive groups databases <group-type> <group-id> # List databases a group can access
|
|
340
332
|
primitive groups documents <group-type> <group-id> # List documents a group can access
|
|
341
333
|
```
|
|
342
334
|
|
|
343
|
-
Group permissions on
|
|
335
|
+
Group permissions on documents are managed via `primitive documents group-permissions` (see [Documents](#documents) above).
|
|
344
336
|
|
|
345
337
|
### Analytics
|
|
346
338
|
|
package/dist/bin/primitive.js
CHANGED
|
@@ -21,6 +21,8 @@ import { registerTokensCommands } from "../src/commands/tokens.js";
|
|
|
21
21
|
import { registerDatabasesCommands } from "../src/commands/databases.js";
|
|
22
22
|
import { registerGroupsCommands } from "../src/commands/groups.js";
|
|
23
23
|
import { registerRuleSetsCommands } from "../src/commands/rule-sets.js";
|
|
24
|
+
import { registerGroupTypeConfigsCommands } from "../src/commands/group-type-configs.js";
|
|
25
|
+
import { registerDatabaseTypesCommands } from "../src/commands/database-types.js";
|
|
24
26
|
import { registerGuidesCommands } from "../src/commands/guides.js";
|
|
25
27
|
import { registerDocumentsCommands } from "../src/commands/documents.js";
|
|
26
28
|
import { error } from "../src/lib/output.js";
|
|
@@ -73,6 +75,8 @@ registerTokensCommands(program);
|
|
|
73
75
|
registerDatabasesCommands(program);
|
|
74
76
|
registerGroupsCommands(program);
|
|
75
77
|
registerRuleSetsCommands(program);
|
|
78
|
+
registerGroupTypeConfigsCommands(program);
|
|
79
|
+
registerDatabaseTypesCommands(program);
|
|
76
80
|
registerGuidesCommands(program);
|
|
77
81
|
registerDocumentsCommands(program);
|
|
78
82
|
// Global error handler
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { ApiClient } from "../lib/api-client.js";
|
|
2
|
+
import { getCurrentAppId } from "../lib/config.js";
|
|
3
|
+
import { success, error, info, keyValue, formatTable, formatId, formatDate, json, } from "../lib/output.js";
|
|
4
|
+
function resolveAppId(appId, options) {
|
|
5
|
+
const resolved = appId || options.app || getCurrentAppId();
|
|
6
|
+
if (!resolved) {
|
|
7
|
+
error("No app specified. Use <app-id>, --app, or 'primitive use <app-id>' to set context.");
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
return resolved;
|
|
11
|
+
}
|
|
12
|
+
export function registerDatabaseTypesCommands(program) {
|
|
13
|
+
const dbTypes = program
|
|
14
|
+
.command("database-types")
|
|
15
|
+
.description("Manage database type configurations and operations")
|
|
16
|
+
.addHelpText("after", `
|
|
17
|
+
Examples:
|
|
18
|
+
$ primitive database-types list
|
|
19
|
+
$ primitive database-types get <database-type>
|
|
20
|
+
$ primitive database-types create <database-type>
|
|
21
|
+
$ primitive database-types update <database-type> --rule-set-id <id>
|
|
22
|
+
$ primitive database-types delete <database-type>
|
|
23
|
+
$ primitive database-types operations list <database-type>
|
|
24
|
+
$ primitive database-types operations create <database-type> <name> --type query --model Task --access true --definition '{"filter":{}}'
|
|
25
|
+
`);
|
|
26
|
+
// List type configs
|
|
27
|
+
dbTypes
|
|
28
|
+
.command("list")
|
|
29
|
+
.description("List database type configurations")
|
|
30
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
31
|
+
.option("--app <app-id>", "App ID")
|
|
32
|
+
.option("--json", "Output as JSON")
|
|
33
|
+
.action(async (appId, options) => {
|
|
34
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
35
|
+
const client = new ApiClient();
|
|
36
|
+
try {
|
|
37
|
+
const result = await client.listDatabaseTypeConfigs(resolvedAppId);
|
|
38
|
+
const list = Array.isArray(result) ? result : [];
|
|
39
|
+
if (options.json) {
|
|
40
|
+
json(list);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (list.length === 0) {
|
|
44
|
+
info("No database type configurations found.");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
console.log(formatTable(list, [
|
|
48
|
+
{ header: "TYPE", key: "databaseType" },
|
|
49
|
+
{ header: "RULE SET ID", key: "ruleSetId", format: (v) => v ? formatId(v) : "—" },
|
|
50
|
+
{ header: "DATA RULE SET ID", key: "dataRuleSetId", format: (v) => v ? formatId(v) : "—" },
|
|
51
|
+
{ header: "MODIFIED", key: "modifiedAt", format: formatDate },
|
|
52
|
+
]));
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
error(err.message);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// Get type config
|
|
60
|
+
dbTypes
|
|
61
|
+
.command("get")
|
|
62
|
+
.description("Get database type configuration details")
|
|
63
|
+
.argument("<database-type>", "Database type name")
|
|
64
|
+
.option("--app <app-id>", "App ID")
|
|
65
|
+
.option("--json", "Output as JSON")
|
|
66
|
+
.action(async (databaseType, options) => {
|
|
67
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
68
|
+
const client = new ApiClient();
|
|
69
|
+
try {
|
|
70
|
+
const result = await client.getDatabaseTypeConfig(resolvedAppId, databaseType);
|
|
71
|
+
if (options.json) {
|
|
72
|
+
json(result);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
keyValue("Database Type", result.databaseType);
|
|
76
|
+
keyValue("Rule Set ID", result.ruleSetId || "—");
|
|
77
|
+
keyValue("Data Rule Set ID", result.dataRuleSetId || "—");
|
|
78
|
+
keyValue("Created", formatDate(result.createdAt));
|
|
79
|
+
keyValue("Modified", formatDate(result.modifiedAt));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
error(err.message);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Create type config
|
|
87
|
+
dbTypes
|
|
88
|
+
.command("create")
|
|
89
|
+
.description("Create a database type configuration")
|
|
90
|
+
.argument("<database-type>", "Database type name")
|
|
91
|
+
.option("--rule-set-id <id>", "Access rule set ID")
|
|
92
|
+
.option("--data-rule-set-id <id>", "Data access rule set ID")
|
|
93
|
+
.option("--app <app-id>", "App ID")
|
|
94
|
+
.option("--json", "Output as JSON")
|
|
95
|
+
.action(async (databaseType, options) => {
|
|
96
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
97
|
+
const client = new ApiClient();
|
|
98
|
+
try {
|
|
99
|
+
const data = { databaseType };
|
|
100
|
+
if (options.ruleSetId)
|
|
101
|
+
data.ruleSetId = options.ruleSetId;
|
|
102
|
+
if (options.dataRuleSetId)
|
|
103
|
+
data.dataRuleSetId = options.dataRuleSetId;
|
|
104
|
+
const result = await client.createDatabaseTypeConfig(resolvedAppId, data);
|
|
105
|
+
if (options.json) {
|
|
106
|
+
json(result);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
success("Database type configuration created.");
|
|
110
|
+
keyValue("Database Type", result.databaseType);
|
|
111
|
+
if (result.ruleSetId)
|
|
112
|
+
keyValue("Rule Set ID", result.ruleSetId);
|
|
113
|
+
if (result.dataRuleSetId)
|
|
114
|
+
keyValue("Data Rule Set ID", result.dataRuleSetId);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
error(err.message);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
// Update type config
|
|
122
|
+
dbTypes
|
|
123
|
+
.command("update")
|
|
124
|
+
.description("Update a database type configuration")
|
|
125
|
+
.argument("<database-type>", "Database type name")
|
|
126
|
+
.option("--rule-set-id <id>", "Access rule set ID (use 'none' to clear)")
|
|
127
|
+
.option("--data-rule-set-id <id>", "Data access rule set ID (use 'none' to clear)")
|
|
128
|
+
.option("--app <app-id>", "App ID")
|
|
129
|
+
.option("--json", "Output as JSON")
|
|
130
|
+
.action(async (databaseType, options) => {
|
|
131
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
132
|
+
const client = new ApiClient();
|
|
133
|
+
const data = {};
|
|
134
|
+
if (options.ruleSetId !== undefined) {
|
|
135
|
+
data.ruleSetId = options.ruleSetId === "none" ? null : options.ruleSetId;
|
|
136
|
+
}
|
|
137
|
+
if (options.dataRuleSetId !== undefined) {
|
|
138
|
+
data.dataRuleSetId = options.dataRuleSetId === "none" ? null : options.dataRuleSetId;
|
|
139
|
+
}
|
|
140
|
+
if (Object.keys(data).length === 0) {
|
|
141
|
+
error("Provide at least one of --rule-set-id or --data-rule-set-id.");
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
const result = await client.updateDatabaseTypeConfig(resolvedAppId, databaseType, data);
|
|
146
|
+
if (options.json) {
|
|
147
|
+
json(result);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
success("Database type configuration updated.");
|
|
151
|
+
keyValue("Database Type", result.databaseType);
|
|
152
|
+
keyValue("Rule Set ID", result.ruleSetId || "—");
|
|
153
|
+
keyValue("Data Rule Set ID", result.dataRuleSetId || "—");
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
error(err.message);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
// Delete type config
|
|
161
|
+
dbTypes
|
|
162
|
+
.command("delete")
|
|
163
|
+
.description("Delete a database type configuration")
|
|
164
|
+
.argument("<database-type>", "Database type name")
|
|
165
|
+
.option("--app <app-id>", "App ID")
|
|
166
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
167
|
+
.action(async (databaseType, options) => {
|
|
168
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
169
|
+
if (!options.yes) {
|
|
170
|
+
const inquirer = await import("inquirer");
|
|
171
|
+
const { confirm } = await inquirer.default.prompt([
|
|
172
|
+
{
|
|
173
|
+
type: "confirm",
|
|
174
|
+
name: "confirm",
|
|
175
|
+
message: `Delete database type "${databaseType}"? This cannot be undone.`,
|
|
176
|
+
default: false,
|
|
177
|
+
},
|
|
178
|
+
]);
|
|
179
|
+
if (!confirm) {
|
|
180
|
+
info("Cancelled.");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const client = new ApiClient();
|
|
185
|
+
try {
|
|
186
|
+
await client.deleteDatabaseTypeConfig(resolvedAppId, databaseType);
|
|
187
|
+
success(`Database type "${databaseType}" deleted.`);
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
error(err.message);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
// ---- Operations subcommand group ----
|
|
195
|
+
const operations = dbTypes
|
|
196
|
+
.command("operations")
|
|
197
|
+
.description("Manage operations (queries and mutations) for a database type");
|
|
198
|
+
// List operations
|
|
199
|
+
operations
|
|
200
|
+
.command("list")
|
|
201
|
+
.description("List operations for a database type")
|
|
202
|
+
.argument("<database-type>", "Database type name")
|
|
203
|
+
.option("--app <app-id>", "App ID")
|
|
204
|
+
.option("--json", "Output as JSON")
|
|
205
|
+
.action(async (databaseType, options) => {
|
|
206
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
207
|
+
const client = new ApiClient();
|
|
208
|
+
try {
|
|
209
|
+
const result = await client.listDatabaseTypeOperations(resolvedAppId, databaseType);
|
|
210
|
+
const list = Array.isArray(result) ? result : [];
|
|
211
|
+
if (options.json) {
|
|
212
|
+
json(list);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (list.length === 0) {
|
|
216
|
+
info("No operations found.");
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
console.log(formatTable(list, [
|
|
220
|
+
{ header: "NAME", key: "name" },
|
|
221
|
+
{ header: "TYPE", key: "type" },
|
|
222
|
+
{ header: "MODEL", key: "modelName" },
|
|
223
|
+
{ header: "ACCESS", key: "access", format: (v) => {
|
|
224
|
+
const s = String(v || "");
|
|
225
|
+
return s.length > 40 ? s.slice(0, 37) + "..." : s;
|
|
226
|
+
} },
|
|
227
|
+
{ header: "MODIFIED", key: "modifiedAt", format: formatDate },
|
|
228
|
+
]));
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
error(err.message);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
// Get operation
|
|
236
|
+
operations
|
|
237
|
+
.command("get")
|
|
238
|
+
.description("Get operation details")
|
|
239
|
+
.argument("<database-type>", "Database type name")
|
|
240
|
+
.argument("<name>", "Operation name")
|
|
241
|
+
.option("--app <app-id>", "App ID")
|
|
242
|
+
.option("--json", "Output as JSON")
|
|
243
|
+
.action(async (databaseType, name, options) => {
|
|
244
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
245
|
+
const client = new ApiClient();
|
|
246
|
+
try {
|
|
247
|
+
const result = await client.getDatabaseTypeOperation(resolvedAppId, databaseType, name);
|
|
248
|
+
if (options.json) {
|
|
249
|
+
json(result);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
keyValue("Name", result.name);
|
|
253
|
+
keyValue("Type", result.type);
|
|
254
|
+
keyValue("Model Name", result.modelName);
|
|
255
|
+
keyValue("Access", result.access);
|
|
256
|
+
keyValue("Created", formatDate(result.createdAt));
|
|
257
|
+
keyValue("Modified", formatDate(result.modifiedAt));
|
|
258
|
+
console.log("\nDefinition:");
|
|
259
|
+
console.log(JSON.stringify(result.definition, null, 2));
|
|
260
|
+
if (result.params && Object.keys(result.params).length > 0) {
|
|
261
|
+
console.log("\nParameters:");
|
|
262
|
+
console.log(JSON.stringify(result.params, null, 2));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
error(err.message);
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
// Create operation
|
|
271
|
+
operations
|
|
272
|
+
.command("create")
|
|
273
|
+
.description("Create a new operation (query or mutation)")
|
|
274
|
+
.argument("<database-type>", "Database type name")
|
|
275
|
+
.argument("<name>", "Operation name")
|
|
276
|
+
.requiredOption("--type <type>", "Operation type: query or mutation")
|
|
277
|
+
.requiredOption("--model <model-name>", "Model name")
|
|
278
|
+
.requiredOption("--access <cel>", "Access CEL expression")
|
|
279
|
+
.requiredOption("--definition <json>", "Definition as JSON string")
|
|
280
|
+
.option("--params <json>", "Parameters schema as JSON string")
|
|
281
|
+
.option("--app <app-id>", "App ID")
|
|
282
|
+
.option("--json", "Output as JSON")
|
|
283
|
+
.action(async (databaseType, name, options) => {
|
|
284
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
285
|
+
const client = new ApiClient();
|
|
286
|
+
let definition;
|
|
287
|
+
try {
|
|
288
|
+
definition = JSON.parse(options.definition);
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
error("Invalid JSON in --definition.");
|
|
292
|
+
process.exit(1);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
let params;
|
|
296
|
+
if (options.params) {
|
|
297
|
+
try {
|
|
298
|
+
params = JSON.parse(options.params);
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
error("Invalid JSON in --params.");
|
|
302
|
+
process.exit(1);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
const data = {
|
|
308
|
+
name,
|
|
309
|
+
type: options.type,
|
|
310
|
+
modelName: options.model,
|
|
311
|
+
access: options.access,
|
|
312
|
+
definition,
|
|
313
|
+
};
|
|
314
|
+
if (params)
|
|
315
|
+
data.params = params;
|
|
316
|
+
const result = await client.createDatabaseTypeOperation(resolvedAppId, databaseType, data);
|
|
317
|
+
if (options.json) {
|
|
318
|
+
json(result);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
success("Operation created.");
|
|
322
|
+
keyValue("Name", result.name);
|
|
323
|
+
keyValue("Type", result.type);
|
|
324
|
+
keyValue("Model Name", result.modelName);
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
error(err.message);
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
// Update operation
|
|
332
|
+
operations
|
|
333
|
+
.command("update")
|
|
334
|
+
.description("Update an operation")
|
|
335
|
+
.argument("<database-type>", "Database type name")
|
|
336
|
+
.argument("<name>", "Operation name")
|
|
337
|
+
.option("--model <model-name>", "New model name")
|
|
338
|
+
.option("--access <cel>", "New access CEL expression")
|
|
339
|
+
.option("--definition <json>", "New definition as JSON string")
|
|
340
|
+
.option("--params <json>", "New parameters schema as JSON string")
|
|
341
|
+
.option("--app <app-id>", "App ID")
|
|
342
|
+
.option("--json", "Output as JSON")
|
|
343
|
+
.action(async (databaseType, name, options) => {
|
|
344
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
345
|
+
const client = new ApiClient();
|
|
346
|
+
const data = {};
|
|
347
|
+
if (options.model)
|
|
348
|
+
data.modelName = options.model;
|
|
349
|
+
if (options.access)
|
|
350
|
+
data.access = options.access;
|
|
351
|
+
if (options.definition) {
|
|
352
|
+
try {
|
|
353
|
+
data.definition = JSON.parse(options.definition);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
error("Invalid JSON in --definition.");
|
|
357
|
+
process.exit(1);
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (options.params) {
|
|
362
|
+
try {
|
|
363
|
+
data.params = JSON.parse(options.params);
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
error("Invalid JSON in --params.");
|
|
367
|
+
process.exit(1);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (Object.keys(data).length === 0) {
|
|
372
|
+
error("Provide at least one of --model, --access, --definition, or --params.");
|
|
373
|
+
process.exit(1);
|
|
374
|
+
}
|
|
375
|
+
try {
|
|
376
|
+
const result = await client.updateDatabaseTypeOperation(resolvedAppId, databaseType, name, data);
|
|
377
|
+
if (options.json) {
|
|
378
|
+
json(result);
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
success("Operation updated.");
|
|
382
|
+
keyValue("Name", result.name);
|
|
383
|
+
keyValue("Type", result.type);
|
|
384
|
+
keyValue("Model Name", result.modelName);
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
error(err.message);
|
|
388
|
+
process.exit(1);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
// Delete operation
|
|
392
|
+
operations
|
|
393
|
+
.command("delete")
|
|
394
|
+
.description("Delete an operation")
|
|
395
|
+
.argument("<database-type>", "Database type name")
|
|
396
|
+
.argument("<name>", "Operation name")
|
|
397
|
+
.option("--app <app-id>", "App ID")
|
|
398
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
399
|
+
.action(async (databaseType, name, options) => {
|
|
400
|
+
const resolvedAppId = resolveAppId(undefined, options);
|
|
401
|
+
if (!options.yes) {
|
|
402
|
+
const inquirer = await import("inquirer");
|
|
403
|
+
const { confirm } = await inquirer.default.prompt([
|
|
404
|
+
{
|
|
405
|
+
type: "confirm",
|
|
406
|
+
name: "confirm",
|
|
407
|
+
message: `Delete operation "${name}" from type "${databaseType}"?`,
|
|
408
|
+
default: false,
|
|
409
|
+
},
|
|
410
|
+
]);
|
|
411
|
+
if (!confirm) {
|
|
412
|
+
info("Cancelled.");
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
const client = new ApiClient();
|
|
417
|
+
try {
|
|
418
|
+
await client.deleteDatabaseTypeOperation(resolvedAppId, databaseType, name);
|
|
419
|
+
success(`Operation "${name}" deleted.`);
|
|
420
|
+
}
|
|
421
|
+
catch (err) {
|
|
422
|
+
error(err.message);
|
|
423
|
+
process.exit(1);
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=database-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-types.js","sourceRoot":"","sources":["../../../src/commands/database-types.ts"],"names":[],"mappings":"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"}
|