@oj-module/cli 0.2.69 → 0.2.71
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/devkit/README.md +10 -8
- package/devkit/framework-dev.md +1 -1
- package/devkit/manual.md +45 -19
- package/devkit/module-dev-and-cdn-playground.md +20 -14
- package/devkit/publish-walkthrough.md +132 -43
- package/devkit/wecom-customer-reauth-guide.md +110 -0
- package/package.json +2 -2
- package/shell-dist/assets/{runtime.zrv2zhj9j0.js → runtime.7x99hmm020.js} +2 -2
- package/shell-dist/bundles/oj-market-0.2.0.tgz +0 -0
- package/shell-dist/bundles/oj-market-0.2.0.tgz.sig +8 -0
- package/shell-dist/index.html +4 -4
- package/shell-dist/versions.json +3 -3
- package/src/__tests__/list.test.ts +7 -7
- package/src/__tests__/oj-health-host.test.ts +19 -0
- package/src/__tests__/site-tenant-header.test.ts +2 -2
- package/src/__tests__/templates-builtin-list.test.ts +47 -0
- package/src/__tests__/templates-schema-columns.test.ts +11 -2
- package/src/__tests__/templates-tenant-scope.test.ts +2 -3
- package/src/__tests__/users-roles-display.test.ts +84 -0
- package/src/bundle.ts +1 -1
- package/src/contract/__tests__/market-client.integration.test.ts +23 -22
- package/src/enable.ts +2 -2
- package/src/init.ts +45 -0
- package/src/install.ts +5 -5
- package/src/lifecycle/__tests__/install.test.ts +29 -29
- package/src/lifecycle/__tests__/market-bundle.test.ts +87 -0
- package/src/lifecycle/__tests__/publish.test.ts +8 -10
- package/src/lifecycle/__tests__/trust.test.ts +14 -14
- package/src/lifecycle/__tests__/uninstall.test.ts +4 -4
- package/src/list.ts +3 -3
- package/src/market/__tests__/bootstrap.test.ts +24 -7
- package/src/market/__tests__/failure-playbook.test.ts +0 -1
- package/src/market/__tests__/remote-push.test.ts +228 -0
- package/src/market/__tests__/verify.test.ts +45 -207
- package/src/market/bootstrap.ts +12 -7
- package/src/market/command.ts +33 -35
- package/src/market/db-seed.ts +129 -0
- package/src/market/failure-playbook.ts +3 -9
- package/src/market/fixture.ts +2 -6
- package/src/market/publish.ts +145 -89
- package/src/market/remote-push.ts +236 -0
- package/src/market/trial.ts +2 -2
- package/src/market/verify.ts +17 -270
- package/src/market/walkthrough.ts +38 -63
- package/src/oj.ts +13 -2
- package/src/preview.ts +5 -3
- package/src/publish.ts +3 -2
- package/src/scaffold-guard.ts +4 -0
- package/src/site.ts +1 -1
- package/src/trust.ts +8 -8
- package/src/uninstall.ts +2 -2
- package/src/usage.ts +23 -21
- package/templates/config.yaml +22 -3
- package/templates/init.include.yaml +16 -11
- package/templates/openapi.json +3948 -3655
- package/templates/src/.ojm-builtin.json +13 -0
- package/templates/src/README.md +5 -2
- package/templates/src/app/api/_platform/README.md +3 -2
- package/templates/src/app/api/_platform/_lifecycle/atomic.ts +7 -2
- package/templates/src/app/api/_platform/_lifecycle/bundle-converge.ts +158 -0
- package/templates/src/app/api/_platform/_lifecycle/history.ts +3 -2
- package/templates/src/app/api/_platform/_lifecycle/installer.ts +25 -5
- package/templates/src/app/api/_platform/_lifecycle/local-archive.ts +61 -0
- package/templates/src/app/api/_platform/_lifecycle/manifest-of-upload.ts +62 -0
- package/templates/src/app/api/_platform/_lifecycle/steps/preflight.ts +12 -2
- package/templates/src/app/api/_platform/_lifecycle/steps/reload.ts +4 -1
- package/templates/src/app/api/_platform/_lifecycle/steps/smoke.ts +8 -2
- package/templates/src/app/api/_platform/_lifecycle/types.ts +1 -1
- package/templates/src/app/api/_platform/_lifecycle/uninstall.ts +14 -5
- package/templates/src/app/api/_platform/_shared/site-facade.ts +31 -0
- package/templates/src/app/api/_platform/manifest.yaml +1 -2
- package/templates/src/app/api/_platform/migrations/0003__market_catalog.mysql.sql +6 -0
- package/templates/src/app/api/_platform/migrations/0003__market_catalog.pg.sql +6 -0
- package/templates/src/app/api/_platform/migrations/0003__market_catalog.sql +18 -0
- package/templates/src/app/api/_platform/migrations/0004__market_drop_source_seq.mysql.sql +6 -0
- package/templates/src/app/api/_platform/migrations/0004__market_drop_source_seq.pg.sql +6 -0
- package/templates/src/app/api/_platform/migrations/0004__market_drop_source_seq.sql +6 -0
- package/templates/src/app/api/_platform/migrations/0005__market_sig_registry.mysql.sql +8 -0
- package/templates/src/app/api/_platform/migrations/0005__market_sig_registry.pg.sql +8 -0
- package/templates/src/app/api/_platform/migrations/0005__market_sig_registry.sql +8 -0
- package/templates/src/app/api/_platform/schema.yaml +8 -11
- package/templates/src/app/api/_platform/seed.mysql.sql +1 -1
- package/templates/src/app/api/_platform/seed.pg.sql +1 -1
- package/templates/src/app/api/_platform/seed.sql +1 -1
- package/templates/src/app/api/auth/_shared/wecom/sync.ts +6 -0
- package/templates/src/app/web/_platform/__client/api.schemas.ts +0 -114
- package/templates/src/app/web/_platform/__client/index.ts +1 -333
- package/templates/src/app/web/system/locales/en-US.json +15 -1
- package/templates/src/app/web/system/locales/zh-CN.json +15 -1
- package/templates/src/app/web/system/pages/departments/sync-bar.tsx +9 -3
- package/templates/src/app/web/system/pages/roles/index.tsx +4 -8
- package/templates/src/app/web/system/pages/roles/role-label.ts +26 -0
- package/templates/src/app/web/system/pages/solutions/index.tsx +110 -0
- package/templates/src/app/web/system/pages/solutions/market-entry.ts +46 -0
- package/templates/src/app/web/system/pages/users/index.tsx +12 -2
- package/templates/src/app/web/system/pages/users/match-keyword.ts +19 -0
- package/templates/src/app/web/system/pages/users/roles.tsx +43 -14
- package/templates/src/app/web/system/routes.ts +18 -1
- package/templates/src/{app/api/_platform/market → oj-market/api}/api.ts +475 -592
- package/templates/src/oj-market/api/backfill.ts +221 -0
- package/templates/src/{app/api/_platform/market → oj-market/api}/bootstrap.ts +2 -2
- package/templates/src/oj-market/api/cdn/api.ts +312 -0
- package/templates/src/oj-market/api/cdn/shared.ts +104 -0
- package/templates/src/oj-market/api/cdn/signed-auth.ts +75 -0
- package/templates/src/oj-market/api/manifest.yaml +8 -0
- package/templates/src/oj-market/solution.yaml +21 -0
- package/templates/src/oj-market/web/__client/api.schemas.ts +167 -0
- package/templates/src/oj-market/web/__client/index.ts +509 -0
- package/templates/src/oj-market/web/__tests__/marketClient.fake.ts +6 -6
- package/templates/src/oj-market/web/api/client.ts +6 -6
- package/templates/src/oj-market/web/api/defaultClient.ts +31 -25
- package/templates/src/oj-market/web/entry.ts +5 -3
- package/templates/src/oj-market/web/hooks/useMarket.ts +6 -6
- package/templates/src/oj-market/web/pages/MarketApp.tsx +20 -3
- package/templates/src/oj-market/web/publish/locales/en-US.json +1 -1
- package/templates/src/oj-market/web/publish/locales/zh-CN.json +1 -1
- package/templates/src/oj-market/web/publish/pages/history.tsx +2 -11
- package/templates/src/oj-market/web/routes.ts +12 -0
- package/templates/src/oj-market/web/types.ts +14 -8
- package/templates/tests/lifecycle/anonymous-wiring.spec.ts +65 -0
- package/templates/tests/lifecycle/backfill.spec.ts +392 -0
- package/templates/tests/lifecycle/bootstrap.spec.ts +1 -1
- package/templates/tests/lifecycle/bundle-converge.spec.ts +264 -0
- package/templates/tests/lifecycle/cdn-upload.spec.ts +661 -0
- package/templates/tests/lifecycle/deploy-smoke.spec.ts +25 -0
- package/templates/tests/lifecycle/exec-grant.spec.ts +38 -0
- package/templates/tests/lifecycle/installer.spec.ts +36 -0
- package/templates/tests/lifecycle/market-api.spec.ts +448 -803
- package/templates/tests/lifecycle/preflight.spec.ts +18 -0
- package/templates/tests/lifecycle/trust.spec.ts +2 -2
- package/templates/tests/lifecycle/uninstall.spec.ts +36 -2
- package/templates/tests/lifecycle/verify-checks.spec.ts +1 -1
- package/templates/tests/solutions-entry.spec.ts +55 -0
- package/templates/tsconfig.paths.json +1 -0
- package/templates/web.config.ts +6 -6
- package/vendor/host-versions.json +3 -3
- package/bin/oj +0 -4
- package/src/market/__tests__/build-index.test.ts +0 -641
- package/src/market/__tests__/sharding.test.ts +0 -90
- package/src/market/__tests__/yank-ledger.test.ts +0 -60
- package/src/market/build-index.ts +0 -526
- package/src/market/index-builder.ts +0 -149
- package/src/market/sharding.ts +0 -94
- package/src/market/yank-ledger.ts +0 -91
- package/templates/src/app/api/_platform/_lifecycle/source-seq.ts +0 -88
- package/templates/src/app/api/_platform/market/index-source.ts +0 -112
- package/templates/tests/lifecycle/source-seq.spec.ts +0 -55
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-- 0003__market_catalog(sqlite 方言):market_release 扩列演化(v4 DB 目录化)。
|
|
2
|
+
--
|
|
3
|
+
-- 定性:**表演化,非新建**——market_release 已存在于 0002(四方评审共同指认的 P0 修正:
|
|
4
|
+
-- v3 原拟新建同名表照写必炸)。此处仅 ALTER 扩四列,把「签名索引文件派生物」升级为
|
|
5
|
+
-- 「签名推送直写的目录真源」:
|
|
6
|
+
-- · sig_alg/sig_value/sig_public_key = 上传端点验收的发布签名三字段(Ed25519,
|
|
7
|
+
-- 与 .sig 侧车同构;canon/key_id 不列存——canonical 由 (registry_id,name,sha256)
|
|
8
|
+
-- 服务端重算重建,key_id 已有专列)
|
|
9
|
+
-- · manifest = 包内嵌 manifest.yaml 抽取物(JSON 文本;安装解析/卡片字段数据源,
|
|
10
|
+
-- 坏包被 pair 约束挡在库外,见上传端点处理顺序)
|
|
11
|
+
-- · published_at 两列保留语义不变;上传写入行 published_at_source='upload'
|
|
12
|
+
-- · syncReleases 时代旧行此四列 = NULL,由站点侧扫描回填命令补齐(计划 §六,三用命令)
|
|
13
|
+
--
|
|
14
|
+
-- 方言差异照 0002 惯例:mysql 收窄 VARCHAR / pg 全 TEXT,见同名 .mysql/.pg 文件。
|
|
15
|
+
ALTER TABLE market_release ADD COLUMN sig_alg TEXT;
|
|
16
|
+
ALTER TABLE market_release ADD COLUMN sig_value TEXT;
|
|
17
|
+
ALTER TABLE market_release ADD COLUMN sig_public_key TEXT;
|
|
18
|
+
ALTER TABLE market_release ADD COLUMN manifest TEXT;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- 0004__market_drop_source_seq(mysql 方言):退役 reg_source_seq 水位表(v4 §四索引机制整建制退役)。
|
|
2
|
+
--
|
|
3
|
+
-- 定性:签名索引(catalog.yaml + shards/<n>.yaml + 代次水位防回放)随 DB 目录化退役——
|
|
4
|
+
-- install 解析/index 卡片/releases 历史全部直读 market_release 表,水位失去消费方。
|
|
5
|
+
-- DROP IF EXISTS 幂等:回填/回滚场景重复应用不炸。三方言同形(无方言差异)。
|
|
6
|
+
DROP TABLE IF EXISTS reg_source_seq;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- 0004__market_drop_source_seq(pg 方言):退役 reg_source_seq 水位表(v4 §四索引机制整建制退役)。
|
|
2
|
+
--
|
|
3
|
+
-- 定性:签名索引(catalog.yaml + shards/<n>.yaml + 代次水位防回放)随 DB 目录化退役——
|
|
4
|
+
-- install 解析/index 卡片/releases 历史全部直读 market_release 表,水位失去消费方。
|
|
5
|
+
-- DROP IF EXISTS 幂等:回填/回滚场景重复应用不炸。三方言同形(无方言差异)。
|
|
6
|
+
DROP TABLE IF EXISTS reg_source_seq;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- 0004__market_drop_source_seq(sqlite 方言):退役 reg_source_seq 水位表(v4 §四索引机制整建制退役)。
|
|
2
|
+
--
|
|
3
|
+
-- 定性:签名索引(catalog.yaml + shards/<n>.yaml + 代次水位防回放)随 DB 目录化退役——
|
|
4
|
+
-- install 解析/index 卡片/releases 历史全部直读 market_release 表,水位失去消费方。
|
|
5
|
+
-- DROP IF EXISTS 幂等:回填/回滚场景重复应用不炸。三方言同形(无方言差异)。
|
|
6
|
+
DROP TABLE IF EXISTS reg_source_seq;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- 0005__market_sig_registry(mysql 方言):market_release 补 sig_registry_id 列(v4 §四 A5 增补)。
|
|
2
|
+
--
|
|
3
|
+
-- 定性:**A5 实施期修正**——安装解析改走 DB 目录行(formBEntryOf 服务端合成 Form B 条目),
|
|
4
|
+
-- install verify 段重构包级规范串 `<registry_id>:<name>@<version>:<sha256>` 需要签发方
|
|
5
|
+
-- registry 身份;0003 落列时裁定「registry_id 不进合成签名」被本修正取代(DB 行即安装
|
|
6
|
+
-- manifest 真源,签名必须可验)。列值 = 上传 .sig 旁车第六字段(上传端点结构校验落列)。
|
|
7
|
+
-- 方言差异照 0003 惯例:mysql 收窄 VARCHAR / pg 全 TEXT。
|
|
8
|
+
ALTER TABLE market_release ADD COLUMN sig_registry_id VARCHAR(255);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- 0005__market_sig_registry(pg 方言):market_release 补 sig_registry_id 列(v4 §四 A5 增补)。
|
|
2
|
+
--
|
|
3
|
+
-- 定性:**A5 实施期修正**——安装解析改走 DB 目录行(formBEntryOf 服务端合成 Form B 条目),
|
|
4
|
+
-- install verify 段重构包级规范串 `<registry_id>:<name>@<version>:<sha256>` 需要签发方
|
|
5
|
+
-- registry 身份;0003 落列时裁定「registry_id 不进合成签名」被本修正取代(DB 行即安装
|
|
6
|
+
-- manifest 真源,签名必须可验)。列值 = 上传 .sig 旁车第六字段(上传端点结构校验落列)。
|
|
7
|
+
-- 方言差异照 0003 惯例:mysql 收窄 VARCHAR / pg 全 TEXT。
|
|
8
|
+
ALTER TABLE market_release ADD COLUMN sig_registry_id TEXT;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- 0005__market_sig_registry(sqlite 方言):market_release 补 sig_registry_id 列(v4 §四 A5 增补)。
|
|
2
|
+
--
|
|
3
|
+
-- 定性:**A5 实施期修正**——安装解析改走 DB 目录行(formBEntryOf 服务端合成 Form B 条目),
|
|
4
|
+
-- install verify 段重构包级规范串 `<registry_id>:<name>@<version>:<sha256>` 需要签发方
|
|
5
|
+
-- registry 身份;0003 落列时裁定「registry_id 不进合成签名」被本修正取代(DB 行即安装
|
|
6
|
+
-- manifest 真源,签名必须可验)。列值 = 上传 .sig 旁车第六字段(上传端点结构校验落列)。
|
|
7
|
+
-- 方言差异照 0003 惯例:mysql 收窄 VARCHAR / pg 全 TEXT。
|
|
8
|
+
ALTER TABLE market_release ADD COLUMN sig_registry_id TEXT;
|
|
@@ -185,17 +185,14 @@ tables:
|
|
|
185
185
|
published_at_source: {type: text, null: false}
|
|
186
186
|
yanked: {type: integer, null: false}
|
|
187
187
|
first_seen_at: {type: integer, null: false}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
source_url: {type: text, null: false}
|
|
197
|
-
max_seq: {type: integer, null: false}
|
|
198
|
-
updated_at: {type: integer, null: false}
|
|
188
|
+
# v4 DB 目录化(0003 扩列):签名推送直写的目录真源——签名三字段 + 包内嵌 manifest
|
|
189
|
+
# 抽取物。旧行(syncReleases 时代)此四列 = NULL,由站点侧扫描回填命令补齐(计划 §六)。
|
|
190
|
+
sig_alg: {type: text}
|
|
191
|
+
sig_value: {type: text}
|
|
192
|
+
sig_public_key: {type: text}
|
|
193
|
+
# A5 增补:包级 canonical 首段(签发方 registry 身份)——install verify 重构规范串用
|
|
194
|
+
sig_registry_id: {type: text}
|
|
195
|
+
manifest: {type: text}
|
|
199
196
|
# ---- 0016:组织架构领域(CRUD 基线 + 外部源适配器的落点)----
|
|
200
197
|
# 定位(方案 §14):CRUD 是基线,企微 / LDAP 只是适配器 → 表里不出现任何 wecom_* / ldap_* 字段。
|
|
201
198
|
# origin 是**归属权**标识(D13):local = 本站管理员全权;wecom/ldap/sso = 该适配器管辖,
|
|
@@ -4,7 +4,7 @@ INSERT IGNORE INTO users (username, password_hash, must_change) VALUES ('superad
|
|
|
4
4
|
INSERT IGNORE INTO users (username, password_hash, must_change) VALUES ('admin', '$2y$10$9HEtASi9jG0VIBMMVqxAmOqrE4f6wiezhGmi50iPG1s1MXlncSO0e', 0);
|
|
5
5
|
INSERT IGNORE INTO users (username, password_hash, must_change) VALUES ('editor', '$2y$10$9HEtASi9jG0VIBMMVqxAmOqrE4f6wiezhGmi50iPG1s1MXlncSO0e', 0);
|
|
6
6
|
INSERT IGNORE INTO users (username, password_hash, must_change) VALUES ('viewer', '$2y$10$9HEtASi9jG0VIBMMVqxAmOqrE4f6wiezhGmi50iPG1s1MXlncSO0e', 0);
|
|
7
|
-
DELETE FROM sys_user_role WHERE role_name = 'superadmin' AND user_id
|
|
7
|
+
DELETE FROM sys_user_role WHERE role_name = 'superadmin' AND user_id IN (SELECT id FROM users WHERE username = 'admin');
|
|
8
8
|
UPDATE users SET must_change = 0 WHERE username IN ('superadmin', 'admin', 'editor', 'viewer');
|
|
9
9
|
INSERT IGNORE INTO sys_role (name, module, title, builtin) VALUES ('superadmin', 'framework', '超级管理员', 1);
|
|
10
10
|
INSERT IGNORE INTO sys_role (name, module, title, builtin) VALUES ('admin', 'framework', '系统管理员', 1);
|
|
@@ -4,7 +4,7 @@ INSERT INTO users (username, password_hash, must_change) VALUES ('superadmin', '
|
|
|
4
4
|
INSERT INTO users (username, password_hash, must_change) VALUES ('admin', '$2y$10$9HEtASi9jG0VIBMMVqxAmOqrE4f6wiezhGmi50iPG1s1MXlncSO0e', 0) ON CONFLICT DO NOTHING;
|
|
5
5
|
INSERT INTO users (username, password_hash, must_change) VALUES ('editor', '$2y$10$9HEtASi9jG0VIBMMVqxAmOqrE4f6wiezhGmi50iPG1s1MXlncSO0e', 0) ON CONFLICT DO NOTHING;
|
|
6
6
|
INSERT INTO users (username, password_hash, must_change) VALUES ('viewer', '$2y$10$9HEtASi9jG0VIBMMVqxAmOqrE4f6wiezhGmi50iPG1s1MXlncSO0e', 0) ON CONFLICT DO NOTHING;
|
|
7
|
-
DELETE FROM sys_user_role WHERE role_name = 'superadmin' AND user_id
|
|
7
|
+
DELETE FROM sys_user_role WHERE role_name = 'superadmin' AND user_id IN (SELECT id FROM users WHERE username = 'admin');
|
|
8
8
|
UPDATE users SET must_change = 0 WHERE username IN ('superadmin', 'admin', 'editor', 'viewer');
|
|
9
9
|
INSERT INTO sys_role (name, module, title, builtin) VALUES ('superadmin', 'framework', '超级管理员', 1) ON CONFLICT DO NOTHING;
|
|
10
10
|
INSERT INTO sys_role (name, module, title, builtin) VALUES ('admin', 'framework', '系统管理员', 1) ON CONFLICT DO NOTHING;
|
|
@@ -11,7 +11,7 @@ INSERT OR IGNORE INTO users (username, password_hash, must_change) VALUES ('edit
|
|
|
11
11
|
INSERT OR IGNORE INTO users (username, password_hash, must_change) VALUES ('viewer', '$2y$10$9HEtASi9jG0VIBMMVqxAmOqrE4f6wiezhGmi50iPG1s1MXlncSO0e', 0);
|
|
12
12
|
-- 历史 seed 把 admin 绑在 superadmin 上;收敛为账号名=角色名(幂等 DELETE,每次重放生效)。
|
|
13
13
|
-- 已存在库中 admin 行可能残留 must_change=1,UPDATE 统一收敛为 0(四个均为 seed 自有开发账号)
|
|
14
|
-
DELETE FROM sys_user_role WHERE role_name = 'superadmin' AND user_id
|
|
14
|
+
DELETE FROM sys_user_role WHERE role_name = 'superadmin' AND user_id IN (SELECT id FROM users WHERE username = 'admin');
|
|
15
15
|
UPDATE users SET must_change = 0 WHERE username IN ('superadmin', 'admin', 'editor', 'viewer');
|
|
16
16
|
-- 框架内置角色(ROLES 单一真相:superadmin 安全敏感项 / admin 日常管理 / editor、viewer 页面门)
|
|
17
17
|
INSERT OR IGNORE INTO sys_role (name, module, title, builtin) VALUES ('superadmin', 'framework', '超级管理员', 1);
|
|
@@ -400,6 +400,12 @@ async function runSlice(
|
|
|
400
400
|
for (const d of ordered) {
|
|
401
401
|
if (d.name)
|
|
402
402
|
continue;
|
|
403
|
+
// 受同片预算约束:预算耗尽就跳过剩余名字回源(名字留空非致命,下轮/事件增量会补)。
|
|
404
|
+
// 否则无名字的部门一多(每个 department/get 最多等 5s 软超时),departments 阶段会
|
|
405
|
+
// 跑出 12s 预算、甚至超过客户端/路由超时——外层切片本就为「可控时长」而设计,
|
|
406
|
+
// 这里若不拦,整片就失去时长上界(members 阶段有同款 deadline 守卫,这里原本漏了)。
|
|
407
|
+
if (deps.now() >= deadline)
|
|
408
|
+
continue;
|
|
403
409
|
try {
|
|
404
410
|
const detail = await deps.client.departmentDetail(corpId, agentId, secret, d.id);
|
|
405
411
|
if (detail.name)
|
|
@@ -25,120 +25,6 @@ export const schemas = {
|
|
|
25
25
|
"display_name": z.string().nullable(),
|
|
26
26
|
"email": z.string().nullable(),
|
|
27
27
|
"avatar_base64": z.string().nullable()
|
|
28
|
-
}),
|
|
29
|
-
},
|
|
30
|
-
"platformMarketInstallPost": {
|
|
31
|
-
body: z.object({
|
|
32
|
-
"source": z.enum(["cdn", "file"]),
|
|
33
|
-
"name": z.string(),
|
|
34
|
-
"version": z.string().nullable().optional(),
|
|
35
|
-
"force": z.boolean().optional()
|
|
36
|
-
}),
|
|
37
|
-
data: z.object({
|
|
38
|
-
"task_id": z.string().optional()
|
|
39
|
-
}).catchall(z.unknown()),
|
|
40
|
-
},
|
|
41
|
-
"platformMarketInstallCancelPost": {
|
|
42
|
-
body: z.object({
|
|
43
|
-
"name": z.string()
|
|
44
|
-
}),
|
|
45
|
-
data: z.object({
|
|
46
|
-
"ok": z.boolean().optional(),
|
|
47
|
-
"name": z.string().optional(),
|
|
48
|
-
"requested": z.boolean().optional()
|
|
49
|
-
}).catchall(z.unknown()),
|
|
50
|
-
},
|
|
51
|
-
"platformMarketTaskGet": {
|
|
52
|
-
query: z.object({
|
|
53
|
-
"id": z.string()
|
|
54
|
-
}),
|
|
55
|
-
data: z.object({
|
|
56
|
-
|
|
57
|
-
}).catchall(z.unknown()),
|
|
58
|
-
},
|
|
59
|
-
"platformMarketEnablePost": {
|
|
60
|
-
body: z.object({
|
|
61
|
-
"name": z.string(),
|
|
62
|
-
"enabled": z.boolean()
|
|
63
|
-
}),
|
|
64
|
-
data: z.object({
|
|
65
|
-
|
|
66
|
-
}).catchall(z.unknown()),
|
|
67
|
-
},
|
|
68
|
-
"platformMarketMetaGet": {
|
|
69
|
-
data: z.object({
|
|
70
|
-
"apiVersion": z.string().optional()
|
|
71
|
-
}).catchall(z.unknown()),
|
|
72
|
-
},
|
|
73
|
-
"platformMarketTrustGet": {
|
|
74
|
-
data: z.object({
|
|
75
|
-
|
|
76
|
-
}).catchall(z.unknown()),
|
|
77
|
-
},
|
|
78
|
-
"platformMarketTrustPost": {
|
|
79
|
-
body: z.object({
|
|
80
|
-
"task_id": z.string()
|
|
81
|
-
}),
|
|
82
|
-
data: z.object({
|
|
83
|
-
|
|
84
|
-
}).catchall(z.unknown()),
|
|
85
|
-
},
|
|
86
|
-
"platformMarketTrustKeyPost": {
|
|
87
|
-
body: z.object({
|
|
88
|
-
"key_id": z.string(),
|
|
89
|
-
"public_key": z.string()
|
|
90
|
-
}),
|
|
91
|
-
data: z.object({
|
|
92
|
-
|
|
93
|
-
}).catchall(z.unknown()),
|
|
94
|
-
},
|
|
95
|
-
"platformMarketTrustKeyDelete": {
|
|
96
|
-
query: z.object({
|
|
97
|
-
"key_id": z.string()
|
|
98
|
-
}),
|
|
99
|
-
data: z.object({
|
|
100
|
-
|
|
101
|
-
}).catchall(z.unknown()),
|
|
102
|
-
},
|
|
103
|
-
"platformMarketIndexGet": {
|
|
104
|
-
data: z.array(z.object({
|
|
105
|
-
|
|
106
|
-
}).catchall(z.unknown())),
|
|
107
|
-
},
|
|
108
|
-
"platformMarketUninstallImpactGet": {
|
|
109
|
-
query: z.object({
|
|
110
|
-
"name": z.string()
|
|
111
|
-
}),
|
|
112
|
-
data: z.object({
|
|
113
|
-
|
|
114
|
-
}).catchall(z.unknown()),
|
|
115
|
-
},
|
|
116
|
-
"platformMarketUninstallPost": {
|
|
117
|
-
body: z.object({
|
|
118
|
-
"name": z.string()
|
|
119
|
-
}),
|
|
120
|
-
data: z.object({
|
|
121
|
-
|
|
122
|
-
}).catchall(z.unknown()),
|
|
123
|
-
},
|
|
124
|
-
"platformMarketHistoryGet": {
|
|
125
|
-
data: z.array(z.object({
|
|
126
|
-
|
|
127
|
-
}).catchall(z.unknown())),
|
|
128
|
-
},
|
|
129
|
-
"platformMarketReleasesGet": {
|
|
130
|
-
query: z.object({
|
|
131
|
-
"page": z.number().min(1).optional(),
|
|
132
|
-
"limit": z.number().min(1).max(200).optional()
|
|
133
|
-
}),
|
|
134
|
-
data: z.object({
|
|
135
|
-
"list": z.array(z.object({
|
|
136
|
-
|
|
137
|
-
}).catchall(z.unknown())),
|
|
138
|
-
"total": z.number(),
|
|
139
|
-
"page": z.number(),
|
|
140
|
-
"size": z.number(),
|
|
141
|
-
"syncError": z.string().nullable().optional()
|
|
142
28
|
}),
|
|
143
29
|
},
|
|
144
30
|
"platformOrgDepartmentsGet": {
|
|
@@ -36,7 +36,7 @@ export function create_platformClient(ctx: ModuleContext) {
|
|
|
36
36
|
}
|
|
37
37
|
ctx.register.apiPrefix(API_PREFIX);
|
|
38
38
|
bindRequest(ctx.utils.request);
|
|
39
|
-
return { platformContactsGet, platformContactsDetailGet,
|
|
39
|
+
return { platformContactsGet, platformContactsDetailGet, platformOrgDepartmentsGet, platformOrgIsMemberGet, platformOrgMembersGet, platformOrgPickerGet, platformOrgResolvePost, platformOrgTreeGet, platformOrgUserGet, platformSolutionsRoutesGet, platformSolutionsVerifyPost, platformSolutionsVerifyLastGet };
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/**
|
|
@@ -115,338 +115,6 @@ export async function platformContactsDetailGet(query: PlatformContactsDetailGet
|
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
export type PlatformMarketInstallPostBody = z.input<(typeof schemas)["platformMarketInstallPost"]["body"]>;
|
|
119
|
-
export type PlatformMarketInstallPostData = z.infer<(typeof schemas)["platformMarketInstallPost"]["data"]>;
|
|
120
|
-
|
|
121
|
-
export async function platformMarketInstallPost(body: PlatformMarketInstallPostBody): Promise<PlatformMarketInstallPostData> {
|
|
122
|
-
const client = ensureReq();
|
|
123
|
-
try {
|
|
124
|
-
const env = await client.post(`_platform/market/install`, { json: body }).json<OjEnvelope<PlatformMarketInstallPostData>>();
|
|
125
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
126
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
127
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
128
|
-
const data = env.data as PlatformMarketInstallPostData;
|
|
129
|
-
if (import.meta.env.DEV) {
|
|
130
|
-
const { schemas } = await import("./api.schemas");
|
|
131
|
-
const r = schemas["platformMarketInstallPost"].data.safeParse(data);
|
|
132
|
-
if (!r.success)
|
|
133
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketInstallPost 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
134
|
-
}
|
|
135
|
-
return data;
|
|
136
|
-
}
|
|
137
|
-
catch (e) {
|
|
138
|
-
throw await toApiError(e);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export type PlatformMarketInstallCancelPostBody = z.input<(typeof schemas)["platformMarketInstallCancelPost"]["body"]>;
|
|
143
|
-
export type PlatformMarketInstallCancelPostData = z.infer<(typeof schemas)["platformMarketInstallCancelPost"]["data"]>;
|
|
144
|
-
|
|
145
|
-
export async function platformMarketInstallCancelPost(body: PlatformMarketInstallCancelPostBody): Promise<PlatformMarketInstallCancelPostData> {
|
|
146
|
-
const client = ensureReq();
|
|
147
|
-
try {
|
|
148
|
-
const env = await client.post(`_platform/market/install/cancel`, { json: body }).json<OjEnvelope<PlatformMarketInstallCancelPostData>>();
|
|
149
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
150
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
151
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
152
|
-
const data = env.data as PlatformMarketInstallCancelPostData;
|
|
153
|
-
if (import.meta.env.DEV) {
|
|
154
|
-
const { schemas } = await import("./api.schemas");
|
|
155
|
-
const r = schemas["platformMarketInstallCancelPost"].data.safeParse(data);
|
|
156
|
-
if (!r.success)
|
|
157
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketInstallCancelPost 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
158
|
-
}
|
|
159
|
-
return data;
|
|
160
|
-
}
|
|
161
|
-
catch (e) {
|
|
162
|
-
throw await toApiError(e);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export type PlatformMarketTaskGetQuery = z.input<(typeof schemas)["platformMarketTaskGet"]["query"]>;
|
|
167
|
-
export type PlatformMarketTaskGetData = z.infer<(typeof schemas)["platformMarketTaskGet"]["data"]>;
|
|
168
|
-
|
|
169
|
-
export async function platformMarketTaskGet(query: PlatformMarketTaskGetQuery): Promise<PlatformMarketTaskGetData> {
|
|
170
|
-
const client = ensureReq();
|
|
171
|
-
try {
|
|
172
|
-
const env = await client.get(`_platform/market/task`, { searchParams: query as Record<string, string | number | boolean> }).json<OjEnvelope<PlatformMarketTaskGetData>>();
|
|
173
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
174
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
175
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
176
|
-
const data = env.data as PlatformMarketTaskGetData;
|
|
177
|
-
if (import.meta.env.DEV) {
|
|
178
|
-
const { schemas } = await import("./api.schemas");
|
|
179
|
-
const r = schemas["platformMarketTaskGet"].data.safeParse(data);
|
|
180
|
-
if (!r.success)
|
|
181
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketTaskGet 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
182
|
-
}
|
|
183
|
-
return data;
|
|
184
|
-
}
|
|
185
|
-
catch (e) {
|
|
186
|
-
throw await toApiError(e);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
export type PlatformMarketEnablePostBody = z.input<(typeof schemas)["platformMarketEnablePost"]["body"]>;
|
|
191
|
-
export type PlatformMarketEnablePostData = z.infer<(typeof schemas)["platformMarketEnablePost"]["data"]>;
|
|
192
|
-
|
|
193
|
-
export async function platformMarketEnablePost(body: PlatformMarketEnablePostBody): Promise<PlatformMarketEnablePostData> {
|
|
194
|
-
const client = ensureReq();
|
|
195
|
-
try {
|
|
196
|
-
const env = await client.post(`_platform/market/enable`, { json: body }).json<OjEnvelope<PlatformMarketEnablePostData>>();
|
|
197
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
198
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
199
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
200
|
-
const data = env.data as PlatformMarketEnablePostData;
|
|
201
|
-
if (import.meta.env.DEV) {
|
|
202
|
-
const { schemas } = await import("./api.schemas");
|
|
203
|
-
const r = schemas["platformMarketEnablePost"].data.safeParse(data);
|
|
204
|
-
if (!r.success)
|
|
205
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketEnablePost 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
206
|
-
}
|
|
207
|
-
return data;
|
|
208
|
-
}
|
|
209
|
-
catch (e) {
|
|
210
|
-
throw await toApiError(e);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
export type PlatformMarketMetaGetData = z.infer<(typeof schemas)["platformMarketMetaGet"]["data"]>;
|
|
215
|
-
|
|
216
|
-
export async function platformMarketMetaGet(): Promise<PlatformMarketMetaGetData> {
|
|
217
|
-
const client = ensureReq();
|
|
218
|
-
try {
|
|
219
|
-
const env = await client.get(`_platform/market/meta`).json<OjEnvelope<PlatformMarketMetaGetData>>();
|
|
220
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
221
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
222
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
223
|
-
const data = env.data as PlatformMarketMetaGetData;
|
|
224
|
-
if (import.meta.env.DEV) {
|
|
225
|
-
const { schemas } = await import("./api.schemas");
|
|
226
|
-
const r = schemas["platformMarketMetaGet"].data.safeParse(data);
|
|
227
|
-
if (!r.success)
|
|
228
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketMetaGet 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
229
|
-
}
|
|
230
|
-
return data;
|
|
231
|
-
}
|
|
232
|
-
catch (e) {
|
|
233
|
-
throw await toApiError(e);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
export type PlatformMarketTrustGetData = z.infer<(typeof schemas)["platformMarketTrustGet"]["data"]>;
|
|
238
|
-
|
|
239
|
-
export async function platformMarketTrustGet(): Promise<PlatformMarketTrustGetData> {
|
|
240
|
-
const client = ensureReq();
|
|
241
|
-
try {
|
|
242
|
-
const env = await client.get(`_platform/market/trust`).json<OjEnvelope<PlatformMarketTrustGetData>>();
|
|
243
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
244
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
245
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
246
|
-
const data = env.data as PlatformMarketTrustGetData;
|
|
247
|
-
if (import.meta.env.DEV) {
|
|
248
|
-
const { schemas } = await import("./api.schemas");
|
|
249
|
-
const r = schemas["platformMarketTrustGet"].data.safeParse(data);
|
|
250
|
-
if (!r.success)
|
|
251
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketTrustGet 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
252
|
-
}
|
|
253
|
-
return data;
|
|
254
|
-
}
|
|
255
|
-
catch (e) {
|
|
256
|
-
throw await toApiError(e);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
export type PlatformMarketTrustPostBody = z.input<(typeof schemas)["platformMarketTrustPost"]["body"]>;
|
|
261
|
-
export type PlatformMarketTrustPostData = z.infer<(typeof schemas)["platformMarketTrustPost"]["data"]>;
|
|
262
|
-
|
|
263
|
-
export async function platformMarketTrustPost(body: PlatformMarketTrustPostBody): Promise<PlatformMarketTrustPostData> {
|
|
264
|
-
const client = ensureReq();
|
|
265
|
-
try {
|
|
266
|
-
const env = await client.post(`_platform/market/trust`, { json: body }).json<OjEnvelope<PlatformMarketTrustPostData>>();
|
|
267
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
268
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
269
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
270
|
-
const data = env.data as PlatformMarketTrustPostData;
|
|
271
|
-
if (import.meta.env.DEV) {
|
|
272
|
-
const { schemas } = await import("./api.schemas");
|
|
273
|
-
const r = schemas["platformMarketTrustPost"].data.safeParse(data);
|
|
274
|
-
if (!r.success)
|
|
275
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketTrustPost 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
276
|
-
}
|
|
277
|
-
return data;
|
|
278
|
-
}
|
|
279
|
-
catch (e) {
|
|
280
|
-
throw await toApiError(e);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
export type PlatformMarketTrustKeyPostBody = z.input<(typeof schemas)["platformMarketTrustKeyPost"]["body"]>;
|
|
285
|
-
export type PlatformMarketTrustKeyPostData = z.infer<(typeof schemas)["platformMarketTrustKeyPost"]["data"]>;
|
|
286
|
-
|
|
287
|
-
export async function platformMarketTrustKeyPost(body: PlatformMarketTrustKeyPostBody): Promise<PlatformMarketTrustKeyPostData> {
|
|
288
|
-
const client = ensureReq();
|
|
289
|
-
try {
|
|
290
|
-
const env = await client.post(`_platform/market/trust/key`, { json: body }).json<OjEnvelope<PlatformMarketTrustKeyPostData>>();
|
|
291
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
292
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
293
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
294
|
-
const data = env.data as PlatformMarketTrustKeyPostData;
|
|
295
|
-
if (import.meta.env.DEV) {
|
|
296
|
-
const { schemas } = await import("./api.schemas");
|
|
297
|
-
const r = schemas["platformMarketTrustKeyPost"].data.safeParse(data);
|
|
298
|
-
if (!r.success)
|
|
299
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketTrustKeyPost 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
300
|
-
}
|
|
301
|
-
return data;
|
|
302
|
-
}
|
|
303
|
-
catch (e) {
|
|
304
|
-
throw await toApiError(e);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
export type PlatformMarketTrustKeyDeleteQuery = z.input<(typeof schemas)["platformMarketTrustKeyDelete"]["query"]>;
|
|
309
|
-
export type PlatformMarketTrustKeyDeleteData = z.infer<(typeof schemas)["platformMarketTrustKeyDelete"]["data"]>;
|
|
310
|
-
|
|
311
|
-
export async function platformMarketTrustKeyDelete(query: PlatformMarketTrustKeyDeleteQuery): Promise<PlatformMarketTrustKeyDeleteData> {
|
|
312
|
-
const client = ensureReq();
|
|
313
|
-
try {
|
|
314
|
-
const env = await client.delete(`_platform/market/trust/key`, { searchParams: query as Record<string, string | number | boolean> }).json<OjEnvelope<PlatformMarketTrustKeyDeleteData>>();
|
|
315
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
316
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
317
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
318
|
-
const data = env.data as PlatformMarketTrustKeyDeleteData;
|
|
319
|
-
if (import.meta.env.DEV) {
|
|
320
|
-
const { schemas } = await import("./api.schemas");
|
|
321
|
-
const r = schemas["platformMarketTrustKeyDelete"].data.safeParse(data);
|
|
322
|
-
if (!r.success)
|
|
323
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketTrustKeyDelete 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
324
|
-
}
|
|
325
|
-
return data;
|
|
326
|
-
}
|
|
327
|
-
catch (e) {
|
|
328
|
-
throw await toApiError(e);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
export type PlatformMarketIndexGetData = z.infer<(typeof schemas)["platformMarketIndexGet"]["data"]>;
|
|
333
|
-
|
|
334
|
-
export async function platformMarketIndexGet(): Promise<PlatformMarketIndexGetData> {
|
|
335
|
-
const client = ensureReq();
|
|
336
|
-
try {
|
|
337
|
-
const env = await client.get(`_platform/market/index`).json<OjEnvelope<PlatformMarketIndexGetData>>();
|
|
338
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
339
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
340
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
341
|
-
const data = env.data as PlatformMarketIndexGetData;
|
|
342
|
-
if (import.meta.env.DEV) {
|
|
343
|
-
const { schemas } = await import("./api.schemas");
|
|
344
|
-
const r = schemas["platformMarketIndexGet"].data.safeParse(data);
|
|
345
|
-
if (!r.success)
|
|
346
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketIndexGet 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
347
|
-
}
|
|
348
|
-
return data;
|
|
349
|
-
}
|
|
350
|
-
catch (e) {
|
|
351
|
-
throw await toApiError(e);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
export type PlatformMarketUninstallImpactGetQuery = z.input<(typeof schemas)["platformMarketUninstallImpactGet"]["query"]>;
|
|
356
|
-
export type PlatformMarketUninstallImpactGetData = z.infer<(typeof schemas)["platformMarketUninstallImpactGet"]["data"]>;
|
|
357
|
-
|
|
358
|
-
export async function platformMarketUninstallImpactGet(query: PlatformMarketUninstallImpactGetQuery): Promise<PlatformMarketUninstallImpactGetData> {
|
|
359
|
-
const client = ensureReq();
|
|
360
|
-
try {
|
|
361
|
-
const env = await client.get(`_platform/market/uninstall-impact`, { searchParams: query as Record<string, string | number | boolean> }).json<OjEnvelope<PlatformMarketUninstallImpactGetData>>();
|
|
362
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
363
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
364
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
365
|
-
const data = env.data as PlatformMarketUninstallImpactGetData;
|
|
366
|
-
if (import.meta.env.DEV) {
|
|
367
|
-
const { schemas } = await import("./api.schemas");
|
|
368
|
-
const r = schemas["platformMarketUninstallImpactGet"].data.safeParse(data);
|
|
369
|
-
if (!r.success)
|
|
370
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketUninstallImpactGet 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
371
|
-
}
|
|
372
|
-
return data;
|
|
373
|
-
}
|
|
374
|
-
catch (e) {
|
|
375
|
-
throw await toApiError(e);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
export type PlatformMarketUninstallPostBody = z.input<(typeof schemas)["platformMarketUninstallPost"]["body"]>;
|
|
380
|
-
export type PlatformMarketUninstallPostData = z.infer<(typeof schemas)["platformMarketUninstallPost"]["data"]>;
|
|
381
|
-
|
|
382
|
-
export async function platformMarketUninstallPost(body: PlatformMarketUninstallPostBody): Promise<PlatformMarketUninstallPostData> {
|
|
383
|
-
const client = ensureReq();
|
|
384
|
-
try {
|
|
385
|
-
const env = await client.post(`_platform/market/uninstall`, { json: body }).json<OjEnvelope<PlatformMarketUninstallPostData>>();
|
|
386
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
387
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
388
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
389
|
-
const data = env.data as PlatformMarketUninstallPostData;
|
|
390
|
-
if (import.meta.env.DEV) {
|
|
391
|
-
const { schemas } = await import("./api.schemas");
|
|
392
|
-
const r = schemas["platformMarketUninstallPost"].data.safeParse(data);
|
|
393
|
-
if (!r.success)
|
|
394
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketUninstallPost 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
395
|
-
}
|
|
396
|
-
return data;
|
|
397
|
-
}
|
|
398
|
-
catch (e) {
|
|
399
|
-
throw await toApiError(e);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
export type PlatformMarketHistoryGetData = z.infer<(typeof schemas)["platformMarketHistoryGet"]["data"]>;
|
|
404
|
-
|
|
405
|
-
export async function platformMarketHistoryGet(): Promise<PlatformMarketHistoryGetData> {
|
|
406
|
-
const client = ensureReq();
|
|
407
|
-
try {
|
|
408
|
-
const env = await client.get(`_platform/market/history`).json<OjEnvelope<PlatformMarketHistoryGetData>>();
|
|
409
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
410
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
411
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
412
|
-
const data = env.data as PlatformMarketHistoryGetData;
|
|
413
|
-
if (import.meta.env.DEV) {
|
|
414
|
-
const { schemas } = await import("./api.schemas");
|
|
415
|
-
const r = schemas["platformMarketHistoryGet"].data.safeParse(data);
|
|
416
|
-
if (!r.success)
|
|
417
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketHistoryGet 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
418
|
-
}
|
|
419
|
-
return data;
|
|
420
|
-
}
|
|
421
|
-
catch (e) {
|
|
422
|
-
throw await toApiError(e);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
export type PlatformMarketReleasesGetQuery = z.input<(typeof schemas)["platformMarketReleasesGet"]["query"]>;
|
|
427
|
-
export type PlatformMarketReleasesGetData = z.infer<(typeof schemas)["platformMarketReleasesGet"]["data"]>;
|
|
428
|
-
|
|
429
|
-
export async function platformMarketReleasesGet(query: PlatformMarketReleasesGetQuery): Promise<PlatformMarketReleasesGetData> {
|
|
430
|
-
const client = ensureReq();
|
|
431
|
-
try {
|
|
432
|
-
const env = await client.get(`_platform/market/releases`, { searchParams: query as Record<string, string | number | boolean> }).json<OjEnvelope<PlatformMarketReleasesGetData>>();
|
|
433
|
-
// 2xx + code!==0 也是业务错误(§6.2 通道 a):oj 不会这么发,但契约机制的价值恰是防漂移
|
|
434
|
-
if (typeof env.code === "number" && env.code !== 0)
|
|
435
|
-
throw new ContractApiError(env.code, env.msg ?? "业务错误(信封 code 非 0)");
|
|
436
|
-
const data = env.data as PlatformMarketReleasesGetData;
|
|
437
|
-
if (import.meta.env.DEV) {
|
|
438
|
-
const { schemas } = await import("./api.schemas");
|
|
439
|
-
const r = schemas["platformMarketReleasesGet"].data.safeParse(data);
|
|
440
|
-
if (!r.success)
|
|
441
|
-
throw new ContractApiError(-1, `[契约违例] platformMarketReleasesGet 响应与契约不符:${r.error.issues.map(i => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
|
|
442
|
-
}
|
|
443
|
-
return data;
|
|
444
|
-
}
|
|
445
|
-
catch (e) {
|
|
446
|
-
throw await toApiError(e);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
118
|
export type PlatformOrgDepartmentsGetQuery = z.input<(typeof schemas)["platformOrgDepartmentsGet"]["query"]>;
|
|
451
119
|
export type PlatformOrgDepartmentsGetData = z.infer<(typeof schemas)["platformOrgDepartmentsGet"]["data"]>;
|
|
452
120
|
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
"oplog": "Audit Log",
|
|
8
8
|
"settings": "Site Settings",
|
|
9
9
|
"wecom": "WeCom Integration",
|
|
10
|
-
"departments": "Departments"
|
|
10
|
+
"departments": "Departments",
|
|
11
|
+
"solutions": "Solutions"
|
|
11
12
|
},
|
|
12
13
|
"common": {
|
|
13
14
|
"confirm": "Confirm",
|
|
@@ -40,6 +41,7 @@
|
|
|
40
41
|
},
|
|
41
42
|
"mainDept": "Main dept",
|
|
42
43
|
"filterDept": "Filter by department (incl. sub-depts)",
|
|
44
|
+
"searchPlaceholder": "Search by username / display name",
|
|
43
45
|
"password": "Password",
|
|
44
46
|
"usernameHint": "ldap:/ sso:/ wecom: prefixes are reserved for external identity sources"
|
|
45
47
|
},
|
|
@@ -129,6 +131,18 @@
|
|
|
129
131
|
"secretHint": "Secret items cannot be edited online",
|
|
130
132
|
"saved": "Settings saved"
|
|
131
133
|
},
|
|
134
|
+
"solutionsPage": {
|
|
135
|
+
"title": "Solution Market (oj-market)",
|
|
136
|
+
"absentTitle": "No oj-market package in the site catalog",
|
|
137
|
+
"absentHint": "Factory state: re-run `ojm init --yes` to fetch the bundled installer package, or have a superadmin trigger POST /api/oj-market/backfill to rebuild the local catalog, then refresh this page.",
|
|
138
|
+
"latest": "Latest in catalog: {{version}}",
|
|
139
|
+
"installed": "Installed {{version}}",
|
|
140
|
+
"install": "Install",
|
|
141
|
+
"doneTitle": "Installed",
|
|
142
|
+
"goMarket": "Open Solution Market",
|
|
143
|
+
"upgradableHint": "A newer version is in the catalog — upgrade from within the market page.",
|
|
144
|
+
"needsTrust": "Publisher key awaits trust confirmation — first-party packages are pre-trusted, so this usually means a third-party package occupies the name. Verify and retry."
|
|
145
|
+
},
|
|
132
146
|
"wecom": {
|
|
133
147
|
"title": "Onboard a corporation",
|
|
134
148
|
"hint": "Click \"Generate install link\" and send the link or QR code to the corporation's admin to scan/open for approval. On success this system auto-registers the corporation via the create_auth callback (writes wecom_app_profile). The link is generated by WeCom get_customized_auth_url; its validity follows WeCom's response (up to 10 days). The QR code greys out when it expires, so regenerate it.",
|