@lovrabet/rabetbase-cli 2.4.7 → 2.5.0-beta.1
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/api/api-doc.js +1 -1
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.d.ts +13 -3
- package/lib/api/generate-api-file.js +1 -1
- package/lib/api/generate-sdk-config-file.d.ts +7 -0
- package/lib/api/generate-sdk-config-file.js +1 -0
- package/lib/auth/auth-server-ui.js +1 -1
- package/lib/auth/auth-server.js +1 -1
- package/lib/auth/constant.js +1 -1
- package/lib/auth/get-cookie.js +1 -1
- package/lib/auth/get-session-user.js +1 -1
- package/lib/auth/is-session-valid.js +1 -1
- package/lib/auth/login-success-html.js +1 -1
- package/lib/auth/logout.js +1 -1
- package/lib/cli-flags.js +1 -1
- package/lib/cli.js +1 -1
- package/lib/commands/api/generate.js +1 -1
- package/lib/commands/api/index.js +1 -1
- package/lib/commands/api/list.js +1 -1
- package/lib/commands/api/pull.js +1 -1
- package/lib/commands/api/shared.js +1 -1
- package/lib/commands/app/index.js +1 -1
- package/lib/commands/app/list.js +1 -1
- package/lib/commands/app/members-list.js +1 -1
- package/lib/commands/app/remote-directory.js +1 -1
- package/lib/commands/app/shared.d.ts +2 -5
- package/lib/commands/app/shared.js +1 -1
- package/lib/commands/app-config/delete.js +1 -1
- package/lib/commands/app-config/get.js +1 -1
- package/lib/commands/app-config/index.js +1 -1
- package/lib/commands/app-config/list.js +1 -1
- package/lib/commands/app-config/set.js +1 -1
- package/lib/commands/app-config/shared.js +1 -1
- package/lib/commands/auth/index.js +1 -1
- package/lib/commands/bff/create.js +1 -1
- package/lib/commands/bff/delete.js +1 -1
- package/lib/commands/bff/detail.js +1 -1
- package/lib/commands/bff/index.js +1 -1
- package/lib/commands/bff/list.js +1 -1
- package/lib/commands/bff/pull.js +1 -1
- package/lib/commands/bff/push.js +1 -1
- package/lib/commands/bff/status.js +1 -1
- package/lib/commands/cli-skill/index.js +1 -1
- package/lib/commands/cli-update.js +1 -1
- package/lib/commands/codegen/index.js +1 -1
- package/lib/commands/codegen/sdk.js +1 -1
- package/lib/commands/codegen/sql.js +1 -1
- package/lib/commands/common/app-registry.js +1 -1
- package/lib/commands/common/app-selector.js +1 -1
- package/lib/commands/common/async-task.js +1 -1
- package/lib/commands/common/dry-run.js +1 -1
- package/lib/commands/common/flags.js +1 -1
- package/lib/commands/common/local-file.js +1 -1
- package/lib/commands/common/validate.js +1 -1
- package/lib/commands/config/delete.d.ts +5 -0
- package/lib/commands/config/delete.js +1 -0
- package/lib/commands/config/get.js +1 -1
- package/lib/commands/config/index.js +1 -1
- package/lib/commands/config/init.d.ts +12 -0
- package/lib/commands/config/init.js +1 -0
- package/lib/commands/config/list.js +1 -1
- package/lib/commands/config/set.js +1 -1
- package/lib/commands/config/shared.js +1 -1
- package/lib/commands/dataset/business-group-update.js +1 -1
- package/lib/commands/dataset/business-groups.js +1 -1
- package/lib/commands/dataset/capability.js +1 -1
- package/lib/commands/dataset/delete.js +1 -1
- package/lib/commands/dataset/detail.js +1 -1
- package/lib/commands/dataset/extend-update.js +1 -1
- package/lib/commands/dataset/field-update.js +1 -1
- package/lib/commands/dataset/generate.js +1 -1
- package/lib/commands/dataset/index.js +1 -1
- package/lib/commands/dataset/list.js +1 -1
- package/lib/commands/dataset/operations.js +1 -1
- package/lib/commands/dataset/relation-audit.js +1 -1
- package/lib/commands/dataset/relation-create.js +1 -1
- package/lib/commands/dataset/relation-delete.js +1 -1
- package/lib/commands/dataset/relation-shared.js +1 -1
- package/lib/commands/dataset/relation-update.js +1 -1
- package/lib/commands/dataset/relations.js +1 -1
- package/lib/commands/dataset/rename.js +1 -1
- package/lib/commands/dataset/restore.js +1 -1
- package/lib/commands/db/analysis-batching.js +1 -1
- package/lib/commands/db/analyze-batch-plan.js +1 -1
- package/lib/commands/db/analyze-cancel.js +1 -1
- package/lib/commands/db/analyze-start.js +1 -1
- package/lib/commands/db/analyze-status.js +1 -1
- package/lib/commands/db/create.js +1 -1
- package/lib/commands/db/delete.js +1 -1
- package/lib/commands/db/detail.js +1 -1
- package/lib/commands/db/diff-refresh-start.js +1 -1
- package/lib/commands/db/diff-refresh-status.js +1 -1
- package/lib/commands/db/diff.js +1 -1
- package/lib/commands/db/index.js +1 -1
- package/lib/commands/db/list.js +1 -1
- package/lib/commands/db/shared.js +1 -1
- package/lib/commands/db/tables.js +1 -1
- package/lib/commands/db/test.js +1 -1
- package/lib/commands/db/update.js +1 -1
- package/lib/commands/doctor.js +1 -1
- package/lib/commands/file/index.js +1 -1
- package/lib/commands/issue/index.js +1 -1
- package/lib/commands/issue/nudge.js +1 -1
- package/lib/commands/issue/report.js +1 -1
- package/lib/commands/issue/shared.js +1 -1
- package/lib/commands/kb/create.js +1 -1
- package/lib/commands/kb/delete.js +1 -1
- package/lib/commands/kb/detail.js +1 -1
- package/lib/commands/kb/index.js +1 -1
- package/lib/commands/kb/list.js +1 -1
- package/lib/commands/kb/search.js +1 -1
- package/lib/commands/kb/shared.js +1 -1
- package/lib/commands/kb/update.js +1 -1
- package/lib/commands/logs/index.js +1 -1
- package/lib/commands/menu/asset-update.js +1 -1
- package/lib/commands/menu/delete.js +1 -1
- package/lib/commands/menu/external-link-create.js +1 -1
- package/lib/commands/menu/external-link-update.js +1 -1
- package/lib/commands/menu/group-create.js +1 -1
- package/lib/commands/menu/group-update.js +1 -1
- package/lib/commands/menu/index.js +1 -1
- package/lib/commands/menu/list.js +1 -1
- package/lib/commands/menu/move.js +1 -1
- package/lib/commands/menu/regroup-start.js +1 -1
- package/lib/commands/menu/rename.js +1 -1
- package/lib/commands/menu/shared/compare-table.js +1 -1
- package/lib/commands/menu/shared/delete-plan.js +1 -1
- package/lib/commands/menu/shared/facts.js +1 -1
- package/lib/commands/menu/shared/index.js +1 -1
- package/lib/commands/menu/shared/inquirer.js +1 -1
- package/lib/commands/menu/shared/local-pages.js +1 -1
- package/lib/commands/menu/shared/logic.js +1 -1
- package/lib/commands/menu/shared/mutations.js +1 -1
- package/lib/commands/menu/shared/service.js +1 -1
- package/lib/commands/menu/shared/sync-core.js +1 -1
- package/lib/commands/menu/shared/update-core.js +1 -1
- package/lib/commands/menu/shared/valid-url.js +1 -1
- package/lib/commands/menu/sync.js +1 -1
- package/lib/commands/menu/visibility-update.js +1 -1
- package/lib/commands/notification/config-create.js +1 -1
- package/lib/commands/notification/config-delete.js +1 -1
- package/lib/commands/notification/config-list.js +1 -1
- package/lib/commands/notification/config-update.js +1 -1
- package/lib/commands/notification/index.js +1 -1
- package/lib/commands/notification/shared.js +1 -1
- package/lib/commands/ocr/index.js +1 -1
- package/lib/commands/page/create.js +1 -1
- package/lib/commands/page/custom/detail.js +1 -1
- package/lib/commands/page/custom/list.js +1 -1
- package/lib/commands/page/custom/publish.js +1 -1
- package/lib/commands/page/custom/shared.js +1 -1
- package/lib/commands/page/custom/syntax.js +1 -1
- package/lib/commands/page/custom/template.js +1 -1
- package/lib/commands/page/custom/update.js +1 -1
- package/lib/commands/page/data-list-status.js +1 -1
- package/lib/commands/page/generate-start.js +1 -1
- package/lib/commands/page/generate-status.js +1 -1
- package/lib/commands/page/index.js +1 -1
- package/lib/commands/page/pull.js +1 -1
- package/lib/commands/page/push.js +1 -1
- package/lib/commands/page/relation-audit.js +1 -1
- package/lib/commands/page/restore.js +1 -1
- package/lib/commands/page/shared.js +1 -1
- package/lib/commands/page/sync.js +1 -1
- package/lib/commands/project/create/enhanced-guided-create.js +1 -1
- package/lib/commands/project/create/format-elapsed.js +1 -1
- package/lib/commands/project/create/main.d.ts +1 -0
- package/lib/commands/project/create/main.js +1 -1
- package/lib/commands/project/create/materialize-project-template.d.ts +6 -2
- package/lib/commands/project/create/materialize-project-template.js +1 -1
- package/lib/commands/project/create/project-name.js +1 -1
- package/lib/commands/project/create/project-template-archive.js +1 -1
- package/lib/commands/project/create/project-template-path.js +1 -1
- package/lib/commands/project/create/use-copy-project-template.d.ts +1 -1
- package/lib/commands/project/create/use-copy-project-template.js +1 -1
- package/lib/commands/project/create/use-format-code.js +1 -1
- package/lib/commands/project/create/use-install-dependencies.js +1 -1
- package/lib/commands/project/index.js +1 -1
- package/lib/commands/project/upgrade.js +1 -1
- package/lib/commands/registry.d.ts +2 -2
- package/lib/commands/registry.js +1 -1
- package/lib/commands/role/delete.js +1 -1
- package/lib/commands/role/detail.js +1 -1
- package/lib/commands/role/index.js +1 -1
- package/lib/commands/role/list.js +1 -1
- package/lib/commands/role/shared.d.ts +1 -1
- package/lib/commands/role/shared.js +1 -1
- package/lib/commands/role/update.js +1 -1
- package/lib/commands/role/user-add.js +1 -1
- package/lib/commands/role/user-remove.js +1 -1
- package/lib/commands/role/user-resolve.js +1 -1
- package/lib/commands/run/index.js +1 -1
- package/lib/commands/schema.js +1 -1
- package/lib/commands/sql/create.js +1 -1
- package/lib/commands/sql/delete.js +1 -1
- package/lib/commands/sql/detail.js +1 -1
- package/lib/commands/sql/exec.js +1 -1
- package/lib/commands/sql/index.js +1 -1
- package/lib/commands/sql/list.js +1 -1
- package/lib/commands/sql/pull.js +1 -1
- package/lib/commands/sql/push.js +1 -1
- package/lib/commands/sql/shared.js +1 -1
- package/lib/commands/sql/status.js +1 -1
- package/lib/commands/sql/validate.js +1 -1
- package/lib/commands/task/index.js +1 -1
- package/lib/commands/task/status.js +1 -1
- package/lib/commands/tenant/index.js +1 -1
- package/lib/commands/tenant/members-list.js +1 -1
- package/lib/commands/tenant/shared.js +1 -1
- package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
- package/lib/commands/user-account/index.js +1 -1
- package/lib/commands/workspace/add.js +1 -1
- package/lib/commands/workspace/index.js +1 -1
- package/lib/commands/workspace/remove.js +1 -1
- package/lib/config/domain-config.d.ts +10 -0
- package/lib/config/domain-config.js +1 -0
- package/lib/config/schema.d.ts +3 -1
- package/lib/config/schema.js +1 -1
- package/lib/constant/cdn.js +1 -1
- package/lib/constant/cli.js +1 -1
- package/lib/constant/defaults.js +1 -1
- package/lib/constant/domain.d.ts +23 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/constant/output.js +1 -1
- package/lib/constant/paths.js +1 -1
- package/lib/constant/region.d.ts +9 -0
- package/lib/constant/region.js +1 -0
- package/lib/constant/risk.js +1 -1
- package/lib/context/app-resolver.js +1 -1
- package/lib/context/auth-resolver.js +1 -1
- package/lib/context/config-loader.d.ts +4 -6
- package/lib/context/config-loader.js +1 -1
- package/lib/context.d.ts +2 -2
- package/lib/context.js +1 -1
- package/lib/core/alias-resolver.js +1 -1
- package/lib/core/api-client.d.ts +2 -0
- package/lib/core/api-client.js +1 -1
- package/lib/core/bff/config.js +1 -1
- package/lib/core/bff/file-system.js +1 -1
- package/lib/core/bff/hash.js +1 -1
- package/lib/core/bff/lock.js +1 -1
- package/lib/core/bff/utils.js +1 -1
- package/lib/core/db-resolver.js +1 -1
- package/lib/core/page/file-system.js +1 -1
- package/lib/core/page/hash.js +1 -1
- package/lib/core/page/lock.js +1 -1
- package/lib/core/sql-index-auditor.js +1 -1
- package/lib/core/sql-sync/config.js +1 -1
- package/lib/core/sql-sync/file-system.js +1 -1
- package/lib/core/sql-sync/hash.js +1 -1
- package/lib/core/sql-sync/lock.js +1 -1
- package/lib/core/sql-sync/utils.js +1 -1
- package/lib/core/sql-validator.js +1 -1
- package/lib/errors.d.ts +11 -1
- package/lib/errors.js +1 -1
- package/lib/framework/build-all-flags.js +1 -1
- package/lib/framework/error-output.js +1 -1
- package/lib/framework/explicit-yes.js +1 -1
- package/lib/framework/flags.js +1 -1
- package/lib/framework/help.d.ts +2 -2
- package/lib/framework/help.js +1 -1
- package/lib/framework/index.js +1 -1
- package/lib/framework/output.js +1 -1
- package/lib/framework/response.js +1 -1
- package/lib/framework/runner-alias.js +1 -1
- package/lib/framework/runner.js +1 -1
- package/lib/framework/schema-export.js +1 -1
- package/lib/framework/types.js +1 -1
- package/lib/generated/build-info.d.ts +4 -4
- package/lib/generated/build-info.js +1 -1
- package/lib/help.js +1 -1
- package/lib/postinstall.js +1 -1
- package/lib/runtime/confirmation.js +1 -1
- package/lib/runtime/event.js +1 -1
- package/lib/runtime/index.js +1 -1
- package/lib/runtime/queue.js +1 -1
- package/lib/runtime/resolve.js +1 -1
- package/lib/skills/builtin-skill.js +1 -1
- package/lib/skills/main.js +1 -1
- package/lib/skills/npx-skills-add.js +1 -1
- package/lib/skills/skill-presence.js +1 -1
- package/lib/telemetry/cli-command-trace.js +1 -1
- package/lib/telemetry/cli-help-trace.js +1 -1
- package/lib/telemetry/ensure-cli-otel-config.js +1 -1
- package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
- package/lib/telemetry/send-cli-trace-log.js +1 -1
- package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
- package/lib/types/index.d.ts +28 -0
- package/lib/utils/ai_config.d.ts +1 -2
- package/lib/utils/ai_config.js +1 -1
- package/lib/utils/apply-jq-filter.js +1 -1
- package/lib/utils/cdn-config.js +1 -1
- package/lib/utils/check-sdk-version.js +1 -1
- package/lib/utils/cli-version-check.js +1 -1
- package/lib/utils/cli-version-policy.js +1 -1
- package/lib/utils/config.js +1 -1
- package/lib/utils/entity-with-id.js +1 -1
- package/lib/utils/file-utils.js +1 -1
- package/lib/utils/guides-cdn.js +1 -1
- package/lib/utils/http-client.js +1 -1
- package/lib/utils/is-non-interactive.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/params.js +1 -1
- package/lib/utils/platform.js +1 -1
- package/lib/utils/sleep.js +1 -1
- package/lib/utils/template-replacer.js +1 -1
- package/lib/utils/update-notice.js +1 -1
- package/lib/utils/version.js +1 -1
- package/lib/utils/with-active-cookie.js +1 -1
- package/lib/utils/write-cli-side-channel.js +1 -1
- package/package.json +1 -3
- package/skills/rabetbase/SKILL.md +33 -28
- package/skills/rabetbase/guides/backend-function.md +41 -12
- package/skills/rabetbase/guides/bff-creation-workflow.md +6 -4
- package/skills/rabetbase/guides/custom-page-workflow.md +1 -1
- package/skills/rabetbase/guides/data-api-guidelines.md +8 -8
- package/skills/rabetbase/guides/database-connection-workflow.md +8 -16
- package/skills/rabetbase/guides/menu-anomaly-manual-cleanup.md +1 -6
- package/skills/rabetbase/guides/sdk-client-generation.md +146 -0
- package/skills/rabetbase/guides/sql-creation-workflow.md +1 -1
- package/skills/rabetbase/guides/troubleshooting.md +1 -1
- package/skills/rabetbase/guides/typescript-sdk.md +46 -10
- package/skills/rabetbase/references/rabetbase-api-list.md +4 -4
- package/skills/rabetbase/references/rabetbase-api-pull.md +44 -29
- package/skills/rabetbase/references/rabetbase-app-list.md +2 -2
- package/skills/rabetbase/references/rabetbase-auth-login.md +4 -2
- package/skills/rabetbase/references/rabetbase-bff-push.md +3 -1
- package/skills/rabetbase/references/rabetbase-codegen-sql.md +3 -1
- package/skills/rabetbase/references/rabetbase-config.md +75 -30
- package/skills/rabetbase/references/rabetbase-dataset-detail.md +1 -1
- package/skills/rabetbase/references/rabetbase-db-analyze.md +3 -3
- package/skills/rabetbase/references/rabetbase-db-detail.md +2 -2
- package/skills/rabetbase/references/rabetbase-db-diff-refresh.md +4 -4
- package/skills/rabetbase/references/rabetbase-db-diff.md +6 -9
- package/skills/rabetbase/references/rabetbase-doctor.md +1 -1
- package/skills/rabetbase/references/rabetbase-init.md +57 -51
- package/skills/rabetbase/references/rabetbase-kb.md +2 -0
- package/skills/rabetbase/references/rabetbase-page-create.md +1 -1
- package/skills/rabetbase/references/rabetbase-page-custom-detail.md +3 -3
- package/skills/rabetbase/references/rabetbase-page-custom-list.md +2 -2
- package/skills/rabetbase/references/rabetbase-project-create.md +12 -3
- package/skills/rabetbase/references/rabetbase-project-upgrade.md +2 -2
- package/skills/rabetbase/references/rabetbase-role-user-resolve.md +2 -2
- package/skills/rabetbase/references/rabetbase-user-account.md +1 -1
- package/skills/rabetbase/references/rabetbase-workspace.md +6 -6
- package/skills/rabetbase.manifest.json +4 -3
- package/templates/README.md +17 -28
- package/templates/generate-api/api.ts.tpl +3 -3
- package/templates/generate-api/client.ts.tpl +10 -37
- package/lib/commands/data/filter.d.ts +0 -7
- package/lib/commands/data/filter.js +0 -1
- package/lib/commands/data/getOne.d.ts +0 -7
- package/lib/commands/data/getOne.js +0 -1
- package/lib/commands/data/index.d.ts +0 -8
- package/lib/commands/data/index.js +0 -1
- package/lib/commands/data/shared.d.ts +0 -33
- package/lib/commands/data/shared.js +0 -1
- package/lib/commands/init/index.d.ts +0 -11
- package/lib/commands/init/index.js +0 -1
- package/lib/utils/rules-cdn.d.ts +0 -38
- package/lib/utils/rules-cdn.js +0 -1
- package/templates/rules/lovrabet_rules.mdc.tpl +0 -893
- package/templates/skill/SKILL.md.tpl +0 -120
|
@@ -48,10 +48,12 @@
|
|
|
48
48
|
|
|
49
49
|
## 平台配置地址
|
|
50
50
|
|
|
51
|
+
优先使用相关命令返回的 `data.links`。需要手工拼接时,以当前生效的 `appDomain` 作为 `<appDomain>`,不要硬编码 `app.lovrabet.com`:
|
|
52
|
+
|
|
51
53
|
| 类型 | 地址 |
|
|
52
54
|
|------|------|
|
|
53
|
-
| HOOK |
|
|
54
|
-
| ENDPOINT |
|
|
55
|
+
| HOOK | `<appDomain>/app/{appCode}/data/dataset/{datasetId}#api-list` |
|
|
56
|
+
| ENDPOINT | `<appDomain>/app/{appCode}/data/backend-function` |
|
|
55
57
|
|
|
56
58
|
其中 `datasetId` 需要通过 `rabetbase dataset detail --code xxx --format json` 获取。
|
|
57
59
|
|
|
@@ -85,10 +87,10 @@ Backend Function 脚本统一存放在 `.rabetbase/bff/<appCode>/` 目录下,
|
|
|
85
87
|
|
|
86
88
|
HOOK 的第一层子目录名(标识数据集)按以下优先级确定:
|
|
87
89
|
|
|
88
|
-
1. **alias**(优先):来自 `api.ts
|
|
90
|
+
1. **alias**(优先):来自 `api.ts`(`api pull` 返回的 models,按 [`sdk-client-generation.md`](sdk-client-generation.md) 维护)
|
|
89
91
|
2. **datasetCode**(兜底):当 `api.ts` 不可用时,直接使用 32 位数据集编码
|
|
90
92
|
|
|
91
|
-
|
|
93
|
+
推荐先执行 `rabetbase api pull --format compress`,再按 guide 更新 `api.ts` 以获得可读 alias。
|
|
92
94
|
|
|
93
95
|
## 文件命名与函数命名
|
|
94
96
|
|
|
@@ -108,7 +110,7 @@ HOOK 的第一层子目录名(标识数据集)按以下优先级确定:
|
|
|
108
110
|
* `delete`
|
|
109
111
|
* `aggregate`(仅在数据集 operation 实际返回时使用;METADATA 默认不会提供)
|
|
110
112
|
|
|
111
|
-
使用 `aggregate` 时,聚合列名写在 `aggregate[].column`;`field`
|
|
113
|
+
使用 `aggregate` 时,聚合列名写在 `aggregate[].column`;`field` 是兼容别名,默认使用 `column`。
|
|
112
114
|
|
|
113
115
|
Backend Function HOOK 可以挂在 `DB_TABLE` 或 `METADATA` 数据集上;是否可挂某个 operation,以平台返回的 operation types 为准。
|
|
114
116
|
|
|
@@ -343,7 +345,20 @@ rabetbase dataset detail --code <datasetCode> --format compress \
|
|
|
343
345
|
|
|
344
346
|
## 数据集调用规范
|
|
345
347
|
|
|
346
|
-
通过 `context.client.models`
|
|
348
|
+
通过 `context.client.models` 调用数据集。有物理表的 `DB_TABLE` 默认按物理表名解析,避免把 Dataset code 写入业务代码:
|
|
349
|
+
|
|
350
|
+
```javascript
|
|
351
|
+
const primary = context.client.models.byTable("<primary_physical_table>");
|
|
352
|
+
const detail = context.client.models.byTable("<detail_physical_table>", {
|
|
353
|
+
dblinkId: "<dblinkId>", // 从 rabetbase db list 确认后替换
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
const record = await primary.getOne({ id: params.id });
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
`byTable` 只在当前应用内解析。若物理表名只对应一个数据集,不需要 `dblinkId`;若同名表来自多个 dblink,必须从 `rabetbase db list` 取得真实 dblink ID 后传入,运行时遇到 `DATASET_TABLE_AMBIGUOUS` 不会按更新时间或任意 Dataset code 选择。表不存在时返回 `DATASET_TABLE_NOT_FOUND`。
|
|
360
|
+
|
|
361
|
+
`METADATA` 没有物理表,使用 Dataset code 访问;`DB_TABLE` 的 Dataset code 访问作为兼容方式。模型键格式为固定前缀 `"dataset_"` 拼接数据集编码,编码来自 `rabetbase dataset list/detail` 返回的 `code` 字段:
|
|
347
362
|
|
|
348
363
|
```javascript
|
|
349
364
|
const TABLES = {
|
|
@@ -357,7 +372,10 @@ const record = await models[TABLES.primary].getOne({ id: params.id });
|
|
|
357
372
|
|
|
358
373
|
规则:
|
|
359
374
|
|
|
360
|
-
*
|
|
375
|
+
* `DB_TABLE` 默认使用 `models.byTable("<物理表名>", { dblinkId? })`
|
|
376
|
+
* 同名表跨 dblink 时必须显式传已确认的 `dblinkId`;不要把歧义错误改为任意 Dataset code
|
|
377
|
+
* `METADATA` 使用 `"dataset_" + 数据集 code`;`DB_TABLE` 的该形式仅作为兼容路径
|
|
378
|
+
* 使用兼容路径时必须使用 `"dataset_" + 32 位数据集编码`,不要只写裸 `code`
|
|
361
379
|
* 每个映射后写 `// 数据集: ... | 数据表: ...`
|
|
362
380
|
* 查询单条统一使用 `getOne({ id })`
|
|
363
381
|
* 列表查询优先使用 `filter()`
|
|
@@ -395,7 +413,13 @@ await models[TABLES.primary].update({
|
|
|
395
413
|
|
|
396
414
|
### aggregate 调用与选型
|
|
397
415
|
|
|
398
|
-
|
|
416
|
+
`aggregate()` 只适用于 `DB_TABLE`:
|
|
417
|
+
|
|
418
|
+
- `` context.client.models.byTable("<物理表名>"[, { dblinkId }]).aggregate(params) ``:`DB_TABLE` 的推荐寻址
|
|
419
|
+
- `context.client.models[`dataset_${datasetCode}`].aggregate(params)`:仅 `DB_TABLE` 的兼容寻址
|
|
420
|
+
- `METADATA`:**不支持** `aggregate()`
|
|
421
|
+
|
|
422
|
+
实际脚本仍按上文的数据集映射,通过 `models[TABLES.xxx]` 访问;示例字段只用于展示参数契约,编写业务脚本前必须用 `dataset detail` 替换为真实字段:
|
|
399
423
|
|
|
400
424
|
```javascript
|
|
401
425
|
const aggregateResult = await models[TABLES.primary].aggregate({
|
|
@@ -597,17 +621,20 @@ export default async function runBusinessFlow(params, context) {
|
|
|
597
621
|
|
|
598
622
|
## SQL 调用规则
|
|
599
623
|
|
|
600
|
-
Backend Function
|
|
624
|
+
Backend Function 入参使用业务参数,默认通过已发布 Custom SQL 的唯一 `sqlName` + `params` 调用,避免在业务代码中硬编码 `sqlCode`。执行失败时保留并报告原始错误,根据 SQL 资源状态、参数与权限定位问题。
|
|
601
625
|
|
|
602
626
|
在 Backend Function 中使用:
|
|
603
627
|
|
|
604
628
|
```javascript
|
|
605
|
-
const rows = await context.client.sql.execute({
|
|
606
|
-
sqlCode: "example-read-list",
|
|
629
|
+
const rows = await context.client.sql.byName("<confirmed_sql_name>").execute({
|
|
607
630
|
params,
|
|
608
631
|
});
|
|
609
632
|
```
|
|
610
633
|
|
|
634
|
+
`sqlName` 只在当前应用内解析。名称不存在时返回 `SQL_NAME_NOT_FOUND`,重名时返回 `SQL_NAME_AMBIGUOUS`;两种情况都不会选择任意 SQL。使用前通过 `rabetbase sql list --name "<名称>"` 与 `rabetbase sql detail --sqlcode <code>` 确认目标 SQL 和参数契约。
|
|
635
|
+
|
|
636
|
+
Backend Function 默认使用 `byName`;`context.client.sql.execute({ sqlCode, params })` 是兼容调用方式。前端 SDK 使用 `sqlCode`。
|
|
637
|
+
|
|
611
638
|
关键差异:
|
|
612
639
|
|
|
613
640
|
* 前端 SDK:返回 `{ execSuccess, execResult }`
|
|
@@ -860,7 +887,8 @@ await context.client.db.transaction(async (tx) => {
|
|
|
860
887
|
* [ ] 顶部注释完整且占位符已替换
|
|
861
888
|
* [ ] JSDoc 已覆盖根请求参数、实际字段和返回值;显式抛出异常时已补充 `@throws`
|
|
862
889
|
* [ ] 依赖数据集、调用 BF、执行 SQL 和副作用说明与实际代码一致
|
|
863
|
-
* [ ]
|
|
890
|
+
* [ ] `DB_TABLE` 数据集优先使用 `models.byTable("<物理表名>", { dblinkId? })`;同名表已按真实 dblink ID 消歧
|
|
891
|
+
* [ ] `METADATA` 使用 `"dataset_" + 32 位编码`;`DB_TABLE` 使用该形式时属于兼容路径
|
|
864
892
|
* [ ] 单条查询统一使用 `getOne`
|
|
865
893
|
* [ ] 列表查询使用 `filter`,并从 `.tableData` 读取结果
|
|
866
894
|
* [ ] DB_TABLE 简单单表聚合优先使用 `aggregate()`,并从 `.tableData` 读取结果
|
|
@@ -869,6 +897,7 @@ await context.client.db.transaction(async (tx) => {
|
|
|
869
897
|
* [ ] 批量更新使用 `update({ id: [...] })`,没有使用不存在的 `batchUpdate()` 或记录数组参数
|
|
870
898
|
* [ ] 枚举/选择字段写入 `options[].value`,不是展示 `label`
|
|
871
899
|
* [ ] SQL 返回值按 Backend Function 语义处理
|
|
900
|
+
* [ ] Backend Function 的 Custom SQL 默认使用 `sql.byName("<唯一名称>").execute({ params })`,并已确认名称在当前应用唯一
|
|
872
901
|
* [ ] 未设置系统自动维护字段
|
|
873
902
|
* [ ] 无明显 N+1 或循环写入问题
|
|
874
903
|
* [ ] HOOK 返回 `params`,ENDPOINT 返回业务对象
|
|
@@ -29,7 +29,7 @@ rabetbase notification config-list --type EMAIL --format compress
|
|
|
29
29
|
|
|
30
30
|
从 `data.configs[]` 按 `configName` / `description` 选择配置,并使用同一项的 `configCode`。命令不会输出 `channelConfig`、`endpointUrl` 或通知凭据。没有结果或存在多个候选且业务目标不明确时,停下向用户确认;不得猜测。不要把 dataset 级通知通道的 `channelCode` 当成 Backend Function 所需的应用级 `configCode`。
|
|
31
31
|
|
|
32
|
-
Backend Function HOOK 可挂载 `DB_TABLE` 或 `METADATA` 数据集,具体 operation 以平台返回为准。`METADATA`
|
|
32
|
+
Backend Function HOOK 可挂载 `DB_TABLE` 或 `METADATA` 数据集,具体 operation 以平台返回为准。`DB_TABLE` 使用 `context.client.models.byTable("<物理表名>")`;同名物理表来自多个 dblink 时,必须从 `rabetbase db list` 取得真实 ID 后传入 `{ dblinkId }`,不要让运行时任选。`METADATA` 没有物理表,且不支持 SQL / aggregate 路径,使用 `` context.client.models[`dataset_${datasetCode}`] `` 的标准操作能力。
|
|
33
33
|
|
|
34
34
|
常用字段投影:
|
|
35
35
|
|
|
@@ -59,7 +59,8 @@ rabetbase dataset detail --code <数据集编码> --format compress \
|
|
|
59
59
|
### 5. 自检
|
|
60
60
|
* 方法名正确
|
|
61
61
|
* 单条查询用 `getOne`
|
|
62
|
-
*
|
|
62
|
+
* `DB_TABLE` 优先使用 `context.client.models.byTable("<物理表名>")`;同名表存在多个 dblink 时补 `{ dblinkId: <已确认 ID> }`
|
|
63
|
+
* `METADATA` 使用 `"dataset_" + 数据集 code`;`DB_TABLE` 仅在兼容调用时使用该形式
|
|
63
64
|
* METADATA 数据集的 Backend Function / HOOK 不走 SQL 或 aggregate;只使用平台返回的标准数据操作
|
|
64
65
|
* `filter()` 结果从 `.tableData` 读取,不是 `.list`
|
|
65
66
|
* `create()` 返回新记录 ID,不是完整对象;不要访问 `created.id`
|
|
@@ -67,6 +68,7 @@ rabetbase dataset detail --code <数据集编码> --format compress \
|
|
|
67
68
|
* 批量更新使用 `update({ id: [...] })`;不存在 `batchUpdate()`,也不传记录数组
|
|
68
69
|
* 枚举/选择字段写入 `options[].value`,不是展示 `label`
|
|
69
70
|
* Backend Function 中 `sql.execute` 返回数组,不是 `{ execSuccess, execResult }`
|
|
71
|
+
* Backend Function 中 Custom SQL 默认使用 `context.client.sql.byName("<唯一 SQL 名>").execute({ params })`;名称不唯一时先处理 `SQL_NAME_AMBIGUOUS`,不要回退任意 `sqlCode`
|
|
70
72
|
* 没有在 Backend Function 中使用前端 SDK 初始化能力,如 `createClient`、`registerModels`
|
|
71
73
|
* 参数校验、错误处理、脱敏
|
|
72
74
|
* 中文 JSDoc 已写清根请求参数、实际 `params.<字段名>`、返回值;显式抛出异常时包含 `@throws`
|
|
@@ -139,8 +141,8 @@ lovrabet bff exec --appcode <appCode> --name <functionName> --params '<json>' --
|
|
|
139
141
|
|
|
140
142
|
| 场景 | 前端 SDK | Backend Function (context.client) |
|
|
141
143
|
|------|---------|---------------------|
|
|
142
|
-
| SQL 返回值 | `{ execSuccess, execResult }` |
|
|
143
|
-
|
|
|
144
|
+
| SQL 调用 / 返回值 | `sql.execute({ sqlCode, params })`,返回 `{ execSuccess, execResult }` | 默认使用 `sql.byName(sqlName).execute({ params })`,直接返回数组;`sql.execute({ sqlCode, params })` 为兼容调用方式 |
|
|
145
|
+
| 数据集访问 | 可通过初始化/生成代码使用 alias | `DB_TABLE` 默认使用 `models.byTable(tableName, { dblinkId? })`;`METADATA` 使用 `"dataset_" + 数据集 code`,`DB_TABLE` 也支持该兼容调用方式 |
|
|
144
146
|
| `filter()` 返回 | `tableData` 为列表数据 | `tableData` 为列表数据,不是 `list` |
|
|
145
147
|
| `create()` 返回 | 以 SDK 文档/类型为准 | 新记录 ID,不是完整对象 |
|
|
146
148
|
| `batchCreate()` 返回 | 以 SDK 文档/类型为准 | 新记录 ID 数组;直接传非空对象数组 |
|
|
@@ -109,7 +109,7 @@ page create --page-pattern BLANK
|
|
|
109
109
|
|
|
110
110
|
判断顺序:先确认单一数据集请求能否满足需求;数据组合和数据库计算是主要问题时选择 Custom SQL;当前用户、角色、数据范围或业务规则需要额外控制时选择 Backend Function。三种方式可以根据已确认的 SDK 契约配合使用,但不得自行推测方法、参数或返回结构。
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
页面通过已发布 Custom SQL 的 `sqlCode` + `params` 执行查询;Backend Function 默认使用 `context.client.sql.byName(sqlName).execute({ params })`,`sql.execute({ sqlCode, params })` 仅作兼容路径。Dataset、Custom SQL 或 Backend Function 执行失败时,保留并报告原始错误,根据资源状态、参数与权限定位问题。
|
|
113
113
|
|
|
114
114
|
页面需要读取或写入数据集时,先按以下顺序确认事实:
|
|
115
115
|
|
|
@@ -67,22 +67,22 @@ rabetbase dataset detail --code <数据集编码> --format compress \
|
|
|
67
67
|
|
|
68
68
|
---
|
|
69
69
|
|
|
70
|
-
##
|
|
70
|
+
## 真实行数据:交接给 `lovrabet`
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
不需要真实行数据时,`lovrabet` CLI 可以不装;本 skill 的结构/发布主路径始终基于 **`rabetbase`**(`dataset detail`、`sql exec` 验证已发布 SQL 等)。
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
一旦要验证真实业务行数据,必须交接给 **`lovrabet data filter`** / **`lovrabet data getOne`**(与 `@lovrabet/sdk` 相同语义)。`rabetbase` 与 `lovrabet` Skill 不互斥:不可用时**报告阻断**并提示安装,不要静默安装或修复运行态 CLI,也不要把 `rabetbase sql exec` 当成行数据查询的通用替代。
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
若本机已安装 **Lovrabet 运行时 CLI**(npm 包 **`@lovrabet/lovrabet-cli`**,命令名 **`lovrabet`**,须 **≥ 2.0**),可在终端对照调试前端 / Backend Function 里的 `filter`、`getOne`。低于 2.0 请先升级:`npm install -g @lovrabet/lovrabet-cli@^2.0.0`。自检:`lovrabet --version`。
|
|
77
77
|
|
|
78
78
|
**注意:**
|
|
79
79
|
|
|
80
80
|
| 点 | 说明 |
|
|
81
81
|
|----|------|
|
|
82
|
-
|
|
|
83
|
-
|
|
|
84
|
-
|
|
|
85
|
-
| **配置与认证** | `lovrabet` 与 `rabetbase`
|
|
82
|
+
| **结构 vs 行数据** | 结构用 `rabetbase dataset detail`。真实行数据必须用 `lovrabet data filter` / `data getOne`。 |
|
|
83
|
+
| **未安装时** | 报告阻断,并提示安装 `lovrabet` Skill(`npx skills add lovrabet/lovrabet-cli`)和 CLI。不要由本 Skill 静默安装或修复。**`rabetbase sql exec` 只验证已发布 SQL 的可执行性与结果结构。** |
|
|
84
|
+
| **≥ 2.0** | 本节 `data` 子命令以 **2.0+** 为准;版本不符时先升级。 |
|
|
85
|
+
| **配置与认证** | `lovrabet` 与 `rabetbase` 的配置项、鉴权方式可能不完全相同,按各自 CLI 文档配置。 |
|
|
86
86
|
| **详细用法** | 以 `lovrabet data --help`、`lovrabet data filter --help` 为准(参数多为 `--code` + `--params` JSON)。 |
|
|
87
87
|
|
|
88
88
|
示例(仅作形态参考,需本机已安装且已登录/配置):
|
|
@@ -41,19 +41,11 @@ trace/plan → 见下一节(分析任务专用)
|
|
|
41
41
|
### 差异读取策略(所有流程共用)
|
|
42
42
|
|
|
43
43
|
```text
|
|
44
|
-
|
|
45
|
-
→
|
|
46
|
-
|
|
47
|
-
用户明确要求实时/强制刷新:
|
|
48
|
-
→ 无论 tableCount 多少,走“刷新后读取”
|
|
49
|
-
|
|
50
|
-
用户明确要求不刷新:
|
|
51
|
-
→ 直接读取;tableCount > 200 时提示结果可能滞后
|
|
44
|
+
用户明确要求不分析、不刷新或只看现有结果:
|
|
45
|
+
→ 直接读取,并说明结果可能不是最新事实
|
|
52
46
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
tableCount > 200 → 刷新后读取
|
|
56
|
-
tableCount 缺失 → 直接读取并说明新鲜度未知,不隐式写入
|
|
47
|
+
其他情况(默认):
|
|
48
|
+
→ 无论 tableCount 多少或是否缺失,都走“刷新后读取”
|
|
57
49
|
|
|
58
50
|
直接读取:
|
|
59
51
|
db diff --id <id> --all --changed-only
|
|
@@ -67,7 +59,7 @@ db detail --id <id>
|
|
|
67
59
|
→ FAILED / CANCELLED 停止,不自动重提
|
|
68
60
|
```
|
|
69
61
|
|
|
70
|
-
|
|
62
|
+
CLI 不再依据 `tableCount` 推断异步刷新是否值得执行。默认通过一次可跟踪的异步任务取得最新差异事实,避免小库、数量未知或服务端实现变化时沿用旧快照。`db diff --view all` 是实时全部表分页,用于查看无差异表或主动重新分析已有表;但在 DBAgent 增量分析工作流中,仍按上述默认策略先完成异步差异刷新,除非用户明确要求跳过。
|
|
71
63
|
|
|
72
64
|
差异刷新与 schema 分析是两个独立任务:`diff-refresh-*` 只刷新差异事实,`analyze-*` 才把选中表同步为数据集。两类 traceId 不得混用。
|
|
73
65
|
|
|
@@ -113,7 +105,7 @@ db analyze-status --id <id> --plan <planId> # 轮询直到终态
|
|
|
113
105
|
|
|
114
106
|
```text
|
|
115
107
|
db detail --id <id>
|
|
116
|
-
|
|
108
|
+
按“差异读取策略”默认刷新后执行 db diff --id <id> --all --changed-only
|
|
117
109
|
→ 只取 data.toAnalyzeTables;用户要求跳过的表先从列表中剔除
|
|
118
110
|
db analyze-batch-plan --id <id> --tables <toAnalyzeTables> --format compress
|
|
119
111
|
→ 保存 data.batches;这是本地 batch plan,不是服务端任务 plan
|
|
@@ -135,7 +127,7 @@ db analyze-batch-plan --id <id> --tables <toAnalyzeTables> --format compress
|
|
|
135
127
|
→ 未知状态:停止自动推进并报告,不猜测为终态
|
|
136
128
|
|
|
137
129
|
全部批次处理完毕:
|
|
138
|
-
|
|
130
|
+
按“差异读取策略”默认刷新后执行 db diff --id <id> --all --changed-only
|
|
139
131
|
→ 重新读取完整事实;目标差异收敛后才算本轮分析完成
|
|
140
132
|
→ 仍未收敛则只对剩余非删除表进入下面的逐表恢复
|
|
141
133
|
```
|
|
@@ -151,7 +143,7 @@ db analyze-batch-plan --id <id> --tables <toAnalyzeTables> --format compress
|
|
|
151
143
|
→ 到达终态后才处理下一张表
|
|
152
144
|
|
|
153
145
|
全部单表任务结束后:
|
|
154
|
-
|
|
146
|
+
按“差异读取策略”默认刷新后执行 db diff --id <id> --all --changed-only
|
|
155
147
|
→ 以最终 `db diff --all --changed-only` 的 data.toAnalyzeTables 判断是否收敛
|
|
156
148
|
→ 已尝试的剩余表只恢复一次,不再次循环提交
|
|
157
149
|
```
|
|
@@ -13,12 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
## 平台入口
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
```text
|
|
19
|
-
production https://app.lovrabet.com/app/<appCode>
|
|
20
|
-
daily https://daily.lovrabet.com/web-app/app/<appCode>
|
|
21
|
-
```
|
|
16
|
+
优先使用命令返回的页面链接。需要手工拼接时,从当前生效的 `appDomain` 得到 `<appBaseUrl>`,不要硬编码官方域名;独立部署和不同 region 的入口可能不同。
|
|
22
17
|
|
|
23
18
|
总入口:
|
|
24
19
|
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# SDK 客户端代码生成(api.ts / client.ts)
|
|
2
|
+
|
|
3
|
+
> 目标:根据 `rabetbase api pull` 返回的数据集事实,生成或更新浏览器子应用的 `src/api/api.ts` 与 `src/api/client.ts`,并保留项目已有的自定义写法。
|
|
4
|
+
>
|
|
5
|
+
> CLI 不再每次覆盖 TypeScript。`api pull` 只保证:刷新 `sdk-config.ts`、返回 `data.models`,并在文件缺失时写入 Cookie-first 脚手架。已有文件由本指南更新。
|
|
6
|
+
|
|
7
|
+
## 何时执行
|
|
8
|
+
|
|
9
|
+
出现以下任一情况时,先读本指南再改 `src/api/`:
|
|
10
|
+
|
|
11
|
+
- 刚执行 `rabetbase api pull` 或 `rabetbase project create`(带 appCode)
|
|
12
|
+
- 平台增删了 Dataset,本地 `models` 过期
|
|
13
|
+
- `api.ts` / `client.ts` 缺失、空 `models: []`、或 `LOVRABET_APP_CODE` 仍是 `NOT-SET`
|
|
14
|
+
- 用户要求修复 SDK 客户端初始化
|
|
15
|
+
|
|
16
|
+
不要凭空编造 `datasetCode`。不要把本指南里的浏览器 Cookie 客户端写成服务端 `accessKey` 客户端。
|
|
17
|
+
|
|
18
|
+
## 工作流
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
rabetbase api pull --format compress
|
|
22
|
+
→ 读 data.models / data.configName / data.isDefaultConfig / data.files / data.needsAgentMerge
|
|
23
|
+
→ 读已有 api.ts、client.ts、sdk-config.ts(含 {prefix}-api.ts / {prefix}-client.ts)
|
|
24
|
+
→ 按事实更新 models,保留本地 extras
|
|
25
|
+
→ 不要改已经正确的 createClient({ apiConfigName, ...LOVRABET_SDK_CONFIG })
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
1. 执行 `rabetbase api pull --format compress`(需要人类可读缩进时用 `--format json`)。
|
|
29
|
+
2. 使用返回的 `data.models`,不要手写或猜测 `datasetCode`。也可用 `rabetbase api list --format compress` 核对目录,但写文件以 pull 的 `data.models` 为准。
|
|
30
|
+
3. 先读现有文件再写:
|
|
31
|
+
- 默认单应用:`src/api/api.ts`、`src/api/client.ts`、`src/api/sdk-config.ts`
|
|
32
|
+
- 多应用非 default:`{name}-api.ts` / `{name}-client.ts`(`data.files.api.path` / `data.files.client.path`)
|
|
33
|
+
4. `sdk-config.ts` 由 CLI 维护(`data.files.sdkConfig.action === "refreshed"`),不要往里面写 `cookie` / `accessKey` / `token`。
|
|
34
|
+
5. 看 `data.needsAgentMerge` 和 `data.files.*.action`,**不要**用已删除的 `wroteScaffold`:
|
|
35
|
+
- `needsAgentMerge === false` 且 `api`/`client` 均为 `created` 或 `overwritten`:脚手架已按当前 `models` 写好,只需检查项目 extras。
|
|
36
|
+
- `needsAgentMerge === true`:至少有一个 TypeScript 文件被 **preserved**。即使 `client` 刚 `created`,过期的 `api.ts` 仍要按下方规则合并,**不要**当成脚手架已完成。
|
|
37
|
+
6. 默认应用:`data.isDefaultConfig === true`,`data.configName === "default"`,代码里用 `CONFIG_NAMES.DEFAULT`。
|
|
38
|
+
7. 具名应用:`data.isDefaultConfig === false`,`data.configName` 是不含引号的名字(如 `order`),`registerModels(..., "order")` 与 `apiConfigName: "order"`。不要把 `configName` 再包一层引号。
|
|
39
|
+
|
|
40
|
+
## 权威结构
|
|
41
|
+
|
|
42
|
+
浏览器子应用的权威形态与 `templates/projects/sub-app-react-demo/src/api/` 一致。脚手架模板是 `templates/generate-api/*.tpl`,生成结果应对齐 demo,而不是另造一套。
|
|
43
|
+
|
|
44
|
+
### sdk-config.ts(路由,无凭证)
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
/**
|
|
48
|
+
* Lovrabet SDK runtime routing.
|
|
49
|
+
* Generated by Rabetbase CLI. Do not add credentials to this file.
|
|
50
|
+
*/
|
|
51
|
+
export const LOVRABET_SDK_CONFIG = {} as const;
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
CLI 可能写入 `region: "id"` 或 `runtimeDomain: "https://…"`。不要手改成认证字段。
|
|
55
|
+
|
|
56
|
+
### api.ts
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { registerModels, CONFIG_NAMES, type ModelsConfig } from "@lovrabet/sdk";
|
|
60
|
+
|
|
61
|
+
export const LOVRABET_APP_CODE = "app-xxxxxxxx";
|
|
62
|
+
|
|
63
|
+
export const LOVRABET_MODELS_CONFIG: ModelsConfig = {
|
|
64
|
+
appCode: LOVRABET_APP_CODE,
|
|
65
|
+
models: [
|
|
66
|
+
{ datasetCode: "abc123", tableName: "orders", name: "订单", alias: "orders" },
|
|
67
|
+
],
|
|
68
|
+
} as const;
|
|
69
|
+
|
|
70
|
+
registerModels(LOVRABET_MODELS_CONFIG, CONFIG_NAMES.DEFAULT);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- 默认应用:`data.isDefaultConfig` 为 true 时用 `CONFIG_NAMES.DEFAULT`。
|
|
74
|
+
- 非默认 / 具名应用:用 `data.configName`(不含引号的字符串,如 `order`)作为 `registerModels` 第二参数和 `apiConfigName`,不要再 import 未使用的 `CONFIG_NAMES`。
|
|
75
|
+
- 数字开头的文件前缀使用 `APP_` 变量前缀(如 `APP_5B732428_APP_CODE`),运行时 `appCode` 保持原值。
|
|
76
|
+
- `registerModels` 是 `@lovrabet/sdk` 的独立命名导出,**不是** `client.registerModels()`。
|
|
77
|
+
|
|
78
|
+
### client.ts(Cookie-first)
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
import { createClient, CONFIG_NAMES } from "@lovrabet/sdk";
|
|
82
|
+
import "./api";
|
|
83
|
+
import { LOVRABET_SDK_CONFIG } from "./sdk-config";
|
|
84
|
+
|
|
85
|
+
export const lovrabetClient = createClient({
|
|
86
|
+
apiConfigName: CONFIG_NAMES.DEFAULT,
|
|
87
|
+
...LOVRABET_SDK_CONFIG,
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- 必须 `import "./api"`(或 `./{prefix}-api`)以执行 `registerModels`。
|
|
92
|
+
- 浏览器子应用默认登录态 Cookie:省略 `authMode`,**不要**在此文件写入 `accessKey` / `token`。
|
|
93
|
+
- 已有 `createClient({ apiConfigName, ...LOVRABET_SDK_CONFIG })` 且与 `data.isDefaultConfig` / `data.configName` 一致时,不要改参数形态。
|
|
94
|
+
- 非生产环境脚手架可能带 `env: "daily"`;已有客户端已能工作则不要为了对称去改。
|
|
95
|
+
|
|
96
|
+
## 合并规则
|
|
97
|
+
|
|
98
|
+
以 `data.models` 为 Dataset 清单的唯一事实来源:
|
|
99
|
+
|
|
100
|
+
- **新增**:pull 有、本地没有的 `datasetCode`,追加到 `models`
|
|
101
|
+
- **删除**:本地有、pull 没有的 `datasetCode`,从 `models` 移除
|
|
102
|
+
- **更新**:同一 `datasetCode` 的 `tableName` / `name` 以 pull 为准
|
|
103
|
+
- **别名**:本地已有且仍对应同一 `datasetCode` 的 `alias` 保留;新建项使用 pull 给出的 `alias`
|
|
104
|
+
- **保留 extras**:额外的 `registerModels(...)`、额外 client 导出、项目自定义注释(非 Generated 头)不要删
|
|
105
|
+
- **多应用**:继续使用 CLI 的 `{name}-api.ts` / `{name}-client.ts` 命名,不要把多个 app 的 models 揉进同一个 `api.ts`
|
|
106
|
+
|
|
107
|
+
## 认证(不要写进浏览器 client.ts)
|
|
108
|
+
|
|
109
|
+
浏览器子应用走 Cookie,本指南的默认 `client.ts` 不声明 `authMode`。
|
|
110
|
+
|
|
111
|
+
仅当用户明确要求**服务端**文件时才使用密钥,且必须显式 `authMode`:
|
|
112
|
+
|
|
113
|
+
- 仅 `accessKey` → `authMode: "client-ak"`,且只放服务端
|
|
114
|
+
- `accessKey`(+ 可选 `secretKey`)签名,或预计算 `token` + 配对 `timestamp` → `authMode: "openapi"`
|
|
115
|
+
- 预计算 token 必须同时提供 `timestamp`,否则首次请求报 `timestamp is required`
|
|
116
|
+
- OpenAPI 凭据通过 `X-Token` / `X-Time-Stamp` 传递,不是 `Authorization: Bearer`
|
|
117
|
+
|
|
118
|
+
服务端写法详见 [`typescript-sdk.md`](typescript-sdk.md)。
|
|
119
|
+
|
|
120
|
+
## 禁止
|
|
121
|
+
|
|
122
|
+
- `client.registerModels(...)`
|
|
123
|
+
- 把 `filter()` 返回值当数组:必须 `result.tableData`
|
|
124
|
+
- `result.total`:总数是 `result.paging.totalCount`
|
|
125
|
+
- `client.models.dataset_[code]`:动态访问用 `client.models[\`dataset_${code}\`]`
|
|
126
|
+
- 传了 `accessKey` / `token` 却省略 `authMode`
|
|
127
|
+
- 把 Cookie / AccessKey 写进 `sdk-config.ts` 或浏览器 `client.ts`
|
|
128
|
+
- 在已有正确 `createClient` 形态上改成另一种参数风格
|
|
129
|
+
|
|
130
|
+
## pull 输出字段
|
|
131
|
+
|
|
132
|
+
`rabetbase api pull --format compress` 的 `data`(单应用):
|
|
133
|
+
|
|
134
|
+
| 字段 | 含义 |
|
|
135
|
+
|------|------|
|
|
136
|
+
| `appCode` | 当前应用 |
|
|
137
|
+
| `configName` | `"default"` 或具名应用名(不含 TS 引号) |
|
|
138
|
+
| `isDefaultConfig` | 默认应用为 `true` |
|
|
139
|
+
| `models[]` | `datasetCode` / `tableName` / `name` / `alias` |
|
|
140
|
+
| `sdkRouting` | `{ region?: "id", runtimeDomain?: string }` |
|
|
141
|
+
| `files.api` / `files.client` / `files.sdkConfig` | `{ path, action }`;`action` 为 `created` / `overwritten` / `preserved` / `refreshed` |
|
|
142
|
+
| `needsAgentMerge` | 任一 TypeScript 被 `preserved` 时为 `true`,必须合并 `models` |
|
|
143
|
+
| `apiFilePath` / `clientFilePath` / `sdkConfigPath` | 与 `files.*.path` 相同,兼容路径字段 |
|
|
144
|
+
| `modelCount` / `datasetCount` | 模型数量 |
|
|
145
|
+
|
|
146
|
+
多应用时 `data.apps[]` 为上述对象的数组。
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
平台是唯一 source of truth。团队长期维护 SQL 时,优先使用 **本地同步工作流**:`sql create / pull / status / push / delete` + `.rabetbase/sql.lock.json`。
|
|
8
8
|
|
|
9
|
-
SQL 内容编写、参数绑定与 MyBatis 语法以 [`sql-mybatis.md`](sql-mybatis.md)
|
|
9
|
+
SQL 内容编写、参数绑定与 MyBatis 语法以 [`sql-mybatis.md`](sql-mybatis.md) 为准。页面执行已发布的 Custom SQL 时使用 `sqlCode` + `params`;Backend Function 默认使用 `context.client.sql.byName(sqlName).execute({ params })`,`sql.execute({ sqlCode, params })` 仅作兼容路径。
|
|
10
10
|
|
|
11
11
|
## 工作流
|
|
12
12
|
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
* ❌ 错误排查方向:建议用户重装各种库
|
|
56
56
|
* ✅ **强制动作**:
|
|
57
|
-
* 建议用户检查 `.
|
|
57
|
+
* 建议用户检查 `.rabetbase.json` 中的 `appcode` 是否正确
|
|
58
58
|
* 建议用户在终端执行 `rabetbase auth` 检查是否未登录或 Cookie 过期
|
|
59
59
|
* 帮用户执行 `rabetbase dataset list --format json` 确认该环境到底有哪些可用数据集
|
|
60
60
|
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
|
|
17
17
|
不要把本指南里的 `createClient`、`registerModels` 等前端 / Node SDK 初始化能力套用到 Backend Function。Backend Function 内只使用平台注入的 `context.client`。
|
|
18
18
|
|
|
19
|
+
生成或更新项目里的 `src/api/api.ts` / `client.ts` 时,先 `rabetbase api pull --format compress`,再遵守 [`sdk-client-generation.md`](sdk-client-generation.md)。浏览器子应用的默认 client 是 Cookie + `...LOVRABET_SDK_CONFIG`,不要把下面的服务端 `accessKey` 示例写进 `src/api/client.ts`。
|
|
20
|
+
|
|
19
21
|
## 初始化规则
|
|
20
22
|
|
|
21
23
|
必须使用 `createClient` 命名导出,禁止使用 `new LovrabetClient()`:
|
|
@@ -25,6 +27,7 @@ import { createClient } from "@lovrabet/sdk";
|
|
|
25
27
|
|
|
26
28
|
const client = createClient({
|
|
27
29
|
appCode: "your-app-code",
|
|
30
|
+
authMode: "client-ak", // 必须显式声明;否则一律走 cookie 模式,accessKey 会被忽略
|
|
28
31
|
accessKey: process.env.RABETBASE_ACCESS_KEY, // 仅在服务端使用
|
|
29
32
|
models: [
|
|
30
33
|
{ tableName: "users", datasetCode: "39f758e7b38c476b8bb3996771a601a1", alias: "users" }
|
|
@@ -32,6 +35,12 @@ const client = createClient({
|
|
|
32
35
|
});
|
|
33
36
|
```
|
|
34
37
|
|
|
38
|
+
认证模式必须显式声明,不会按字段自动推断:
|
|
39
|
+
|
|
40
|
+
* 仅 `accessKey` → `authMode: "client-ak"`
|
|
41
|
+
* `accessKey`(+可选 `secretKey`)签名,或已配对的预计算 `token` + `timestamp` → `authMode: "openapi"`(凭据通过 `X-Token` / `X-Time-Stamp` 请求头传递,不是 Authorization Bearer;用 `token` 时必须同时提供配对的 `timestamp`,否则首次请求报 `timestamp is required`)
|
|
42
|
+
* 浏览器 Cookie 环境 → 省略 `authMode`(默认 cookie)
|
|
43
|
+
|
|
35
44
|
## 1. 模型查询 (Filter API)
|
|
36
45
|
|
|
37
46
|
这是操作模型(表)的**最高优** API。
|
|
@@ -47,7 +56,7 @@ const client = createClient({
|
|
|
47
56
|
* ❌ `where: { status: 'active' }`
|
|
48
57
|
* ✅ `where: { status: { $eq: 'active' } }`
|
|
49
58
|
|
|
50
|
-
支持的操作符:`$eq`, `$ne`, `$
|
|
59
|
+
支持的操作符:`$eq`, `$ne`, `$gt`, `$lt`, `$gte`(或兼容旧写法 `$gteq`), `$lte`(或兼容旧写法 `$lteq`), `$contain`, `$startWith`, `$endWith`, `$in`, `$notNull`。`$gteq` / `$lteq` 是后端保留的别名,与 `$gte` / `$lte` 映射到同一 SQL 比较,新代码推荐用 `$gte` / `$lte`。
|
|
51
60
|
|
|
52
61
|
逻辑组合:
|
|
53
62
|
```typescript
|
|
@@ -80,7 +89,7 @@ const result = await client.models.article.filter({
|
|
|
80
89
|
|
|
81
90
|
**接口**:
|
|
82
91
|
```typescript
|
|
83
|
-
client.models
|
|
92
|
+
client.models[`dataset_${code}`].update({
|
|
84
93
|
id: number | string | (number | string)[]; [key: string]: any
|
|
85
94
|
})
|
|
86
95
|
```
|
|
@@ -108,7 +117,7 @@ await client.models.customer.update({
|
|
|
108
117
|
|
|
109
118
|
**接口**:
|
|
110
119
|
```typescript
|
|
111
|
-
client.models
|
|
120
|
+
client.models[`dataset_${code}`].delete({ id: number | string | (number | string)[] })
|
|
112
121
|
```
|
|
113
122
|
|
|
114
123
|
**示例**:
|
|
@@ -122,8 +131,9 @@ const inactiveUsers = await client.models.customer.filter({
|
|
|
122
131
|
select: ['id']
|
|
123
132
|
});
|
|
124
133
|
|
|
134
|
+
// filter() 返回 ListResponse({ tableData, paging, tableColumns }),列表数据在 tableData
|
|
125
135
|
await client.models.customer.delete({
|
|
126
|
-
id: inactiveUsers.map(u => u.id)
|
|
136
|
+
id: inactiveUsers.tableData.map(u => u.id)
|
|
127
137
|
});
|
|
128
138
|
```
|
|
129
139
|
|
|
@@ -148,17 +158,43 @@ async function updateInBatches(ids: number[], batchSize = 1000) {
|
|
|
148
158
|
|
|
149
159
|
### 别名模式(Alias Pattern)
|
|
150
160
|
|
|
151
|
-
|
|
161
|
+
在前端 / Node SDK 中给数据集配置 `alias` 后,可用别名访问模型,批量操作同样支持。此能力不适用于 Backend Function 的 `context.client`。
|
|
162
|
+
|
|
163
|
+
别名在初始化时配置,最常见的是直接写进 `createClient` 的 `models`:
|
|
152
164
|
|
|
153
165
|
```typescript
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
166
|
+
import { createClient } from "@lovrabet/sdk";
|
|
167
|
+
|
|
168
|
+
const client = createClient({
|
|
169
|
+
appCode: "your-app-code",
|
|
170
|
+
models: [
|
|
171
|
+
{ tableName: "orders", datasetCode: "abc123", alias: "primary" },
|
|
172
|
+
{ tableName: "order_items", datasetCode: "def456", alias: "detail" },
|
|
173
|
+
],
|
|
158
174
|
});
|
|
159
175
|
|
|
160
176
|
// 使用别名批量操作
|
|
161
|
-
await client.models.primary.update({ id: [1, 2, 3], status:
|
|
177
|
+
await client.models.primary.update({ id: [1, 2, 3], status: "active" });
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
`registerModels` 是 `@lovrabet/sdk` 的独立命名导出(不是 client 实例方法),用于把一份完整 `ModelsConfig`(`{ appCode, models }`)注册到全局配置表,再由 `createClient` 按配置名引用(CLI 生成的 `src/api/*.ts` 就是这样自动注册的):
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
import { createClient, registerModels } from "@lovrabet/sdk";
|
|
184
|
+
|
|
185
|
+
registerModels(
|
|
186
|
+
{
|
|
187
|
+
appCode: "your-app-code",
|
|
188
|
+
models: [
|
|
189
|
+
{ tableName: "orders", datasetCode: "abc123", alias: "primary" },
|
|
190
|
+
{ tableName: "order_items", datasetCode: "def456", alias: "detail" },
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
"prod",
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
const client = createClient("prod"); // 或 createClient({ apiConfigName: "prod", authMode: "openapi", token, timestamp, env })(用 token 时必须显式 authMode 且带配对 timestamp)
|
|
197
|
+
await client.models.primary.update({ id: [1, 2, 3], status: "active" });
|
|
162
198
|
```
|
|
163
199
|
|
|
164
200
|
## 2. 自定义 SQL (SQL API)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# api list
|
|
2
2
|
|
|
3
|
-
列出当前 App
|
|
3
|
+
列出当前 App 下平台返回的数据集(Dataset)模型事实。本命令查询远端 Dataset 元信息,**不检查**本地是否已生成 `api.ts` / `client.ts`。
|
|
4
4
|
|
|
5
5
|
## 命令
|
|
6
6
|
|
|
@@ -23,7 +23,7 @@ rabetbase api list --format json
|
|
|
23
23
|
|
|
24
24
|
| 参数 | 说明 |
|
|
25
25
|
|------|------|
|
|
26
|
-
| `--global` |
|
|
26
|
+
| `--global` | 多应用时显式从「全局+项目」双层解析 `apps`;默认仅项目级 `apps` |
|
|
27
27
|
| `--app <name>` | 多应用模式下,指定应用名称 |
|
|
28
28
|
| `--appcode <code>` | 直接指定 appcode |
|
|
29
29
|
| `--format json` | JSON 格式输出(用于脚本解析) |
|
|
@@ -46,7 +46,7 @@ rabetbase api list --format json
|
|
|
46
46
|
- **加 `--app <name>`**:仅列出指定应用的模型
|
|
47
47
|
- **加 `--appcode <code>`**:反查到对应 app profile,使用其 cookie/env
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
`inherit` 不是受支持的配置项;`--global` 始终显式读取全局和项目双层 apps。
|
|
50
50
|
|
|
51
51
|
## 风险等级
|
|
52
52
|
|
|
@@ -55,4 +55,4 @@ rabetbase api list --format json
|
|
|
55
55
|
## 前置条件
|
|
56
56
|
|
|
57
57
|
- 已完成 `rabetbase auth` 登录
|
|
58
|
-
-
|
|
58
|
+
- 已配置 appcode(单应用或多应用)
|