@dofe/infra-clients 0.1.89 → 0.1.91
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/dist/internal/sso/index.d.ts +3 -1
- package/dist/internal/sso/index.d.ts.map +1 -1
- package/dist/internal/sso/index.js +4 -1
- package/dist/internal/sso/index.js.map +1 -1
- package/dist/internal/sso/sso-auth.client.d.ts +12 -2
- package/dist/internal/sso/sso-auth.client.d.ts.map +1 -1
- package/dist/internal/sso/sso-auth.client.js +23 -12
- package/dist/internal/sso/sso-auth.client.js.map +1 -1
- package/dist/internal/sso/sso-rbac.client.d.ts +29 -20
- package/dist/internal/sso/sso-rbac.client.d.ts.map +1 -1
- package/dist/internal/sso/sso-rbac.client.js +53 -40
- package/dist/internal/sso/sso-rbac.client.js.map +1 -1
- package/dist/internal/sso/sso-response.util.d.ts +36 -0
- package/dist/internal/sso/sso-response.util.d.ts.map +1 -0
- package/dist/internal/sso/sso-response.util.js +54 -0
- package/dist/internal/sso/sso-response.util.js.map +1 -0
- package/package.json +10 -6
|
@@ -2,5 +2,7 @@ export { SsoClientModule } from './sso.module';
|
|
|
2
2
|
export { SsoMessageClient } from './sso-message.client';
|
|
3
3
|
export { SsoMessageProxyService } from './sso-message-proxy.service';
|
|
4
4
|
export { SsoAuthClient, SsoInternalUser, SsoInternalTenant, SsoOidcSessionInfo, SsoMainSessionInfo, SsoUserSessionsResponse, SsoKeyInfo, SsoKeyStatusResponse, SsoKeyRotateResponse, SsoKeyPurgeResponse, } from './sso-auth.client';
|
|
5
|
-
export { SsoRbacClient, SsoPermission, SsoCustomRole, SsoMemberRoleAssignment, SsoUserPermissions, } from './sso-rbac.client';
|
|
5
|
+
export { SsoRbacClient, SsoPermission, SsoCustomRole, SsoMemberRoleAssignment, SsoUserPermissions, SsoPaginatedResponse, } from './sso-rbac.client';
|
|
6
|
+
export { SsoInternalApiError, unwrapSsoResponse } from './sso-response.util';
|
|
7
|
+
export type { SsoApiResponse } from './sso-response.util';
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SsoRbacClient = exports.SsoAuthClient = exports.SsoMessageProxyService = exports.SsoMessageClient = exports.SsoClientModule = void 0;
|
|
3
|
+
exports.unwrapSsoResponse = exports.SsoInternalApiError = exports.SsoRbacClient = exports.SsoAuthClient = exports.SsoMessageProxyService = exports.SsoMessageClient = exports.SsoClientModule = void 0;
|
|
4
4
|
var sso_module_1 = require("./sso.module");
|
|
5
5
|
Object.defineProperty(exports, "SsoClientModule", { enumerable: true, get: function () { return sso_module_1.SsoClientModule; } });
|
|
6
6
|
var sso_message_client_1 = require("./sso-message.client");
|
|
@@ -11,4 +11,7 @@ var sso_auth_client_1 = require("./sso-auth.client");
|
|
|
11
11
|
Object.defineProperty(exports, "SsoAuthClient", { enumerable: true, get: function () { return sso_auth_client_1.SsoAuthClient; } });
|
|
12
12
|
var sso_rbac_client_1 = require("./sso-rbac.client");
|
|
13
13
|
Object.defineProperty(exports, "SsoRbacClient", { enumerable: true, get: function () { return sso_rbac_client_1.SsoRbacClient; } });
|
|
14
|
+
var sso_response_util_1 = require("./sso-response.util");
|
|
15
|
+
Object.defineProperty(exports, "SsoInternalApiError", { enumerable: true, get: function () { return sso_response_util_1.SsoInternalApiError; } });
|
|
16
|
+
Object.defineProperty(exports, "unwrapSsoResponse", { enumerable: true, get: function () { return sso_response_util_1.unwrapSsoResponse; } });
|
|
14
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/index.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAAtC,6GAAA,eAAe,OAAA;AACxB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AACzB,yEAAqE;AAA5D,mIAAA,sBAAsB,OAAA;AAC/B,qDAW2B;AAVzB,gHAAA,aAAa,OAAA;AAWf,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/index.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAAtC,6GAAA,eAAe,OAAA;AACxB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AACzB,yEAAqE;AAA5D,mIAAA,sBAAsB,OAAA;AAC/B,qDAW2B;AAVzB,gHAAA,aAAa,OAAA;AAWf,qDAO2B;AANzB,gHAAA,aAAa,OAAA;AAOf,yDAA6E;AAApE,wHAAA,mBAAmB,OAAA;AAAE,sHAAA,iBAAiB,OAAA"}
|
|
@@ -79,6 +79,16 @@ export interface SsoKeyRotateResponse {
|
|
|
79
79
|
export interface SsoKeyPurgeResponse {
|
|
80
80
|
purgedCount: number;
|
|
81
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* SSO Auth 客户端
|
|
84
|
+
*
|
|
85
|
+
* 通过 SSO Internal API 验证 token、查询用户/租户/会话/密钥。
|
|
86
|
+
* Internal API 响应统一经 unwrapSsoResponse 解包:SSO 抖动或返回非标准信封时
|
|
87
|
+
* 抛出 SsoInternalApiError,而非把 undefined 透传给调用方。
|
|
88
|
+
*
|
|
89
|
+
* 注意:getSession / getJwks 走公开端点(非 internal API),返回原始响应体,
|
|
90
|
+
* 不套用 { code, msg, data } 信封,故不经 unwrapSsoResponse。
|
|
91
|
+
*/
|
|
82
92
|
export declare class SsoAuthClient implements OnModuleInit {
|
|
83
93
|
private readonly httpService;
|
|
84
94
|
private readonly configService;
|
|
@@ -112,7 +122,7 @@ export declare class SsoAuthClient implements OnModuleInit {
|
|
|
112
122
|
getTenant(tenantId: string): Promise<SsoInternalTenant>;
|
|
113
123
|
/**
|
|
114
124
|
* 检查 SSO 会话状态(跨子域 cookie)
|
|
115
|
-
* 注意:此方法不使用内部 API 认证,而是传递用户 cookie
|
|
125
|
+
* 注意:此方法不使用内部 API 认证,而是传递用户 cookie,返回原始响应体
|
|
116
126
|
*/
|
|
117
127
|
getSession(cookieHeader?: string): Promise<unknown>;
|
|
118
128
|
/**
|
|
@@ -145,7 +155,7 @@ export declare class SsoAuthClient implements OnModuleInit {
|
|
|
145
155
|
purgeKeys(): Promise<SsoKeyPurgeResponse>;
|
|
146
156
|
/**
|
|
147
157
|
* 获取 JWKS 公钥集合
|
|
148
|
-
*
|
|
158
|
+
* 注意:此方法是公开的,不需要认证,返回原始响应体
|
|
149
159
|
*/
|
|
150
160
|
getJwks(): Promise<{
|
|
151
161
|
keys: Array<Record<string, unknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-auth.client.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-auth.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"sso-auth.client.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-auth.client.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,17 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const axios_1 = require("@nestjs/axios");
|
|
15
15
|
const config_1 = require("@nestjs/config");
|
|
16
16
|
const rxjs_1 = require("rxjs");
|
|
17
|
+
const sso_response_util_1 = require("./sso-response.util");
|
|
18
|
+
/**
|
|
19
|
+
* SSO Auth 客户端
|
|
20
|
+
*
|
|
21
|
+
* 通过 SSO Internal API 验证 token、查询用户/租户/会话/密钥。
|
|
22
|
+
* Internal API 响应统一经 unwrapSsoResponse 解包:SSO 抖动或返回非标准信封时
|
|
23
|
+
* 抛出 SsoInternalApiError,而非把 undefined 透传给调用方。
|
|
24
|
+
*
|
|
25
|
+
* 注意:getSession / getJwks 走公开端点(非 internal API),返回原始响应体,
|
|
26
|
+
* 不套用 { code, msg, data } 信封,故不经 unwrapSsoResponse。
|
|
27
|
+
*/
|
|
17
28
|
let SsoAuthClient = class SsoAuthClient {
|
|
18
29
|
httpService;
|
|
19
30
|
configService;
|
|
@@ -64,7 +75,7 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
64
75
|
headers: this.getInternalHeaders(),
|
|
65
76
|
timeout: 5000,
|
|
66
77
|
}));
|
|
67
|
-
return response.
|
|
78
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.verifyToken");
|
|
68
79
|
}
|
|
69
80
|
// ============================================================================
|
|
70
81
|
// User Management
|
|
@@ -77,7 +88,7 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
77
88
|
headers: this.getInternalHeaders(),
|
|
78
89
|
timeout: 5000,
|
|
79
90
|
}));
|
|
80
|
-
return response.
|
|
91
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.getUser");
|
|
81
92
|
}
|
|
82
93
|
/**
|
|
83
94
|
* 批量获取用户信息
|
|
@@ -88,7 +99,7 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
88
99
|
headers: this.getInternalHeaders(),
|
|
89
100
|
timeout: 10000, // 批量请求可能需要更长超时
|
|
90
101
|
}));
|
|
91
|
-
return response.
|
|
102
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.batchGetUsers");
|
|
92
103
|
}
|
|
93
104
|
// ============================================================================
|
|
94
105
|
// Tenant Management
|
|
@@ -101,14 +112,14 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
101
112
|
headers: this.getInternalHeaders(),
|
|
102
113
|
timeout: 5000,
|
|
103
114
|
}));
|
|
104
|
-
return response.
|
|
115
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.getTenant");
|
|
105
116
|
}
|
|
106
117
|
// ============================================================================
|
|
107
118
|
// Session Management
|
|
108
119
|
// ============================================================================
|
|
109
120
|
/**
|
|
110
121
|
* 检查 SSO 会话状态(跨子域 cookie)
|
|
111
|
-
* 注意:此方法不使用内部 API 认证,而是传递用户 cookie
|
|
122
|
+
* 注意:此方法不使用内部 API 认证,而是传递用户 cookie,返回原始响应体
|
|
112
123
|
*/
|
|
113
124
|
async getSession(cookieHeader) {
|
|
114
125
|
const headers = {};
|
|
@@ -128,7 +139,7 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
128
139
|
headers: this.getInternalHeaders(),
|
|
129
140
|
timeout: 5000,
|
|
130
141
|
}));
|
|
131
|
-
return response.
|
|
142
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.getUserSessions");
|
|
132
143
|
}
|
|
133
144
|
/**
|
|
134
145
|
* 撤销用户特定 OIDC 会话
|
|
@@ -138,7 +149,7 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
138
149
|
headers: this.getInternalHeaders(),
|
|
139
150
|
timeout: 5000,
|
|
140
151
|
}));
|
|
141
|
-
return response.
|
|
152
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.revokeSession");
|
|
142
153
|
}
|
|
143
154
|
/**
|
|
144
155
|
* 撤销用户所有会话
|
|
@@ -148,7 +159,7 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
148
159
|
headers: this.getInternalHeaders(),
|
|
149
160
|
timeout: 5000,
|
|
150
161
|
}));
|
|
151
|
-
return response.
|
|
162
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.revokeAllSessions");
|
|
152
163
|
}
|
|
153
164
|
// ============================================================================
|
|
154
165
|
// Key Management (JWKS rotation)
|
|
@@ -161,7 +172,7 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
161
172
|
headers: this.getInternalHeaders(),
|
|
162
173
|
timeout: 5000,
|
|
163
174
|
}));
|
|
164
|
-
return response.
|
|
175
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.getKeyStatus");
|
|
165
176
|
}
|
|
166
177
|
/**
|
|
167
178
|
* 轮换密钥
|
|
@@ -171,7 +182,7 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
171
182
|
headers: this.getInternalHeaders(),
|
|
172
183
|
timeout: 5000,
|
|
173
184
|
}));
|
|
174
|
-
return response.
|
|
185
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.rotateKeys");
|
|
175
186
|
}
|
|
176
187
|
/**
|
|
177
188
|
* 清理过期密钥
|
|
@@ -181,14 +192,14 @@ let SsoAuthClient = class SsoAuthClient {
|
|
|
181
192
|
headers: this.getInternalHeaders(),
|
|
182
193
|
timeout: 5000,
|
|
183
194
|
}));
|
|
184
|
-
return response.
|
|
195
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.auth.purgeKeys");
|
|
185
196
|
}
|
|
186
197
|
// ============================================================================
|
|
187
198
|
// JWKS (Public keys for JWT verification)
|
|
188
199
|
// ============================================================================
|
|
189
200
|
/**
|
|
190
201
|
* 获取 JWKS 公钥集合
|
|
191
|
-
*
|
|
202
|
+
* 注意:此方法是公开的,不需要认证,返回原始响应体
|
|
192
203
|
*/
|
|
193
204
|
async getJwks() {
|
|
194
205
|
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${this.ssoBaseUrl}/.well-known/jwks.json`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-auth.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-auth.client.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA0D;AAC1D,yCAA4C;AAC5C,2CAA+C;AAC/C,+BAAsC;
|
|
1
|
+
{"version":3,"file":"sso-auth.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-auth.client.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,11 +31,27 @@ export interface SsoUserPermissions {
|
|
|
31
31
|
tenantId: string;
|
|
32
32
|
permissions: SsoPermission[];
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* SSO 列表端点的分页信封(对应 sso-contracts PaginatedResponseSchema)。
|
|
36
|
+
*
|
|
37
|
+
* 注意:`listRoles`/`listPermissions`/`listMemberAssignments` 命名为 `list*`,
|
|
38
|
+
* 但 SSO 返回的是这个分页信封而非裸数组;client 对外仍以 `Promise<T[]>`
|
|
39
|
+
* 暴露(自动摊平分页),此类型仅用于内部解包。
|
|
40
|
+
*/
|
|
41
|
+
export interface SsoPaginatedResponse<T> {
|
|
42
|
+
list: T[];
|
|
43
|
+
total: number;
|
|
44
|
+
page: number;
|
|
45
|
+
limit: number;
|
|
46
|
+
}
|
|
34
47
|
/**
|
|
35
48
|
* SSO RBAC 客户端
|
|
36
49
|
*
|
|
37
50
|
* 通过 SSO Internal API 操作权限、自定义角色、成员角色分配和审批工作流。
|
|
38
51
|
* 与 SsoAuthClient 使用相同的认证头 (Bearer + X-Service-Name)。
|
|
52
|
+
*
|
|
53
|
+
* 所有响应经 unwrapSsoResponse 解包:SSO 抖动或返回非标准信封时抛出
|
|
54
|
+
* SsoInternalApiError,而非把 undefined 透传给调用方。
|
|
39
55
|
*/
|
|
40
56
|
export declare class SsoRbacClient implements OnModuleInit {
|
|
41
57
|
private readonly httpService;
|
|
@@ -47,6 +63,19 @@ export declare class SsoRbacClient implements OnModuleInit {
|
|
|
47
63
|
onModuleInit(): void;
|
|
48
64
|
private getHeaders;
|
|
49
65
|
private basePath;
|
|
66
|
+
/**
|
|
67
|
+
* 分页拉取 SSO 列表端点的全部条目并摊平为 `T[]`。
|
|
68
|
+
*
|
|
69
|
+
* SSO 的 `list*` 端点返回分页信封 `{ list, total, page, limit }`
|
|
70
|
+
* (PaginatedResponseSchema),默认 `limit=20`。直接透传 `data` 会让下游
|
|
71
|
+
* 对对象执行 `.map()` → `TypeError: (intermediate value).map is not a function`
|
|
72
|
+
* (见 models 侧 `/rbac/permissions`、`/rbac/roles` 500)。这里:
|
|
73
|
+
* 1) 解包分页信封取 `list`,让 client 对外真正返回 `T[]`(与签名一致);
|
|
74
|
+
* 2) 按 `limit=100` 循环至 `total`,避免默认 20 条静默截断;
|
|
75
|
+
* 3) 兼容历史裸数组返回(`Array.isArray(data)` 时直接返回);
|
|
76
|
+
* 4) 带 100 页(≈1e4 条)安全上限,防 `total` 异常导致死循环。
|
|
77
|
+
*/
|
|
78
|
+
private listAllPaginated;
|
|
50
79
|
listPermissions(): Promise<SsoPermission[]>;
|
|
51
80
|
listRoles(tenantId: string): Promise<SsoCustomRole[]>;
|
|
52
81
|
createRole(params: {
|
|
@@ -75,25 +104,5 @@ export declare class SsoRbacClient implements OnModuleInit {
|
|
|
75
104
|
success: boolean;
|
|
76
105
|
}>;
|
|
77
106
|
getUserEffectivePermissions(userId: string, tenantId: string): Promise<SsoUserPermissions>;
|
|
78
|
-
listApprovals(query?: {
|
|
79
|
-
status?: string;
|
|
80
|
-
type?: string;
|
|
81
|
-
tenantId?: string;
|
|
82
|
-
}): Promise<any[]>;
|
|
83
|
-
createApproval(params: {
|
|
84
|
-
tenantId: string;
|
|
85
|
-
requesterId: string;
|
|
86
|
-
type: string;
|
|
87
|
-
title: string;
|
|
88
|
-
description?: string;
|
|
89
|
-
payload?: Record<string, unknown>;
|
|
90
|
-
}): Promise<any>;
|
|
91
|
-
getApproval(id: string): Promise<any>;
|
|
92
|
-
resolveApproval(params: {
|
|
93
|
-
id: string;
|
|
94
|
-
approverId: string;
|
|
95
|
-
approved: boolean;
|
|
96
|
-
comment?: string;
|
|
97
|
-
}): Promise<any>;
|
|
98
107
|
}
|
|
99
108
|
//# sourceMappingURL=sso-rbac.client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-rbac.client.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-rbac.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"sso-rbac.client.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-rbac.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAO/C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,qBACa,aAAc,YAAW,YAAY;IAM9C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa;IANhC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,WAAW,CAAU;gBAGV,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa;IAG/C,YAAY,IAAI,IAAI;IAwBpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;IAIhB;;;;;;;;;;;OAWG;YACW,gBAAgB;IA4CxB,eAAe,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAY3C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAQrD,UAAU,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,EAAE,CAAC;KACzB,GAAG,OAAO,CAAC,aAAa,CAAC;IAWpB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAU3C,UAAU,CACd,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACxE,OAAO,CAAC,aAAa,CAAC;IAWnB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAcrD,qBAAqB,CACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAQ/B,UAAU,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAW9B,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAc/D,2BAA2B,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC;CAgB/B"}
|
|
@@ -14,11 +14,15 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const axios_1 = require("@nestjs/axios");
|
|
15
15
|
const config_1 = require("@nestjs/config");
|
|
16
16
|
const rxjs_1 = require("rxjs");
|
|
17
|
+
const sso_response_util_1 = require("./sso-response.util");
|
|
17
18
|
/**
|
|
18
19
|
* SSO RBAC 客户端
|
|
19
20
|
*
|
|
20
21
|
* 通过 SSO Internal API 操作权限、自定义角色、成员角色分配和审批工作流。
|
|
21
22
|
* 与 SsoAuthClient 使用相同的认证头 (Bearer + X-Service-Name)。
|
|
23
|
+
*
|
|
24
|
+
* 所有响应经 unwrapSsoResponse 解包:SSO 抖动或返回非标准信封时抛出
|
|
25
|
+
* SsoInternalApiError,而非把 undefined 透传给调用方。
|
|
22
26
|
*/
|
|
23
27
|
let SsoRbacClient = class SsoRbacClient {
|
|
24
28
|
httpService;
|
|
@@ -56,54 +60,86 @@ let SsoRbacClient = class SsoRbacClient {
|
|
|
56
60
|
basePath(versioned = false) {
|
|
57
61
|
return `${this.ssoInternalUrl}/internal${versioned ? "/v1" : ""}`;
|
|
58
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* 分页拉取 SSO 列表端点的全部条目并摊平为 `T[]`。
|
|
65
|
+
*
|
|
66
|
+
* SSO 的 `list*` 端点返回分页信封 `{ list, total, page, limit }`
|
|
67
|
+
* (PaginatedResponseSchema),默认 `limit=20`。直接透传 `data` 会让下游
|
|
68
|
+
* 对对象执行 `.map()` → `TypeError: (intermediate value).map is not a function`
|
|
69
|
+
* (见 models 侧 `/rbac/permissions`、`/rbac/roles` 500)。这里:
|
|
70
|
+
* 1) 解包分页信封取 `list`,让 client 对外真正返回 `T[]`(与签名一致);
|
|
71
|
+
* 2) 按 `limit=100` 循环至 `total`,避免默认 20 条静默截断;
|
|
72
|
+
* 3) 兼容历史裸数组返回(`Array.isArray(data)` 时直接返回);
|
|
73
|
+
* 4) 带 100 页(≈1e4 条)安全上限,防 `total` 异常导致死循环。
|
|
74
|
+
*/
|
|
75
|
+
async listAllPaginated(url, params, operation) {
|
|
76
|
+
const limit = 100;
|
|
77
|
+
const items = [];
|
|
78
|
+
let page = 1;
|
|
79
|
+
let total = Number.POSITIVE_INFINITY;
|
|
80
|
+
for (let i = 0; i < 100 && items.length < total; i++) {
|
|
81
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(url, {
|
|
82
|
+
headers: this.getHeaders(),
|
|
83
|
+
params: { ...params, page, limit },
|
|
84
|
+
timeout: 5000,
|
|
85
|
+
}));
|
|
86
|
+
const data = (0, sso_response_util_1.unwrapSsoResponse)(response, operation);
|
|
87
|
+
// 兼容历史裸数组返回
|
|
88
|
+
if (Array.isArray(data))
|
|
89
|
+
return data;
|
|
90
|
+
const batch = data?.list ?? [];
|
|
91
|
+
if (typeof data?.total === "number")
|
|
92
|
+
total = data.total;
|
|
93
|
+
if (batch.length === 0)
|
|
94
|
+
break;
|
|
95
|
+
items.push(...batch);
|
|
96
|
+
if (batch.length < limit)
|
|
97
|
+
break; // 末页
|
|
98
|
+
page += 1;
|
|
99
|
+
}
|
|
100
|
+
return items;
|
|
101
|
+
}
|
|
59
102
|
// ============================================================================
|
|
60
103
|
// Permissions
|
|
61
104
|
// ============================================================================
|
|
62
105
|
async listPermissions() {
|
|
63
|
-
|
|
64
|
-
return response.data.data;
|
|
106
|
+
return this.listAllPaginated(`${this.basePath()}/permissions`, {}, "sso.rbac.listPermissions");
|
|
65
107
|
}
|
|
66
108
|
// ============================================================================
|
|
67
109
|
// Custom Roles
|
|
68
110
|
// ============================================================================
|
|
69
111
|
async listRoles(tenantId) {
|
|
70
|
-
|
|
71
|
-
return response.data.data;
|
|
112
|
+
return this.listAllPaginated(`${this.basePath()}/roles`, { tenantId }, "sso.rbac.listRoles");
|
|
72
113
|
}
|
|
73
114
|
async createRole(params) {
|
|
74
115
|
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.post(`${this.basePath()}/roles`, params, { headers: this.getHeaders(), timeout: 5000 }));
|
|
75
|
-
return response.
|
|
116
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.rbac.createRole");
|
|
76
117
|
}
|
|
77
118
|
async getRole(id) {
|
|
78
119
|
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${this.basePath()}/roles/${id}`, { headers: this.getHeaders(), timeout: 5000 }));
|
|
79
|
-
return response.
|
|
120
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.rbac.getRole");
|
|
80
121
|
}
|
|
81
122
|
async updateRole(id, params) {
|
|
82
123
|
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.put(`${this.basePath()}/roles/${id}`, params, { headers: this.getHeaders(), timeout: 5000 }));
|
|
83
|
-
return response.
|
|
124
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.rbac.updateRole");
|
|
84
125
|
}
|
|
85
126
|
async deleteRole(id) {
|
|
86
127
|
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.delete(`${this.basePath()}/roles/${id}`, { headers: this.getHeaders(), timeout: 5000 }));
|
|
87
|
-
return response.
|
|
128
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.rbac.deleteRole");
|
|
88
129
|
}
|
|
89
130
|
// ============================================================================
|
|
90
131
|
// Member Role Assignments
|
|
91
132
|
// ============================================================================
|
|
92
133
|
async listMemberAssignments(tenantId, userId) {
|
|
93
|
-
|
|
94
|
-
headers: this.getHeaders(),
|
|
95
|
-
params: { tenantId, ...(userId ? { userId } : {}) },
|
|
96
|
-
timeout: 5000,
|
|
97
|
-
}));
|
|
98
|
-
return response.data.data;
|
|
134
|
+
return this.listAllPaginated(`${this.basePath()}/member-role-assignments`, { tenantId, userId }, "sso.rbac.listMemberAssignments");
|
|
99
135
|
}
|
|
100
136
|
async assignRole(params) {
|
|
101
137
|
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.post(`${this.basePath()}/member-role-assignments`, params, { headers: this.getHeaders(), timeout: 5000 }));
|
|
102
|
-
return response.
|
|
138
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.rbac.assignRole");
|
|
103
139
|
}
|
|
104
140
|
async removeRole(assignmentId) {
|
|
105
141
|
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.delete(`${this.basePath()}/member-role-assignments/${assignmentId}`, { headers: this.getHeaders(), timeout: 5000 }));
|
|
106
|
-
return response.
|
|
142
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.rbac.removeRole");
|
|
107
143
|
}
|
|
108
144
|
// ============================================================================
|
|
109
145
|
// User Effective Permissions
|
|
@@ -114,30 +150,7 @@ let SsoRbacClient = class SsoRbacClient {
|
|
|
114
150
|
params: { tenantId },
|
|
115
151
|
timeout: 5000,
|
|
116
152
|
}));
|
|
117
|
-
return response.
|
|
118
|
-
}
|
|
119
|
-
// ============================================================================
|
|
120
|
-
// Approval Workflow
|
|
121
|
-
// ============================================================================
|
|
122
|
-
async listApprovals(query) {
|
|
123
|
-
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${this.basePath()}/approvals`, { headers: this.getHeaders(), params: query, timeout: 5000 }));
|
|
124
|
-
return response.data.data;
|
|
125
|
-
}
|
|
126
|
-
async createApproval(params) {
|
|
127
|
-
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.post(`${this.basePath()}/approvals`, params, { headers: this.getHeaders(), timeout: 5000 }));
|
|
128
|
-
return response.data.data;
|
|
129
|
-
}
|
|
130
|
-
async getApproval(id) {
|
|
131
|
-
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${this.basePath()}/approvals/${id}`, { headers: this.getHeaders(), timeout: 5000 }));
|
|
132
|
-
return response.data.data;
|
|
133
|
-
}
|
|
134
|
-
async resolveApproval(params) {
|
|
135
|
-
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.put(`${this.basePath()}/approvals/${params.id}/resolve`, {
|
|
136
|
-
approverId: params.approverId,
|
|
137
|
-
approved: params.approved,
|
|
138
|
-
comment: params.comment,
|
|
139
|
-
}, { headers: this.getHeaders(), timeout: 5000 }));
|
|
140
|
-
return response.data.data;
|
|
153
|
+
return (0, sso_response_util_1.unwrapSsoResponse)(response, "sso.rbac.getUserEffectivePermissions");
|
|
141
154
|
}
|
|
142
155
|
};
|
|
143
156
|
exports.SsoRbacClient = SsoRbacClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-rbac.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-rbac.client.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA0D;AAC1D,yCAA4C;AAC5C,2CAA+C;AAC/C,+BAAsC;
|
|
1
|
+
{"version":3,"file":"sso-rbac.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-rbac.client.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA0D;AAC1D,yCAA4C;AAC5C,2CAA+C;AAC/C,+BAAsC;AACtC,2DAG6B;AAkD7B;;;;;;;;GAQG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IAML;IACA;IANX,cAAc,CAAU;IACxB,YAAY,CAAU;IACtB,WAAW,CAAU;IAE7B,YACmB,WAAwB,EACxB,aAA4B;QAD5B,gBAAW,GAAX,WAAW,CAAa;QACxB,kBAAa,GAAb,aAAa,CAAe;IAC5C,CAAC;IAEJ,YAAY;QACV,IAAI,CAAC,cAAc;YACjB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,sBAAsB,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,YAAY;YACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,qBAAqB,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAE5E,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,sDAAsD,CACvD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,qDAAqD,CACtD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,kDAAkD,CACnD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,aAAa,EAAE,UAAU,IAAI,CAAC,YAAY,EAAE;YAC5C,gBAAgB,EAAE,IAAI,CAAC,WAAW;YAClC,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,SAAS,GAAG,KAAK;QAChC,OAAO,GAAG,IAAI,CAAC,cAAc,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpE,CAAC;IAED;;;;;;;;;;;OAWG;IACK,KAAK,CAAC,gBAAgB,CAC5B,GAAW,EACX,MAAmD,EACnD,SAAiB;QAEjB,MAAM,KAAK,GAAG,GAAG,CAAC;QAClB,MAAM,KAAK,GAAQ,EAAE,CAAC;QACtB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,GAAG,EACH;gBACE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;gBAClC,OAAO,EAAE,IAAI;aACd,CACF,CACF,CAAC;YACF,MAAM,IAAI,GAAG,IAAA,qCAAiB,EAC5B,QAAQ,EACR,SAAS,CACV,CAAC;YAEF,YAAY;YACZ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAErC,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ;gBAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YACrB,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;gBAAE,MAAM,CAAC,KAAK;YACtC,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+EAA+E;IAC/E,cAAc;IACd,+EAA+E;IAE/E,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,gBAAgB,CAC1B,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,EAChC,EAAE,EACF,0BAA0B,CAC3B,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,eAAe;IACf,+EAA+E;IAE/E,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,OAAO,IAAI,CAAC,gBAAgB,CAC1B,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAC1B,EAAE,QAAQ,EAAE,EACZ,oBAAoB,CACrB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAKhB;QACC,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAC1B,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAC9C,CACF,CAAC;QACF,OAAO,IAAA,qCAAiB,EAAgB,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,EAChC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAC9C,CACF,CAAC;QACF,OAAO,IAAA,qCAAiB,EAAgB,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,UAAU,CACd,EAAU,EACV,MAAyE;QAEzE,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,EAChC,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAC9C,CACF,CAAC;QACF,OAAO,IAAA,qCAAiB,EAAgB,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CACrB,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,EAChC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAC9C,CACF,CAAC;QACF,OAAO,IAAA,qCAAiB,EAAuB,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAClF,CAAC;IAED,+EAA+E;IAC/E,0BAA0B;IAC1B,+EAA+E;IAE/E,KAAK,CAAC,qBAAqB,CACzB,QAAgB,EAChB,MAAe;QAEf,OAAO,IAAI,CAAC,gBAAgB,CAC1B,GAAG,IAAI,CAAC,QAAQ,EAAE,0BAA0B,EAC5C,EAAE,QAAQ,EAAE,MAAM,EAAE,EACpB,gCAAgC,CACjC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAKhB;QACC,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,GAAG,IAAI,CAAC,QAAQ,EAAE,0BAA0B,EAC5C,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAC9C,CACF,CAAC;QACF,OAAO,IAAA,qCAAiB,EAA0B,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,YAAoB;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CACrB,GAAG,IAAI,CAAC,QAAQ,EAAE,4BAA4B,YAAY,EAAE,EAC5D,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAC9C,CACF,CAAC;QACF,OAAO,IAAA,qCAAiB,EAAuB,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAClF,CAAC;IAED,+EAA+E;IAC/E,6BAA6B;IAC7B,+EAA+E;IAE/E,KAAK,CAAC,2BAA2B,CAC/B,MAAc,EACd,QAAgB;QAEhB,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,MAAM,cAAc,EAChD;YACE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,MAAM,EAAE,EAAE,QAAQ,EAAE;YACpB,OAAO,EAAE,IAAI;SACd,CACF,CACF,CAAC;QACF,OAAO,IAAA,qCAAiB,EACtB,QAAQ,EACR,sCAAsC,CACvC,CAAC;IACJ,CAAC;CACF,CAAA;AA5OY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAOqB,mBAAW;QACT,sBAAa;GAPpC,aAAa,CA4OzB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AxiosResponse } from "axios";
|
|
2
|
+
/**
|
|
3
|
+
* SSO Internal API 标准响应信封。
|
|
4
|
+
*
|
|
5
|
+
* SSO 所有 internal 端点统一返回 { code, msg, data };
|
|
6
|
+
* code 为 0 或 200 表示成功,其余均为业务失败。
|
|
7
|
+
*/
|
|
8
|
+
export interface SsoApiResponse<T = unknown> {
|
|
9
|
+
code: number;
|
|
10
|
+
msg?: string;
|
|
11
|
+
data?: T;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* SSO Internal API 调用失败时抛出的错误。
|
|
15
|
+
*
|
|
16
|
+
* 携带 HTTP status、业务 code 与 operation,便于调用方按需降级
|
|
17
|
+
* (例如列表接口在 SSO 抖动时回退空数组,而非把 undefined 透传给下游)。
|
|
18
|
+
*/
|
|
19
|
+
export declare class SsoInternalApiError extends Error {
|
|
20
|
+
readonly status: number;
|
|
21
|
+
readonly code: number | undefined;
|
|
22
|
+
readonly operation: string;
|
|
23
|
+
constructor(message: string, status: number, code: number | undefined, operation: string);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 解包 SSO Internal API 响应:
|
|
27
|
+
* - 信封缺失/格式不符(如 SSO 不可用时网关返回 HTML)→ 抛 SsoInternalApiError
|
|
28
|
+
* (message: "<operation> failed: unexpected response envelope")
|
|
29
|
+
* - HTTP 非 200 或业务 code 非 0/200 → 抛 SsoInternalApiError(含 msg)
|
|
30
|
+
* - 成功 → 返回 data
|
|
31
|
+
*
|
|
32
|
+
* 替代裸 `response.data.data`,避免 SSO 抖动时把 undefined 透传给调用方
|
|
33
|
+
* 导致下游 `.map()` 等操作崩溃(见 models 侧 `roles.map is not a function`)。
|
|
34
|
+
*/
|
|
35
|
+
export declare function unwrapSsoResponse<T>(response: AxiosResponse<unknown>, operation: string): T;
|
|
36
|
+
//# sourceMappingURL=sso-response.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-response.util.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-response.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,CAAC,CAAC;CACV;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAG1C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAH1B,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,SAAS,EAAE,MAAM;CAK7B;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,SAAS,EAAE,MAAM,GAChB,CAAC,CAsBH"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SsoInternalApiError = void 0;
|
|
4
|
+
exports.unwrapSsoResponse = unwrapSsoResponse;
|
|
5
|
+
/**
|
|
6
|
+
* SSO Internal API 调用失败时抛出的错误。
|
|
7
|
+
*
|
|
8
|
+
* 携带 HTTP status、业务 code 与 operation,便于调用方按需降级
|
|
9
|
+
* (例如列表接口在 SSO 抖动时回退空数组,而非把 undefined 透传给下游)。
|
|
10
|
+
*/
|
|
11
|
+
class SsoInternalApiError extends Error {
|
|
12
|
+
status;
|
|
13
|
+
code;
|
|
14
|
+
operation;
|
|
15
|
+
constructor(message, status, code, operation) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.status = status;
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.operation = operation;
|
|
20
|
+
this.name = "SsoInternalApiError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.SsoInternalApiError = SsoInternalApiError;
|
|
24
|
+
function isSuccessCode(code) {
|
|
25
|
+
return code === 0 || code === 200;
|
|
26
|
+
}
|
|
27
|
+
function isSsoApiResponse(body) {
|
|
28
|
+
return (typeof body === "object" &&
|
|
29
|
+
body !== null &&
|
|
30
|
+
"code" in body &&
|
|
31
|
+
typeof body.code === "number" &&
|
|
32
|
+
"msg" in body);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 解包 SSO Internal API 响应:
|
|
36
|
+
* - 信封缺失/格式不符(如 SSO 不可用时网关返回 HTML)→ 抛 SsoInternalApiError
|
|
37
|
+
* (message: "<operation> failed: unexpected response envelope")
|
|
38
|
+
* - HTTP 非 200 或业务 code 非 0/200 → 抛 SsoInternalApiError(含 msg)
|
|
39
|
+
* - 成功 → 返回 data
|
|
40
|
+
*
|
|
41
|
+
* 替代裸 `response.data.data`,避免 SSO 抖动时把 undefined 透传给调用方
|
|
42
|
+
* 导致下游 `.map()` 等操作崩溃(见 models 侧 `roles.map is not a function`)。
|
|
43
|
+
*/
|
|
44
|
+
function unwrapSsoResponse(response, operation) {
|
|
45
|
+
const body = response.data;
|
|
46
|
+
if (!isSsoApiResponse(body)) {
|
|
47
|
+
throw new SsoInternalApiError(`${operation} failed: unexpected response envelope`, response.status, undefined, operation);
|
|
48
|
+
}
|
|
49
|
+
if (response.status !== 200 || !isSuccessCode(body.code)) {
|
|
50
|
+
throw new SsoInternalApiError(`${operation} failed: ${body.msg ?? "unknown error"}`, response.status, body.code, operation);
|
|
51
|
+
}
|
|
52
|
+
return body.data;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sso-response.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-response.util.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-response.util.ts"],"names":[],"mappings":";;;AAwDA,8CAyBC;AAnED;;;;;GAKG;AACH,MAAa,mBAAoB,SAAQ,KAAK;IAGjC;IACA;IACA;IAJX,YACE,OAAe,EACN,MAAc,EACd,IAAwB,EACxB,SAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAoB;QACxB,cAAS,GAAT,SAAS,CAAQ;QAG1B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAVD,kDAUC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAa;IACrC,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,MAAM,IAAI,IAAI;QACd,OAAQ,IAA0B,CAAC,IAAI,KAAK,QAAQ;QACpD,KAAK,IAAI,IAAI,CACd,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,iBAAiB,CAC/B,QAAgC,EAChC,SAAiB;IAEjB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,mBAAmB,CAC3B,GAAG,SAAS,uCAAuC,EACnD,QAAQ,CAAC,MAAM,EACf,SAAS,EACT,SAAS,CACV,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,mBAAmB,CAC3B,GAAG,SAAS,YAAY,IAAI,CAAC,GAAG,IAAI,eAAe,EAAE,EACrD,QAAQ,CAAC,MAAM,EACf,IAAI,CAAC,IAAI,EACT,SAAS,CACV,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,IAAS,CAAC;AACxB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dofe/infra-clients",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.91",
|
|
4
4
|
"description": "Third-party SDK clients — AI, SMS, SSO, file storage, OpenClaw, Feishu, email, OCR, and more",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.19.0"
|
|
@@ -392,6 +392,10 @@
|
|
|
392
392
|
"types": "./dist/internal/sso/sso-rbac.client.d.ts",
|
|
393
393
|
"default": "./dist/internal/sso/sso-rbac.client.js"
|
|
394
394
|
},
|
|
395
|
+
"./sso/sso-response.util": {
|
|
396
|
+
"types": "./dist/internal/sso/sso-response.util.d.ts",
|
|
397
|
+
"default": "./dist/internal/sso/sso-response.util.js"
|
|
398
|
+
},
|
|
395
399
|
"./sso/sso.module": {
|
|
396
400
|
"types": "./dist/internal/sso/sso.module.d.ts",
|
|
397
401
|
"default": "./dist/internal/sso/sso.module.js"
|
|
@@ -439,8 +443,8 @@
|
|
|
439
443
|
"@aws-sdk/client-s3": "^3.978.0",
|
|
440
444
|
"@aws-sdk/client-sts": "^3.1024.0",
|
|
441
445
|
"@aws-sdk/s3-request-presigner": "^3.978.0",
|
|
442
|
-
"@dofe/infra-contracts": "^0.1.
|
|
443
|
-
"@dofe/infra-docker": "^0.1.
|
|
446
|
+
"@dofe/infra-contracts": "^0.1.91",
|
|
447
|
+
"@dofe/infra-docker": "^0.1.91",
|
|
444
448
|
"@google-cloud/storage": "^7.12.0",
|
|
445
449
|
"@larksuiteoapi/node-sdk": "^1.30.0",
|
|
446
450
|
"@nestjs/axios": "^4.0.0",
|
|
@@ -468,9 +472,9 @@
|
|
|
468
472
|
"zod": "^4.3.6"
|
|
469
473
|
},
|
|
470
474
|
"dependencies": {
|
|
471
|
-
"@dofe/infra-common": "^0.1.
|
|
472
|
-
"@dofe/infra-redis": "^0.1.
|
|
473
|
-
"@dofe/infra-utils": "^0.1.
|
|
475
|
+
"@dofe/infra-common": "^0.1.91",
|
|
476
|
+
"@dofe/infra-redis": "^0.1.91",
|
|
477
|
+
"@dofe/infra-utils": "^0.1.91"
|
|
474
478
|
},
|
|
475
479
|
"devDependencies": {
|
|
476
480
|
"rimraf": "^6.1.3",
|