@reporting-bi/cli 0.0.2 → 0.0.4
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 +21 -10
- package/dist/index.js +553 -23
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -29,18 +29,28 @@ Originally built for browser use (`rp-app-auth` login page), it may require adap
|
|
|
29
29
|
|
|
30
30
|
**Important:** `rp-vscode` currently has its own auth implementation (`src/auth.ts`) with VS Code-specific OAuth2 flow (local HTTP callback server, VS Code secrets storage). This will be refactored to use `rp-auth-client-v2` instead, keeping only VS Code-specific concerns (secrets API, URI handler) in the extension.
|
|
31
31
|
|
|
32
|
-
##
|
|
32
|
+
## Features
|
|
33
33
|
|
|
34
|
-
- **Authentication** —
|
|
35
|
-
- **ETL
|
|
36
|
-
- **
|
|
37
|
-
- **
|
|
38
|
-
- **
|
|
39
|
-
- **
|
|
34
|
+
- **Authentication** — OAuth2 login via browser, token storage & refresh
|
|
35
|
+
- **ETL** — List, view, search, and execute ETL threads
|
|
36
|
+
- **Jobs** — List, start, stop, and monitor SQL Agent jobs
|
|
37
|
+
- **Analytics** — Browse report contexts, execute reports, list dimensions/years
|
|
38
|
+
- **Users** — List users, view profiles, check access rights and roles
|
|
39
|
+
- **Definition** — Browse statements, dimensions, modules, scenarios, fiscal years
|
|
40
|
+
- **MDM** — Browse master data tables, view values, export as CSV
|
|
41
|
+
- **Helpdesk** — List/view tickets, read messages, create new tickets
|
|
42
|
+
- **Wiki** — Full CRUD for wiki pages (list, read, search, save, delete)
|
|
43
|
+
- **Accounting** — List and switch between accountings
|
|
44
|
+
|
|
45
|
+
All commands output formatted tables by default, with `--json` flag for raw JSON output.
|
|
46
|
+
|
|
47
|
+
## Installation
|
|
48
|
+
|
|
49
|
+
See [INSTALL.md](INSTALL.md) for installation instructions.
|
|
40
50
|
|
|
41
51
|
## Tech Stack
|
|
42
52
|
|
|
43
|
-
- Node.js + TypeScript
|
|
53
|
+
- Node.js + TypeScript, bundled with esbuild (zero runtime dependencies)
|
|
44
54
|
- `@reporting/rp-auth-client-v2` — Shared authentication client (OAuth2)
|
|
45
55
|
- `@reporting/rp-client` — HTTP client for Reporting.bi microservices
|
|
46
56
|
- `@reporting/rp-types` — Shared TypeScript types
|
|
@@ -48,6 +58,7 @@ Originally built for browser use (`rp-app-auth` login page), it may require adap
|
|
|
48
58
|
## Development
|
|
49
59
|
|
|
50
60
|
```bash
|
|
51
|
-
yarn build #
|
|
52
|
-
yarn watch #
|
|
61
|
+
yarn build # bundle with esbuild
|
|
62
|
+
yarn watch # bundle in watch mode
|
|
63
|
+
yarn release # bump version, build, commit, push, publish to npm
|
|
53
64
|
```
|
package/dist/index.js
CHANGED
|
@@ -663,16 +663,16 @@ var require_side_channel_list = __commonJS({
|
|
|
663
663
|
"use strict";
|
|
664
664
|
var inspect = require_object_inspect();
|
|
665
665
|
var $TypeError = require_type();
|
|
666
|
-
var listGetNode = function(
|
|
667
|
-
var prev =
|
|
666
|
+
var listGetNode = function(list7, key, isDelete) {
|
|
667
|
+
var prev = list7;
|
|
668
668
|
var curr;
|
|
669
669
|
for (; (curr = prev.next) != null; prev = curr) {
|
|
670
670
|
if (curr.key === key) {
|
|
671
671
|
prev.next = curr.next;
|
|
672
672
|
if (!isDelete) {
|
|
673
673
|
curr.next = /** @type {NonNullable<typeof list.next>} */
|
|
674
|
-
|
|
675
|
-
|
|
674
|
+
list7.next;
|
|
675
|
+
list7.next = curr;
|
|
676
676
|
}
|
|
677
677
|
return curr;
|
|
678
678
|
}
|
|
@@ -2106,9 +2106,9 @@ var require_stringify = __commonJS({
|
|
|
2106
2106
|
}
|
|
2107
2107
|
return [formatter(prefix) + "=" + formatter(String(obj))];
|
|
2108
2108
|
}
|
|
2109
|
-
var
|
|
2109
|
+
var values2 = [];
|
|
2110
2110
|
if (typeof obj === "undefined") {
|
|
2111
|
-
return
|
|
2111
|
+
return values2;
|
|
2112
2112
|
}
|
|
2113
2113
|
var objKeys;
|
|
2114
2114
|
if (generateArrayPrefix === "comma" && isArray(obj)) {
|
|
@@ -2138,7 +2138,7 @@ var require_stringify = __commonJS({
|
|
|
2138
2138
|
sideChannel.set(object, step);
|
|
2139
2139
|
var valueSideChannel = getSideChannel();
|
|
2140
2140
|
valueSideChannel.set(sentinel, sideChannel);
|
|
2141
|
-
pushToArray(
|
|
2141
|
+
pushToArray(values2, stringify2(
|
|
2142
2142
|
value,
|
|
2143
2143
|
keyPrefix,
|
|
2144
2144
|
generateArrayPrefix,
|
|
@@ -2159,7 +2159,7 @@ var require_stringify = __commonJS({
|
|
|
2159
2159
|
valueSideChannel
|
|
2160
2160
|
));
|
|
2161
2161
|
}
|
|
2162
|
-
return
|
|
2162
|
+
return values2;
|
|
2163
2163
|
};
|
|
2164
2164
|
var normalizeStringifyOptions = function normalizeStringifyOptions2(opts) {
|
|
2165
2165
|
if (!opts) {
|
|
@@ -3057,12 +3057,12 @@ function createAuthClient(domain, tokenProvider) {
|
|
|
3057
3057
|
function createService(name, accountingOverride) {
|
|
3058
3058
|
const conn = getActiveConnection();
|
|
3059
3059
|
if (!conn) {
|
|
3060
|
-
console.error('Not logged in. Run "
|
|
3060
|
+
console.error('Not logged in. Run "rpbi login" first.');
|
|
3061
3061
|
process.exit(1);
|
|
3062
3062
|
}
|
|
3063
3063
|
const accounting2 = accountingOverride ?? conn.tokens.accounting;
|
|
3064
3064
|
if (!accounting2) {
|
|
3065
|
-
console.error('No accounting set. Run "
|
|
3065
|
+
console.error('No accounting set. Run "rpbi use <domain> --accounting <id>" first.');
|
|
3066
3066
|
process.exit(1);
|
|
3067
3067
|
}
|
|
3068
3068
|
const service = new import_rp_client.Service({
|
|
@@ -3159,7 +3159,7 @@ async function accounting(args2) {
|
|
|
3159
3159
|
case "list":
|
|
3160
3160
|
return list(flags);
|
|
3161
3161
|
default:
|
|
3162
|
-
console.log("Usage:
|
|
3162
|
+
console.log("Usage: rpbi accounting <list>");
|
|
3163
3163
|
break;
|
|
3164
3164
|
}
|
|
3165
3165
|
}
|
|
@@ -3270,7 +3270,7 @@ async function login(args2) {
|
|
|
3270
3270
|
console.log(`Accounting: ${accounting2}`);
|
|
3271
3271
|
}
|
|
3272
3272
|
} else {
|
|
3273
|
-
console.log('No accounting set. Use "
|
|
3273
|
+
console.log('No accounting set. Use "rpbi use <domain> --accounting <id>" to set one.');
|
|
3274
3274
|
}
|
|
3275
3275
|
}
|
|
3276
3276
|
function getAuthorizationCode(domain) {
|
|
@@ -3380,7 +3380,7 @@ async function use(args2) {
|
|
|
3380
3380
|
if (!domain) {
|
|
3381
3381
|
const active = getActiveConnection();
|
|
3382
3382
|
if (!active) {
|
|
3383
|
-
console.log('Not logged in. Run "
|
|
3383
|
+
console.log('Not logged in. Run "rpbi login" first.');
|
|
3384
3384
|
return;
|
|
3385
3385
|
}
|
|
3386
3386
|
domain = active.domain;
|
|
@@ -3423,8 +3423,8 @@ async function get(id, flags) {
|
|
|
3423
3423
|
async function read(id, flags) {
|
|
3424
3424
|
const lang = flags.lang || DEFAULT_LANG;
|
|
3425
3425
|
const service = createService("wiki");
|
|
3426
|
-
const
|
|
3427
|
-
process.stdout.write(
|
|
3426
|
+
const content2 = await service.get(`pageContent/${lang}/${id}`, void 0, { parseResponse: false });
|
|
3427
|
+
process.stdout.write(content2 || "");
|
|
3428
3428
|
}
|
|
3429
3429
|
async function search(query, flags) {
|
|
3430
3430
|
const service = createService("wiki");
|
|
@@ -3452,10 +3452,10 @@ async function readContent(flags) {
|
|
|
3452
3452
|
async function save(id, flags) {
|
|
3453
3453
|
const lang = flags.lang || DEFAULT_LANG;
|
|
3454
3454
|
const service = createService("wiki");
|
|
3455
|
-
const
|
|
3455
|
+
const content2 = await readContent(flags);
|
|
3456
3456
|
const page = {
|
|
3457
3457
|
lang,
|
|
3458
|
-
content
|
|
3458
|
+
content: content2
|
|
3459
3459
|
};
|
|
3460
3460
|
if (id) page.id_wiki_page = parseInt(id);
|
|
3461
3461
|
if (flags.name) page.name = flags.name;
|
|
@@ -3476,19 +3476,19 @@ async function wiki(args2) {
|
|
|
3476
3476
|
return list2(flags);
|
|
3477
3477
|
case "get":
|
|
3478
3478
|
if (!rest[0]) {
|
|
3479
|
-
console.error("Usage:
|
|
3479
|
+
console.error("Usage: rpbi wiki get <id>");
|
|
3480
3480
|
process.exit(1);
|
|
3481
3481
|
}
|
|
3482
3482
|
return get(rest[0], flags);
|
|
3483
3483
|
case "read":
|
|
3484
3484
|
if (!rest[0]) {
|
|
3485
|
-
console.error("Usage:
|
|
3485
|
+
console.error("Usage: rpbi wiki read <id>");
|
|
3486
3486
|
process.exit(1);
|
|
3487
3487
|
}
|
|
3488
3488
|
return read(rest[0], flags);
|
|
3489
3489
|
case "search":
|
|
3490
3490
|
if (!rest[0]) {
|
|
3491
|
-
console.error("Usage:
|
|
3491
|
+
console.error("Usage: rpbi wiki search <query>");
|
|
3492
3492
|
process.exit(1);
|
|
3493
3493
|
}
|
|
3494
3494
|
return search(rest[0], flags);
|
|
@@ -3496,18 +3496,527 @@ async function wiki(args2) {
|
|
|
3496
3496
|
return save(rest[0], flags);
|
|
3497
3497
|
case "delete":
|
|
3498
3498
|
if (!rest[0]) {
|
|
3499
|
-
console.error("Usage:
|
|
3499
|
+
console.error("Usage: rpbi wiki delete <id>");
|
|
3500
3500
|
process.exit(1);
|
|
3501
3501
|
}
|
|
3502
3502
|
return del(rest[0], flags);
|
|
3503
3503
|
default:
|
|
3504
|
-
console.log("Usage:
|
|
3504
|
+
console.log("Usage: rpbi wiki <list|get|read|search|save|delete> [options]");
|
|
3505
|
+
break;
|
|
3506
|
+
}
|
|
3507
|
+
}
|
|
3508
|
+
|
|
3509
|
+
// src/commands/etl.ts
|
|
3510
|
+
var fs3 = __toESM(require("node:fs"));
|
|
3511
|
+
async function list3(flags) {
|
|
3512
|
+
const service = createService("etl");
|
|
3513
|
+
const threads = await service.get("threads");
|
|
3514
|
+
output(threads || [], flags);
|
|
3515
|
+
}
|
|
3516
|
+
async function get2(id, flags) {
|
|
3517
|
+
const service = createService("etl");
|
|
3518
|
+
const thread = await service.get(`threads/${id}`);
|
|
3519
|
+
output(thread, flags);
|
|
3520
|
+
}
|
|
3521
|
+
async function content(id, flags) {
|
|
3522
|
+
const service = createService("etl");
|
|
3523
|
+
const text = await service.get(`threadContent/${id}`, void 0, { parseResponse: false });
|
|
3524
|
+
process.stdout.write(text || "");
|
|
3525
|
+
}
|
|
3526
|
+
async function exec2(id, flags) {
|
|
3527
|
+
const service = createService("etl");
|
|
3528
|
+
let body = void 0;
|
|
3529
|
+
if (flags.file) {
|
|
3530
|
+
body = fs3.readFileSync(flags.file, "utf-8");
|
|
3531
|
+
} else if (flags.sql) {
|
|
3532
|
+
body = flags.sql;
|
|
3533
|
+
}
|
|
3534
|
+
const result = await service.post(`exec/${id}`, body, { parseResponse: false });
|
|
3535
|
+
process.stdout.write(result || "");
|
|
3536
|
+
}
|
|
3537
|
+
async function search2(query, flags) {
|
|
3538
|
+
const service = createService("etl");
|
|
3539
|
+
const results = await service.get("search", { q: query });
|
|
3540
|
+
output(results || [], flags);
|
|
3541
|
+
}
|
|
3542
|
+
async function etl(args2) {
|
|
3543
|
+
const { positional, flags } = parseArgs(args2);
|
|
3544
|
+
const [subcommand, ...rest] = positional;
|
|
3545
|
+
switch (subcommand) {
|
|
3546
|
+
case "list":
|
|
3547
|
+
return list3(flags);
|
|
3548
|
+
case "get":
|
|
3549
|
+
if (!rest[0]) {
|
|
3550
|
+
console.error("Usage: rpbi etl get <id>");
|
|
3551
|
+
process.exit(1);
|
|
3552
|
+
}
|
|
3553
|
+
return get2(rest[0], flags);
|
|
3554
|
+
case "content":
|
|
3555
|
+
if (!rest[0]) {
|
|
3556
|
+
console.error("Usage: rpbi etl content <id>");
|
|
3557
|
+
process.exit(1);
|
|
3558
|
+
}
|
|
3559
|
+
return content(rest[0], flags);
|
|
3560
|
+
case "exec":
|
|
3561
|
+
if (!rest[0]) {
|
|
3562
|
+
console.error('Usage: rpbi etl exec <id> [--sql "..."] [--file path]');
|
|
3563
|
+
process.exit(1);
|
|
3564
|
+
}
|
|
3565
|
+
return exec2(rest[0], flags);
|
|
3566
|
+
case "search":
|
|
3567
|
+
if (!rest[0]) {
|
|
3568
|
+
console.error("Usage: rpbi etl search <query>");
|
|
3569
|
+
process.exit(1);
|
|
3570
|
+
}
|
|
3571
|
+
return search2(rest[0], flags);
|
|
3572
|
+
default:
|
|
3573
|
+
console.log("Usage: rpbi etl <list|get|content|exec|search> [options]");
|
|
3574
|
+
break;
|
|
3575
|
+
}
|
|
3576
|
+
}
|
|
3577
|
+
|
|
3578
|
+
// src/commands/jobs.ts
|
|
3579
|
+
async function list4(flags) {
|
|
3580
|
+
const service = createService("jobs");
|
|
3581
|
+
const jobs2 = await service.get("userJobs");
|
|
3582
|
+
output(jobs2 || [], flags);
|
|
3583
|
+
}
|
|
3584
|
+
async function start(jobName, flags) {
|
|
3585
|
+
const service = createService("jobs");
|
|
3586
|
+
await service.get("start", { job_name: jobName });
|
|
3587
|
+
console.log(`Job "${jobName}" started.`);
|
|
3588
|
+
}
|
|
3589
|
+
async function stop(jobName, flags) {
|
|
3590
|
+
const service = createService("jobs");
|
|
3591
|
+
await service.get("stop", { job_name: jobName });
|
|
3592
|
+
console.log(`Job "${jobName}" stopped.`);
|
|
3593
|
+
}
|
|
3594
|
+
async function statusCmd(flags) {
|
|
3595
|
+
const service = createService("jobs");
|
|
3596
|
+
const statuses = await service.get("jobStatuses");
|
|
3597
|
+
output(statuses || [], flags);
|
|
3598
|
+
}
|
|
3599
|
+
async function jobs(args2) {
|
|
3600
|
+
const { positional, flags } = parseArgs(args2);
|
|
3601
|
+
const [subcommand, ...rest] = positional;
|
|
3602
|
+
switch (subcommand) {
|
|
3603
|
+
case "list":
|
|
3604
|
+
return list4(flags);
|
|
3605
|
+
case "start":
|
|
3606
|
+
if (!rest[0]) {
|
|
3607
|
+
console.error("Usage: rpbi jobs start <job_name>");
|
|
3608
|
+
process.exit(1);
|
|
3609
|
+
}
|
|
3610
|
+
return start(rest[0], flags);
|
|
3611
|
+
case "stop":
|
|
3612
|
+
if (!rest[0]) {
|
|
3613
|
+
console.error("Usage: rpbi jobs stop <job_name>");
|
|
3614
|
+
process.exit(1);
|
|
3615
|
+
}
|
|
3616
|
+
return stop(rest[0], flags);
|
|
3617
|
+
case "status":
|
|
3618
|
+
return statusCmd(flags);
|
|
3619
|
+
default:
|
|
3620
|
+
console.log("Usage: rpbi jobs <list|start|stop|status> [options]");
|
|
3621
|
+
break;
|
|
3622
|
+
}
|
|
3623
|
+
}
|
|
3624
|
+
|
|
3625
|
+
// src/commands/analytics.ts
|
|
3626
|
+
async function contexts(flags) {
|
|
3627
|
+
const service = createService("analytics");
|
|
3628
|
+
const ctxs = await service.get("namedContext");
|
|
3629
|
+
output(ctxs || [], flags);
|
|
3630
|
+
}
|
|
3631
|
+
async function getContext(id, flags) {
|
|
3632
|
+
const service = createService("analytics");
|
|
3633
|
+
const ctx = await service.get(`context/${id}`);
|
|
3634
|
+
output(ctx, flags);
|
|
3635
|
+
}
|
|
3636
|
+
async function report(id, flags) {
|
|
3637
|
+
const service = createService("analytics");
|
|
3638
|
+
const index = flags.index || "0";
|
|
3639
|
+
const result = await service.get(`report/${id}/${index}`, void 0, { parseResponse: false });
|
|
3640
|
+
process.stdout.write(result || "");
|
|
3641
|
+
}
|
|
3642
|
+
async function dimensions(flags) {
|
|
3643
|
+
const module2 = flags.module || flags.m;
|
|
3644
|
+
if (!module2) {
|
|
3645
|
+
console.error("Usage: rpbi analytics dimensions --module <module>");
|
|
3646
|
+
process.exit(1);
|
|
3647
|
+
}
|
|
3648
|
+
const service = createService("definition");
|
|
3649
|
+
const dims = await service.get(`visibleDimensions/${module2}`);
|
|
3650
|
+
output(dims || [], flags);
|
|
3651
|
+
}
|
|
3652
|
+
async function periods(flags) {
|
|
3653
|
+
const service = createService("analytics");
|
|
3654
|
+
const tree = await service.get("years");
|
|
3655
|
+
output(tree || [], flags);
|
|
3656
|
+
}
|
|
3657
|
+
async function analytics(args2) {
|
|
3658
|
+
const { positional, flags } = parseArgs(args2);
|
|
3659
|
+
const [subcommand, ...rest] = positional;
|
|
3660
|
+
switch (subcommand) {
|
|
3661
|
+
case "contexts":
|
|
3662
|
+
return contexts(flags);
|
|
3663
|
+
case "context":
|
|
3664
|
+
if (!rest[0]) {
|
|
3665
|
+
console.error("Usage: rpbi analytics context <id>");
|
|
3666
|
+
process.exit(1);
|
|
3667
|
+
}
|
|
3668
|
+
return getContext(rest[0], flags);
|
|
3669
|
+
case "report":
|
|
3670
|
+
if (!rest[0]) {
|
|
3671
|
+
console.error("Usage: rpbi analytics report <context_id> [--index N]");
|
|
3672
|
+
process.exit(1);
|
|
3673
|
+
}
|
|
3674
|
+
return report(rest[0], flags);
|
|
3675
|
+
case "dimensions":
|
|
3676
|
+
return dimensions(flags);
|
|
3677
|
+
case "years":
|
|
3678
|
+
return periods(flags);
|
|
3679
|
+
default:
|
|
3680
|
+
console.log("Usage: rpbi analytics <contexts|context|report|dimensions|years> [options]");
|
|
3681
|
+
break;
|
|
3682
|
+
}
|
|
3683
|
+
}
|
|
3684
|
+
|
|
3685
|
+
// src/commands/users.ts
|
|
3686
|
+
async function list5(flags) {
|
|
3687
|
+
const service = createService("users");
|
|
3688
|
+
const users2 = await service.get("allUsers");
|
|
3689
|
+
output(users2 || [], flags);
|
|
3690
|
+
}
|
|
3691
|
+
async function get3(user, flags) {
|
|
3692
|
+
const service = createService("users");
|
|
3693
|
+
const result = await service.get(user);
|
|
3694
|
+
output(result, flags);
|
|
3695
|
+
}
|
|
3696
|
+
async function rights(flags) {
|
|
3697
|
+
const service = createService("users");
|
|
3698
|
+
const result = await service.get("userRights");
|
|
3699
|
+
output(result || [], flags);
|
|
3700
|
+
}
|
|
3701
|
+
async function roles(flags) {
|
|
3702
|
+
const service = createService("users");
|
|
3703
|
+
const result = await service.get("accessRoles");
|
|
3704
|
+
output(result || [], flags);
|
|
3705
|
+
}
|
|
3706
|
+
async function users(args2) {
|
|
3707
|
+
const { positional, flags } = parseArgs(args2);
|
|
3708
|
+
const [subcommand, ...rest] = positional;
|
|
3709
|
+
switch (subcommand) {
|
|
3710
|
+
case "list":
|
|
3711
|
+
return list5(flags);
|
|
3712
|
+
case "get":
|
|
3713
|
+
return get3(rest[0] || "me", flags);
|
|
3714
|
+
case "me":
|
|
3715
|
+
return get3("me", flags);
|
|
3716
|
+
case "rights":
|
|
3717
|
+
return rights(flags);
|
|
3718
|
+
case "roles":
|
|
3719
|
+
return roles(flags);
|
|
3720
|
+
default:
|
|
3721
|
+
console.log("Usage: rpbi users <list|get|me|rights|roles> [options]");
|
|
3722
|
+
break;
|
|
3723
|
+
}
|
|
3724
|
+
}
|
|
3725
|
+
|
|
3726
|
+
// src/commands/def.ts
|
|
3727
|
+
async function statements(flags) {
|
|
3728
|
+
const service = createService("definition");
|
|
3729
|
+
const result = await service.get("finStatements");
|
|
3730
|
+
output(result || [], flags);
|
|
3731
|
+
}
|
|
3732
|
+
async function statement(id, flags) {
|
|
3733
|
+
const service = createService("definition");
|
|
3734
|
+
const result = await service.get(`finStatement/${id}`);
|
|
3735
|
+
output(result, flags);
|
|
3736
|
+
}
|
|
3737
|
+
async function dimensions2(flags) {
|
|
3738
|
+
const module2 = flags.module || flags.m;
|
|
3739
|
+
if (!module2) {
|
|
3740
|
+
console.error("Usage: rpbi def dimensions --module <module>");
|
|
3741
|
+
process.exit(1);
|
|
3742
|
+
}
|
|
3743
|
+
const service = createService("definition");
|
|
3744
|
+
const result = await service.get(`dimensions/${module2}`);
|
|
3745
|
+
output(result || [], flags);
|
|
3746
|
+
}
|
|
3747
|
+
async function modules(flags) {
|
|
3748
|
+
const service = createService("definition");
|
|
3749
|
+
const result = await service.get("modules");
|
|
3750
|
+
output(result || [], flags);
|
|
3751
|
+
}
|
|
3752
|
+
async function scenarios(flags) {
|
|
3753
|
+
const service = createService("definition");
|
|
3754
|
+
const result = await service.get("scenarios");
|
|
3755
|
+
output(result || [], flags);
|
|
3756
|
+
}
|
|
3757
|
+
async function fiscalYears(flags) {
|
|
3758
|
+
const service = createService("definition");
|
|
3759
|
+
const result = await service.get("fiscalYears");
|
|
3760
|
+
output(result || [], flags);
|
|
3761
|
+
}
|
|
3762
|
+
async function def(args2) {
|
|
3763
|
+
const { positional, flags } = parseArgs(args2);
|
|
3764
|
+
const [subcommand, ...rest] = positional;
|
|
3765
|
+
switch (subcommand) {
|
|
3766
|
+
case "statements":
|
|
3767
|
+
return statements(flags);
|
|
3768
|
+
case "statement":
|
|
3769
|
+
if (!rest[0]) {
|
|
3770
|
+
console.error("Usage: rpbi def statement <id>");
|
|
3771
|
+
process.exit(1);
|
|
3772
|
+
}
|
|
3773
|
+
return statement(rest[0], flags);
|
|
3774
|
+
case "dimensions":
|
|
3775
|
+
return dimensions2(flags);
|
|
3776
|
+
case "modules":
|
|
3777
|
+
return modules(flags);
|
|
3778
|
+
case "scenarios":
|
|
3779
|
+
return scenarios(flags);
|
|
3780
|
+
case "fiscal-years":
|
|
3781
|
+
return fiscalYears(flags);
|
|
3782
|
+
default:
|
|
3783
|
+
console.log("Usage: rpbi def <statements|statement|dimensions|modules|scenarios|fiscal-years> [options]");
|
|
3784
|
+
break;
|
|
3785
|
+
}
|
|
3786
|
+
}
|
|
3787
|
+
|
|
3788
|
+
// src/commands/mdm.ts
|
|
3789
|
+
async function tables(flags) {
|
|
3790
|
+
const service = createService("mdm");
|
|
3791
|
+
const result = await service.get("tableDefinitions");
|
|
3792
|
+
output(result || [], flags);
|
|
3793
|
+
}
|
|
3794
|
+
async function table(id, flags) {
|
|
3795
|
+
const service = createService("mdm");
|
|
3796
|
+
const result = await service.get(`tableDefinition/${id}`);
|
|
3797
|
+
output(result, flags);
|
|
3798
|
+
}
|
|
3799
|
+
async function columns(id, flags) {
|
|
3800
|
+
const service = createService("mdm");
|
|
3801
|
+
const result = await service.get(`columnDefinitions/${id}`);
|
|
3802
|
+
output(result || [], flags);
|
|
3803
|
+
}
|
|
3804
|
+
async function values(id, flags) {
|
|
3805
|
+
const service = createService("mdm");
|
|
3806
|
+
const result = await service.get(`values/${id}`);
|
|
3807
|
+
output(result || [], flags);
|
|
3808
|
+
}
|
|
3809
|
+
async function exportCsv(id, flags) {
|
|
3810
|
+
const service = createService("mdm");
|
|
3811
|
+
const type = flags.type || "mdm";
|
|
3812
|
+
const result = await service.get(`export/${id}/${type}`, void 0, { parseResponse: false });
|
|
3813
|
+
process.stdout.write(result || "");
|
|
3814
|
+
}
|
|
3815
|
+
async function mdm(args2) {
|
|
3816
|
+
const { positional, flags } = parseArgs(args2);
|
|
3817
|
+
const [subcommand, ...rest] = positional;
|
|
3818
|
+
switch (subcommand) {
|
|
3819
|
+
case "tables":
|
|
3820
|
+
return tables(flags);
|
|
3821
|
+
case "table":
|
|
3822
|
+
if (!rest[0]) {
|
|
3823
|
+
console.error("Usage: rpbi mdm table <id>");
|
|
3824
|
+
process.exit(1);
|
|
3825
|
+
}
|
|
3826
|
+
return table(rest[0], flags);
|
|
3827
|
+
case "columns":
|
|
3828
|
+
if (!rest[0]) {
|
|
3829
|
+
console.error("Usage: rpbi mdm columns <id>");
|
|
3830
|
+
process.exit(1);
|
|
3831
|
+
}
|
|
3832
|
+
return columns(rest[0], flags);
|
|
3833
|
+
case "values":
|
|
3834
|
+
if (!rest[0]) {
|
|
3835
|
+
console.error("Usage: rpbi mdm values <id>");
|
|
3836
|
+
process.exit(1);
|
|
3837
|
+
}
|
|
3838
|
+
return values(rest[0], flags);
|
|
3839
|
+
case "export":
|
|
3840
|
+
if (!rest[0]) {
|
|
3841
|
+
console.error("Usage: rpbi mdm export <id> [--type mdm|sql]");
|
|
3842
|
+
process.exit(1);
|
|
3843
|
+
}
|
|
3844
|
+
return exportCsv(rest[0], flags);
|
|
3845
|
+
default:
|
|
3846
|
+
console.log("Usage: rpbi mdm <tables|table|columns|values|export> [options]");
|
|
3847
|
+
break;
|
|
3848
|
+
}
|
|
3849
|
+
}
|
|
3850
|
+
|
|
3851
|
+
// src/commands/helpdesk.ts
|
|
3852
|
+
async function list6(flags) {
|
|
3853
|
+
const service = createService("helpdesk");
|
|
3854
|
+
const tickets = await service.get("tickets");
|
|
3855
|
+
output(tickets || [], flags);
|
|
3856
|
+
}
|
|
3857
|
+
async function get4(id, flags) {
|
|
3858
|
+
const service = createService("helpdesk");
|
|
3859
|
+
const ticket = await service.get(`ticket/${id}`);
|
|
3860
|
+
output(ticket, flags);
|
|
3861
|
+
}
|
|
3862
|
+
async function messages(id, flags) {
|
|
3863
|
+
const service = createService("helpdesk");
|
|
3864
|
+
const msgs = await service.get(`messages/${id}`);
|
|
3865
|
+
output(msgs || [], flags);
|
|
3866
|
+
}
|
|
3867
|
+
async function create(flags) {
|
|
3868
|
+
const subject = flags.subject;
|
|
3869
|
+
const text = flags.text;
|
|
3870
|
+
if (!subject) {
|
|
3871
|
+
console.error('Usage: rpbi helpdesk create --subject "..." [--text "..."] [--priority N]');
|
|
3872
|
+
process.exit(1);
|
|
3873
|
+
}
|
|
3874
|
+
const service = createService("helpdesk");
|
|
3875
|
+
const ticket = { subject };
|
|
3876
|
+
if (flags.priority) ticket.priority = parseInt(flags.priority);
|
|
3877
|
+
const result = await service.post("ticket", ticket);
|
|
3878
|
+
if (text && result?.id_request) {
|
|
3879
|
+
await service.post("message", { id_request: result.id_request, text });
|
|
3880
|
+
}
|
|
3881
|
+
output(result, flags);
|
|
3882
|
+
}
|
|
3883
|
+
async function helpdesk(args2) {
|
|
3884
|
+
const { positional, flags } = parseArgs(args2);
|
|
3885
|
+
const [subcommand, ...rest] = positional;
|
|
3886
|
+
switch (subcommand) {
|
|
3887
|
+
case "list":
|
|
3888
|
+
return list6(flags);
|
|
3889
|
+
case "get":
|
|
3890
|
+
if (!rest[0]) {
|
|
3891
|
+
console.error("Usage: rpbi helpdesk get <id>");
|
|
3892
|
+
process.exit(1);
|
|
3893
|
+
}
|
|
3894
|
+
return get4(rest[0], flags);
|
|
3895
|
+
case "messages":
|
|
3896
|
+
if (!rest[0]) {
|
|
3897
|
+
console.error("Usage: rpbi helpdesk messages <ticket_id>");
|
|
3898
|
+
process.exit(1);
|
|
3899
|
+
}
|
|
3900
|
+
return messages(rest[0], flags);
|
|
3901
|
+
case "create":
|
|
3902
|
+
return create(flags);
|
|
3903
|
+
default:
|
|
3904
|
+
console.log("Usage: rpbi helpdesk <list|get|messages|create> [options]");
|
|
3505
3905
|
break;
|
|
3506
3906
|
}
|
|
3507
3907
|
}
|
|
3508
3908
|
|
|
3509
3909
|
// USAGE.md
|
|
3510
|
-
var USAGE_default =
|
|
3910
|
+
var USAGE_default = `Reporting.bi CLI
|
|
3911
|
+
|
|
3912
|
+
Usage: rpbi <command> [options]
|
|
3913
|
+
|
|
3914
|
+
Commands:
|
|
3915
|
+
login [domain] [--accounting <id>] Login to a Reporting.bi instance (opens browser)
|
|
3916
|
+
logout [domain] Logout and revoke tokens (default: active connection)
|
|
3917
|
+
use <domain> [--accounting <id>] Switch active connection and/or set accounting
|
|
3918
|
+
status Show all connections and active status
|
|
3919
|
+
|
|
3920
|
+
Accounting:
|
|
3921
|
+
accounting list List available accountings
|
|
3922
|
+
|
|
3923
|
+
ETL:
|
|
3924
|
+
etl list List all threads
|
|
3925
|
+
etl get <id> Get thread metadata
|
|
3926
|
+
etl content <id> Get thread SQL content (plain text)
|
|
3927
|
+
etl exec <id> [--sql "..."|--file f] Execute thread (optionally with custom SQL)
|
|
3928
|
+
etl search <query> Search threads
|
|
3929
|
+
|
|
3930
|
+
Jobs:
|
|
3931
|
+
jobs list List available jobs
|
|
3932
|
+
jobs start <job_name> Start a job
|
|
3933
|
+
jobs stop <job_name> Stop a running job
|
|
3934
|
+
jobs status Show status of all jobs
|
|
3935
|
+
|
|
3936
|
+
Analytics:
|
|
3937
|
+
analytics contexts List saved report contexts
|
|
3938
|
+
analytics context <id> Get report context details
|
|
3939
|
+
analytics report <context_id> Execute report and get results
|
|
3940
|
+
analytics dimensions --module <m> List dimensions for a module
|
|
3941
|
+
analytics years List available years
|
|
3942
|
+
|
|
3943
|
+
Users:
|
|
3944
|
+
users list List all users
|
|
3945
|
+
users get [username] Get user profile (default: me)
|
|
3946
|
+
users me Get current user profile
|
|
3947
|
+
users rights Show current user's access rights
|
|
3948
|
+
users roles List access roles
|
|
3949
|
+
|
|
3950
|
+
Definition:
|
|
3951
|
+
def statements List all statements
|
|
3952
|
+
def statement <id> Get statement definition
|
|
3953
|
+
def dimensions --module <m> List dimensions for a module
|
|
3954
|
+
def modules List available modules
|
|
3955
|
+
def scenarios List scenarios
|
|
3956
|
+
def fiscal-years List fiscal years
|
|
3957
|
+
|
|
3958
|
+
MDM:
|
|
3959
|
+
mdm tables List MDM table definitions
|
|
3960
|
+
mdm table <id> Get table definition
|
|
3961
|
+
mdm columns <id> Get column definitions for a table
|
|
3962
|
+
mdm values <id> Get table values
|
|
3963
|
+
mdm export <id> [--type mdm|sql] Export table as CSV
|
|
3964
|
+
|
|
3965
|
+
Helpdesk:
|
|
3966
|
+
helpdesk list List all tickets
|
|
3967
|
+
helpdesk get <id> Get ticket details
|
|
3968
|
+
helpdesk messages <ticket_id> Get ticket messages
|
|
3969
|
+
helpdesk create --subject "..." [--text "..."] [--priority N] Create a ticket
|
|
3970
|
+
|
|
3971
|
+
Wiki:
|
|
3972
|
+
wiki list List all pages
|
|
3973
|
+
wiki get <id> [--lang cs] Get page metadata
|
|
3974
|
+
wiki read <id> [--lang cs] Get page content (plain text)
|
|
3975
|
+
wiki search <query> Search pages
|
|
3976
|
+
wiki save [id] [--lang cs] [--name n] Save/create a page (content from --file, --content, or stdin)
|
|
3977
|
+
wiki delete <id> [--lang cs] Delete a page
|
|
3978
|
+
|
|
3979
|
+
Global options:
|
|
3980
|
+
--json Output raw JSON instead of table format
|
|
3981
|
+
|
|
3982
|
+
Default domain: https://reporting.bi
|
|
3983
|
+
Default language: cs
|
|
3984
|
+
|
|
3985
|
+
Examples:
|
|
3986
|
+
rpbi login http://localhost:3011 --accounting 100000
|
|
3987
|
+
rpbi use https://reporting.bi --accounting 100000
|
|
3988
|
+
rpbi status
|
|
3989
|
+
|
|
3990
|
+
rpbi etl list
|
|
3991
|
+
rpbi etl exec 42
|
|
3992
|
+
rpbi etl content 42
|
|
3993
|
+
|
|
3994
|
+
rpbi jobs list
|
|
3995
|
+
rpbi jobs start "My Job"
|
|
3996
|
+
rpbi jobs status
|
|
3997
|
+
|
|
3998
|
+
rpbi analytics contexts
|
|
3999
|
+
rpbi analytics report 123
|
|
4000
|
+
|
|
4001
|
+
rpbi users me
|
|
4002
|
+
rpbi users list --json
|
|
4003
|
+
|
|
4004
|
+
rpbi def statements
|
|
4005
|
+
rpbi def modules
|
|
4006
|
+
|
|
4007
|
+
rpbi mdm tables
|
|
4008
|
+
rpbi mdm values 5
|
|
4009
|
+
rpbi mdm export 5 > data.csv
|
|
4010
|
+
|
|
4011
|
+
rpbi helpdesk list
|
|
4012
|
+
rpbi helpdesk create --subject "Bug report" --text "Details here"
|
|
4013
|
+
|
|
4014
|
+
rpbi wiki list
|
|
4015
|
+
rpbi wiki read 42
|
|
4016
|
+
rpbi wiki search "query"
|
|
4017
|
+
rpbi wiki save 42 --file ./page.md
|
|
4018
|
+
cat doc.md | rpbi wiki save 42
|
|
4019
|
+
`;
|
|
3511
4020
|
|
|
3512
4021
|
// src/index.ts
|
|
3513
4022
|
var [command, ...args] = process.argv.slice(2);
|
|
@@ -3527,6 +4036,27 @@ switch (command) {
|
|
|
3527
4036
|
case "accounting":
|
|
3528
4037
|
accounting(args);
|
|
3529
4038
|
break;
|
|
4039
|
+
case "etl":
|
|
4040
|
+
etl(args);
|
|
4041
|
+
break;
|
|
4042
|
+
case "jobs":
|
|
4043
|
+
jobs(args);
|
|
4044
|
+
break;
|
|
4045
|
+
case "analytics":
|
|
4046
|
+
analytics(args);
|
|
4047
|
+
break;
|
|
4048
|
+
case "users":
|
|
4049
|
+
users(args);
|
|
4050
|
+
break;
|
|
4051
|
+
case "def":
|
|
4052
|
+
def(args);
|
|
4053
|
+
break;
|
|
4054
|
+
case "mdm":
|
|
4055
|
+
mdm(args);
|
|
4056
|
+
break;
|
|
4057
|
+
case "helpdesk":
|
|
4058
|
+
helpdesk(args);
|
|
4059
|
+
break;
|
|
3530
4060
|
case "status":
|
|
3531
4061
|
status();
|
|
3532
4062
|
break;
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reporting-bi/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"description": "Reporting.bi CLI — command-line interface for the Reporting.bi platform",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"bin": {
|
|
8
|
-
"
|
|
8
|
+
"rpbi": "./dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist/index.js"
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"build": "yarn node build.mjs",
|
|
15
15
|
"watch": "yarn build --watch",
|
|
16
16
|
"deploy-installers": "cp install.sh ../rp-static/install-cli.sh && cp install.ps1 ../rp-static/install-cli.ps1",
|
|
17
|
-
"release": "yarn node -e \"const p=require('./package.json');const v=p.version.split('.');v[2]++;p.version=v.join('.');require('fs').writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n')\" && yarn build && git add package.json && git commit -m \"rp-cli v$(yarn node -p \"require('./package.json').version\")\" && yarn npm publish --access public"
|
|
17
|
+
"release": "yarn node -e \"const p=require('./package.json');const v=p.version.split('.');v[2]++;p.version=v.join('.');require('fs').writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n')\" && yarn build && git add package.json && git commit -m \"rp-cli v$(yarn node -p \"require('./package.json').version\")\" && git push && yarn npm publish --access public"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {},
|
|
20
20
|
"devDependencies": {
|