@aiquants/auth-directory-drizzle 0.2.0
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/LICENSE +21 -0
- package/README.md +115 -0
- package/dist/index.d.mts +1862 -0
- package/dist/index.d.ts +1862 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +74 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,1862 @@
|
|
|
1
|
+
import { AuthzAdminStore } from '@aiquants/authz-core';
|
|
2
|
+
import { AuthzTables, createAdminLockoutGuard } from '@aiquants/authz-drizzle';
|
|
3
|
+
import * as drizzle_orm_mssql_core from 'drizzle-orm/mssql-core';
|
|
4
|
+
import { AnyMsSqlColumn } from 'drizzle-orm/mssql-core';
|
|
5
|
+
import { AuthGroupExternalLink, AuthDirectoryMembershipMode, AuthDirectoryStatus, AuthAllowlistEntry } from '@aiquants/auth-core';
|
|
6
|
+
import { TenantMembershipPolicy, SyncAbort, AuthDirectoryMembershipMode as AuthDirectoryMembershipMode$1, LocalGroupSnapshot, DirectoryMember, ResolvedDirectoryMember, GroupSyncPlan, DirectoryGroup, DirectoryProvider, BlastRadiusPolicy } from '@aiquants/auth-directory-core';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @module db
|
|
10
|
+
* @description Minimal query-builder shapes this adapter uses.
|
|
11
|
+
* 本アダプタが使う最小の問い合わせビルダー形状。
|
|
12
|
+
*
|
|
13
|
+
* drizzle の具体型ではなく構造的な型で受けるのは、ホストが用意した `NodeMsSqlDatabase` の型
|
|
14
|
+
* パラメータ (スキーマ・ロガー等) が配備ごとに違い、それを署名へ引き回すと利用側が
|
|
15
|
+
* `as any` を書く羽目になるためである。実体は実行時にこれらを満たす。
|
|
16
|
+
*/
|
|
17
|
+
type Rows<T> = PromiseLike<T[]>;
|
|
18
|
+
interface SelectChain<T> extends Rows<T> {
|
|
19
|
+
from(t: unknown): SelectChain<T>;
|
|
20
|
+
innerJoin(t: unknown, on: unknown): SelectChain<T>;
|
|
21
|
+
leftJoin(t: unknown, on: unknown): SelectChain<T>;
|
|
22
|
+
where(cond: unknown): SelectChain<T>;
|
|
23
|
+
orderBy(...cols: unknown[]): SelectChain<T>;
|
|
24
|
+
groupBy(...cols: unknown[]): SelectChain<T>;
|
|
25
|
+
}
|
|
26
|
+
interface InsertChain {
|
|
27
|
+
values(v: unknown): PromiseLike<unknown>;
|
|
28
|
+
output(): InsertChain;
|
|
29
|
+
}
|
|
30
|
+
interface UpdateChain {
|
|
31
|
+
set(v: unknown): UpdateChain;
|
|
32
|
+
output(): UpdateChain;
|
|
33
|
+
where(cond: unknown): PromiseLike<unknown>;
|
|
34
|
+
}
|
|
35
|
+
interface DeleteChain {
|
|
36
|
+
where(cond: unknown): PromiseLike<unknown>;
|
|
37
|
+
}
|
|
38
|
+
/** The database surface the directory adapter needs. ディレクトリアダプタが必要とする DB 面。 */
|
|
39
|
+
interface DirectoryDb {
|
|
40
|
+
select<T = Record<string, unknown>>(fields?: unknown): SelectChain<T>;
|
|
41
|
+
insert(t: unknown): InsertChain;
|
|
42
|
+
update(t: unknown): UpdateChain;
|
|
43
|
+
delete(t: unknown): DeleteChain;
|
|
44
|
+
transaction<T>(fn: (tx: DirectoryDb) => Promise<T>, config?: unknown): Promise<T>;
|
|
45
|
+
}
|
|
46
|
+
/** Ensures a connection exists before the first statement. 最初の文の前に接続を確立する処理。 */
|
|
47
|
+
type EnsureConnection = () => Promise<void>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @module guards
|
|
51
|
+
* @description Keeps administrative roles off groups whose membership an upstream directory owns.
|
|
52
|
+
* 所属の所有者が上流ディレクトリにあるグループへ、管理ロールが付かないようにする。
|
|
53
|
+
*
|
|
54
|
+
* **不変条件は状態の性質であって、遷移の性質ではない。**
|
|
55
|
+
*
|
|
56
|
+
* 最初の実装は `assignGroupRole` だけを差し替えていた。しかしそれは「外部グループへ管理ロールを
|
|
57
|
+
* 割り当てる」という 1 つの遷移を塞いだにすぎず、**無害なロールを外部グループへ割り当ててから、
|
|
58
|
+
* そのロールを管理ロールへ昇格させる**という順序が開いたままだった。不変条件を守るには、それを
|
|
59
|
+
* 崩し得るすべての遷移を塞ぐ必要がある。
|
|
60
|
+
*
|
|
61
|
+
* 崩し得る遷移は 3 つある。
|
|
62
|
+
*
|
|
63
|
+
* | # | 遷移 | 塞ぐもの |
|
|
64
|
+
* | --- | --- | --- |
|
|
65
|
+
* | 1 | 外部グループが管理ロールを得る | `assignGroupRole` |
|
|
66
|
+
* | 2 | 外部グループが持つロールが管理ロールになる | `createGrant` |
|
|
67
|
+
* | 3 | 管理ロールを持つグループが外部連携される | `assertGroupMayBeLinked` |
|
|
68
|
+
*
|
|
69
|
+
* `updateGrant` は塞ぐ必要がない。`(role_id, resource_id, action)` が一意であるため、管理リソースの
|
|
70
|
+
* 4 アクションを揃えるには 4 行の付与が要り、既に 4 行あるロールは既に管理ロールである。既存行の
|
|
71
|
+
* アクションを差し替えても集合の要素数は増えないので、`updateGrant` は管理権を **作れない**。
|
|
72
|
+
*
|
|
73
|
+
* `setRoleActive` も塞ぐ必要がない。遷移 1 の判定はロールの有効・無効を見ないため、無効な管理
|
|
74
|
+
* ロールも外部グループへは割り当てられない。したがって「無効な管理ロールを外部グループが保持した
|
|
75
|
+
* まま有効化される」という状態には到達し得ない。
|
|
76
|
+
*
|
|
77
|
+
* **なぜ認可パッケージの中で判定しないのか。** 判定を `@aiquants/authz-drizzle` の管理ストアへ
|
|
78
|
+
* 埋め込むと、認可パッケージがグループの「出所」という identity 側の概念を知ることになる。依存の
|
|
79
|
+
* 向きは auth → authz の一方通行で保ちたいので、包む側 (identity 側) から課す。
|
|
80
|
+
*
|
|
81
|
+
* **なぜ禁止するのか。** 外部グループの所属は上流の管理者が変更できる。そこへ管理ロールを付けると、
|
|
82
|
+
* 上流側の 1 操作がこの配備の管理者を増やしたり、逆に最後の管理者を奪ったりする。ブレークグラス
|
|
83
|
+
* 経路は常にローカルに残しておく必要がある。
|
|
84
|
+
*/
|
|
85
|
+
|
|
86
|
+
/** The link lookup this guard needs. 本ガードが必要とするリンク参照。 */
|
|
87
|
+
type ExternalLinkLookup = {
|
|
88
|
+
/**
|
|
89
|
+
* The upstream key of the group, or `null` when its membership is locally managed.
|
|
90
|
+
* そのグループの上流キー。ローカル管理なら `null`。
|
|
91
|
+
*
|
|
92
|
+
* 「外部かどうか」と「拒否メッセージに出す名前」を 1 回の照会で返す。判定のためだけに
|
|
93
|
+
* 引いて、名前のためにもう一度引く形にすると、拒否のたびに往復が 2 倍になる。
|
|
94
|
+
*/
|
|
95
|
+
externalGroupKey(tenantId: string, groupId: number): Promise<string | null>;
|
|
96
|
+
};
|
|
97
|
+
/** Configuration of the guard. ガードの構成。 */
|
|
98
|
+
type ExternalGroupGuardOptions = {
|
|
99
|
+
linkLookup: ExternalLinkLookup;
|
|
100
|
+
/** App key the administrative resource belongs to. 管理リソースが属するアプリキー。 */
|
|
101
|
+
adminAppKey: string;
|
|
102
|
+
/** Resource key that grants administration. 管理を与えるリソースキー。 */
|
|
103
|
+
adminResourceKey: string;
|
|
104
|
+
/**
|
|
105
|
+
* Refusal message. 拒否メッセージ。
|
|
106
|
+
*
|
|
107
|
+
* @param roleKey Role that would have conferred administration. 管理権を与えることになるロール。
|
|
108
|
+
* @param groupKey Group that would have held it. それを保持することになるグループ。
|
|
109
|
+
*/
|
|
110
|
+
message: (roleKey: string, groupKey: string) => string;
|
|
111
|
+
};
|
|
112
|
+
/** Default refusal message (Japanese, matching the admin UI's locale). 既定の拒否メッセージ。 */
|
|
113
|
+
declare const defaultExternalGroupGuardMessage: (roleKey: string, groupKey: string) => string;
|
|
114
|
+
/**
|
|
115
|
+
* Wraps an authorization admin store so administrative power cannot reach an external group.
|
|
116
|
+
* 外部グループへ管理権が届かないよう認可管理ストアを包む処理。
|
|
117
|
+
*
|
|
118
|
+
* `assignGroupRole` と `createGrant` を差し替え、残りは透過的に委譲する。3 番目の方向
|
|
119
|
+
* (連携の開始) は {@link assertGroupMayBeLinked} が担い、リンクを作る側が必ず通す。
|
|
120
|
+
*
|
|
121
|
+
* @param store Store to wrap. 包む対象のストア。
|
|
122
|
+
* @param opts Link lookup and administrative resource identity. リンク参照と管理リソースの同定。
|
|
123
|
+
* @returns A store with the same surface. 同一表面のストア。
|
|
124
|
+
*/
|
|
125
|
+
declare function withExternalGroupGuards<R>(store: AuthzAdminStore<R>, opts: ExternalGroupGuardOptions): AuthzAdminStore<R>;
|
|
126
|
+
/**
|
|
127
|
+
* Refuses to link a group that already holds an administrative role.
|
|
128
|
+
* 既に管理ロールを保持しているグループの外部連携を拒否する処理。
|
|
129
|
+
*
|
|
130
|
+
* 3 つ目の方向。これを通さずにリンクを作ると、ローカルで管理ロールを付けてから連携させる経路が
|
|
131
|
+
* 残る。{@link withExternalGroupGuards} と違って呼び出し側が忘れ得るため、リンクを作る側の
|
|
132
|
+
* 構成に必須ポートとして組み込むこと。
|
|
133
|
+
*
|
|
134
|
+
* @param store Authorization admin store used to read the grants. 付与を読む認可管理ストア。
|
|
135
|
+
* @param tenantId Tenant the group belongs to. グループが属するテナント。
|
|
136
|
+
* @param groupId Group about to be linked. 連携しようとしているグループ。
|
|
137
|
+
* @param opts Administrative resource identity and refusal message. 管理リソースの同定と文言。
|
|
138
|
+
* @returns Nothing; returns normally only when linking is allowed. 許可される場合のみ正常復帰。
|
|
139
|
+
* @throws {Error} When the group holds the administrative role. 管理ロールを保持している場合。
|
|
140
|
+
*/
|
|
141
|
+
declare function assertGroupMayBeLinked(store: AuthzAdminStore, tenantId: string, groupId: number, opts: Pick<ExternalGroupGuardOptions, "adminAppKey" | "adminResourceKey" | "message">): Promise<void>;
|
|
142
|
+
|
|
143
|
+
/** Minimal shape of a table this schema points a foreign key at. 外部キーの参照先に要る最小形。 */
|
|
144
|
+
type ReferencedTable = {
|
|
145
|
+
id: AnyMsSqlColumn;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Physical name of the provenance discriminator carried by an external link row.
|
|
149
|
+
* 外部リンク行が持つ供給元識別子の物理名。
|
|
150
|
+
*/
|
|
151
|
+
declare const AUTH_DIRECTORY_PROVIDER_COLUMN = "provider";
|
|
152
|
+
/**
|
|
153
|
+
* Table names that carry {@link AUTHZ_TENANT_COLUMN}.
|
|
154
|
+
* テナント列を持つ表の名前一覧。
|
|
155
|
+
*
|
|
156
|
+
* `TDGroupMemberEmail` が含まれないのは、親グループからテナントを継承するためである。
|
|
157
|
+
*/
|
|
158
|
+
declare const AUTH_DIRECTORY_TENANT_SCOPED_TABLES: readonly ["TDGroupExternalLink", "TDTenantMembershipGroup", "TDAllowlistGroup", "TDDirectorySyncRequest", "TMAllowlist"];
|
|
159
|
+
/**
|
|
160
|
+
* Builds the identity-side tables under an arbitrary schema name.
|
|
161
|
+
* 任意のスキーマ名の下に identity 側テーブル群を構築する処理。
|
|
162
|
+
*
|
|
163
|
+
* @param schemaName Schema the tables live in. テーブルを配置するスキーマ名。
|
|
164
|
+
* @param opts Injected tables the foreign keys point at. 外部キーの参照先として注入する表。
|
|
165
|
+
* @returns Every identity-side table, keyed by table name. 表名をキーにしたテーブル群。
|
|
166
|
+
*/
|
|
167
|
+
declare function defineAuthDirectorySchema<S extends string>(schemaName: S, opts: {
|
|
168
|
+
groupTable: ReferencedTable;
|
|
169
|
+
userTable: ReferencedTable;
|
|
170
|
+
}): {
|
|
171
|
+
TDGroupExternalLink: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
|
|
172
|
+
name: "TDGroupExternalLink";
|
|
173
|
+
schema: S;
|
|
174
|
+
columns: {
|
|
175
|
+
createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
176
|
+
name: string;
|
|
177
|
+
tableName: "TDGroupExternalLink";
|
|
178
|
+
dataType: "object date";
|
|
179
|
+
data: Date;
|
|
180
|
+
driverParam: string | Date;
|
|
181
|
+
notNull: false;
|
|
182
|
+
hasDefault: false;
|
|
183
|
+
isPrimaryKey: false;
|
|
184
|
+
isAutoincrement: false;
|
|
185
|
+
hasRuntimeDefault: false;
|
|
186
|
+
enumValues: undefined;
|
|
187
|
+
baseColumn: never;
|
|
188
|
+
identity: undefined;
|
|
189
|
+
generated: undefined;
|
|
190
|
+
}, {}>;
|
|
191
|
+
createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
192
|
+
name: string;
|
|
193
|
+
tableName: "TDGroupExternalLink";
|
|
194
|
+
dataType: "string";
|
|
195
|
+
data: string;
|
|
196
|
+
driverParam: string | number;
|
|
197
|
+
notNull: false;
|
|
198
|
+
hasDefault: false;
|
|
199
|
+
isPrimaryKey: false;
|
|
200
|
+
isAutoincrement: false;
|
|
201
|
+
hasRuntimeDefault: false;
|
|
202
|
+
enumValues: [string, ...string[]];
|
|
203
|
+
baseColumn: never;
|
|
204
|
+
identity: undefined;
|
|
205
|
+
generated: undefined;
|
|
206
|
+
}, {}>;
|
|
207
|
+
updatedAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
208
|
+
name: string;
|
|
209
|
+
tableName: "TDGroupExternalLink";
|
|
210
|
+
dataType: "object date";
|
|
211
|
+
data: Date;
|
|
212
|
+
driverParam: string | Date;
|
|
213
|
+
notNull: false;
|
|
214
|
+
hasDefault: false;
|
|
215
|
+
isPrimaryKey: false;
|
|
216
|
+
isAutoincrement: false;
|
|
217
|
+
hasRuntimeDefault: false;
|
|
218
|
+
enumValues: undefined;
|
|
219
|
+
baseColumn: never;
|
|
220
|
+
identity: undefined;
|
|
221
|
+
generated: undefined;
|
|
222
|
+
}, {}>;
|
|
223
|
+
updatedBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
224
|
+
name: string;
|
|
225
|
+
tableName: "TDGroupExternalLink";
|
|
226
|
+
dataType: "string";
|
|
227
|
+
data: string;
|
|
228
|
+
driverParam: string | number;
|
|
229
|
+
notNull: false;
|
|
230
|
+
hasDefault: false;
|
|
231
|
+
isPrimaryKey: false;
|
|
232
|
+
isAutoincrement: false;
|
|
233
|
+
hasRuntimeDefault: false;
|
|
234
|
+
enumValues: [string, ...string[]];
|
|
235
|
+
baseColumn: never;
|
|
236
|
+
identity: undefined;
|
|
237
|
+
generated: undefined;
|
|
238
|
+
}, {}>;
|
|
239
|
+
id: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
240
|
+
name: string;
|
|
241
|
+
tableName: "TDGroupExternalLink";
|
|
242
|
+
dataType: "number int53";
|
|
243
|
+
data: number;
|
|
244
|
+
driverParam: string;
|
|
245
|
+
notNull: true;
|
|
246
|
+
hasDefault: true;
|
|
247
|
+
isPrimaryKey: false;
|
|
248
|
+
isAutoincrement: false;
|
|
249
|
+
hasRuntimeDefault: false;
|
|
250
|
+
enumValues: undefined;
|
|
251
|
+
baseColumn: never;
|
|
252
|
+
identity: undefined;
|
|
253
|
+
generated: {};
|
|
254
|
+
}, {}>;
|
|
255
|
+
groupId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
256
|
+
name: string;
|
|
257
|
+
tableName: "TDGroupExternalLink";
|
|
258
|
+
dataType: "number int53";
|
|
259
|
+
data: number;
|
|
260
|
+
driverParam: string;
|
|
261
|
+
notNull: true;
|
|
262
|
+
hasDefault: false;
|
|
263
|
+
isPrimaryKey: false;
|
|
264
|
+
isAutoincrement: false;
|
|
265
|
+
hasRuntimeDefault: false;
|
|
266
|
+
enumValues: undefined;
|
|
267
|
+
baseColumn: never;
|
|
268
|
+
identity: undefined;
|
|
269
|
+
generated: undefined;
|
|
270
|
+
}, {}>;
|
|
271
|
+
tenantId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
272
|
+
name: string;
|
|
273
|
+
tableName: "TDGroupExternalLink";
|
|
274
|
+
dataType: "string";
|
|
275
|
+
data: string;
|
|
276
|
+
driverParam: string | number;
|
|
277
|
+
notNull: true;
|
|
278
|
+
hasDefault: false;
|
|
279
|
+
isPrimaryKey: false;
|
|
280
|
+
isAutoincrement: false;
|
|
281
|
+
hasRuntimeDefault: false;
|
|
282
|
+
enumValues: [string, ...string[]];
|
|
283
|
+
baseColumn: never;
|
|
284
|
+
identity: undefined;
|
|
285
|
+
generated: undefined;
|
|
286
|
+
}, {}>;
|
|
287
|
+
provider: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
288
|
+
name: string;
|
|
289
|
+
tableName: "TDGroupExternalLink";
|
|
290
|
+
dataType: "string";
|
|
291
|
+
data: string;
|
|
292
|
+
driverParam: string | number;
|
|
293
|
+
notNull: true;
|
|
294
|
+
hasDefault: false;
|
|
295
|
+
isPrimaryKey: false;
|
|
296
|
+
isAutoincrement: false;
|
|
297
|
+
hasRuntimeDefault: false;
|
|
298
|
+
enumValues: [string, ...string[]];
|
|
299
|
+
baseColumn: never;
|
|
300
|
+
identity: undefined;
|
|
301
|
+
generated: undefined;
|
|
302
|
+
}, {}>;
|
|
303
|
+
externalId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
304
|
+
name: string;
|
|
305
|
+
tableName: "TDGroupExternalLink";
|
|
306
|
+
dataType: "string";
|
|
307
|
+
data: string;
|
|
308
|
+
driverParam: string | number;
|
|
309
|
+
notNull: true;
|
|
310
|
+
hasDefault: false;
|
|
311
|
+
isPrimaryKey: false;
|
|
312
|
+
isAutoincrement: false;
|
|
313
|
+
hasRuntimeDefault: false;
|
|
314
|
+
enumValues: [string, ...string[]];
|
|
315
|
+
baseColumn: never;
|
|
316
|
+
identity: undefined;
|
|
317
|
+
generated: undefined;
|
|
318
|
+
}, {}>;
|
|
319
|
+
externalKey: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
320
|
+
name: string;
|
|
321
|
+
tableName: "TDGroupExternalLink";
|
|
322
|
+
dataType: "string";
|
|
323
|
+
data: string;
|
|
324
|
+
driverParam: string | number;
|
|
325
|
+
notNull: true;
|
|
326
|
+
hasDefault: false;
|
|
327
|
+
isPrimaryKey: false;
|
|
328
|
+
isAutoincrement: false;
|
|
329
|
+
hasRuntimeDefault: false;
|
|
330
|
+
enumValues: [string, ...string[]];
|
|
331
|
+
baseColumn: never;
|
|
332
|
+
identity: undefined;
|
|
333
|
+
generated: undefined;
|
|
334
|
+
}, {}>;
|
|
335
|
+
membershipMode: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
336
|
+
name: string;
|
|
337
|
+
tableName: "TDGroupExternalLink";
|
|
338
|
+
dataType: "string";
|
|
339
|
+
data: string;
|
|
340
|
+
driverParam: string | number;
|
|
341
|
+
notNull: true;
|
|
342
|
+
hasDefault: false;
|
|
343
|
+
isPrimaryKey: false;
|
|
344
|
+
isAutoincrement: false;
|
|
345
|
+
hasRuntimeDefault: false;
|
|
346
|
+
enumValues: [string, ...string[]];
|
|
347
|
+
baseColumn: never;
|
|
348
|
+
identity: undefined;
|
|
349
|
+
generated: undefined;
|
|
350
|
+
}, {}>;
|
|
351
|
+
isSyncEnabled: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
352
|
+
name: string;
|
|
353
|
+
tableName: "TDGroupExternalLink";
|
|
354
|
+
dataType: "boolean";
|
|
355
|
+
data: boolean;
|
|
356
|
+
driverParam: string | number;
|
|
357
|
+
notNull: true;
|
|
358
|
+
hasDefault: false;
|
|
359
|
+
isPrimaryKey: false;
|
|
360
|
+
isAutoincrement: false;
|
|
361
|
+
hasRuntimeDefault: false;
|
|
362
|
+
enumValues: undefined;
|
|
363
|
+
baseColumn: never;
|
|
364
|
+
identity: undefined;
|
|
365
|
+
generated: undefined;
|
|
366
|
+
}, {}>;
|
|
367
|
+
syncedAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
368
|
+
name: string;
|
|
369
|
+
tableName: "TDGroupExternalLink";
|
|
370
|
+
dataType: "object date";
|
|
371
|
+
data: Date;
|
|
372
|
+
driverParam: string | Date;
|
|
373
|
+
notNull: false;
|
|
374
|
+
hasDefault: false;
|
|
375
|
+
isPrimaryKey: false;
|
|
376
|
+
isAutoincrement: false;
|
|
377
|
+
hasRuntimeDefault: false;
|
|
378
|
+
enumValues: undefined;
|
|
379
|
+
baseColumn: never;
|
|
380
|
+
identity: undefined;
|
|
381
|
+
generated: undefined;
|
|
382
|
+
}, {}>;
|
|
383
|
+
syncError: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
384
|
+
name: string;
|
|
385
|
+
tableName: "TDGroupExternalLink";
|
|
386
|
+
dataType: "string";
|
|
387
|
+
data: string;
|
|
388
|
+
driverParam: string | number;
|
|
389
|
+
notNull: false;
|
|
390
|
+
hasDefault: false;
|
|
391
|
+
isPrimaryKey: false;
|
|
392
|
+
isAutoincrement: false;
|
|
393
|
+
hasRuntimeDefault: false;
|
|
394
|
+
enumValues: [string, ...string[]];
|
|
395
|
+
baseColumn: never;
|
|
396
|
+
identity: undefined;
|
|
397
|
+
generated: undefined;
|
|
398
|
+
}, {}>;
|
|
399
|
+
vanishedObservations: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
400
|
+
name: string;
|
|
401
|
+
tableName: "TDGroupExternalLink";
|
|
402
|
+
dataType: "number int32";
|
|
403
|
+
data: number;
|
|
404
|
+
driverParam: number;
|
|
405
|
+
notNull: true;
|
|
406
|
+
hasDefault: false;
|
|
407
|
+
isPrimaryKey: false;
|
|
408
|
+
isAutoincrement: false;
|
|
409
|
+
hasRuntimeDefault: false;
|
|
410
|
+
enumValues: undefined;
|
|
411
|
+
baseColumn: never;
|
|
412
|
+
identity: undefined;
|
|
413
|
+
generated: undefined;
|
|
414
|
+
}, {}>;
|
|
415
|
+
};
|
|
416
|
+
dialect: "mssql";
|
|
417
|
+
}>;
|
|
418
|
+
TDGroupMemberEmail: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
|
|
419
|
+
name: "TDGroupMemberEmail";
|
|
420
|
+
schema: S;
|
|
421
|
+
columns: {
|
|
422
|
+
createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
423
|
+
name: string;
|
|
424
|
+
tableName: "TDGroupMemberEmail";
|
|
425
|
+
dataType: "object date";
|
|
426
|
+
data: Date;
|
|
427
|
+
driverParam: string | Date;
|
|
428
|
+
notNull: false;
|
|
429
|
+
hasDefault: false;
|
|
430
|
+
isPrimaryKey: false;
|
|
431
|
+
isAutoincrement: false;
|
|
432
|
+
hasRuntimeDefault: false;
|
|
433
|
+
enumValues: undefined;
|
|
434
|
+
baseColumn: never;
|
|
435
|
+
identity: undefined;
|
|
436
|
+
generated: undefined;
|
|
437
|
+
}, {}>;
|
|
438
|
+
createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
439
|
+
name: string;
|
|
440
|
+
tableName: "TDGroupMemberEmail";
|
|
441
|
+
dataType: "string";
|
|
442
|
+
data: string;
|
|
443
|
+
driverParam: string | number;
|
|
444
|
+
notNull: false;
|
|
445
|
+
hasDefault: false;
|
|
446
|
+
isPrimaryKey: false;
|
|
447
|
+
isAutoincrement: false;
|
|
448
|
+
hasRuntimeDefault: false;
|
|
449
|
+
enumValues: [string, ...string[]];
|
|
450
|
+
baseColumn: never;
|
|
451
|
+
identity: undefined;
|
|
452
|
+
generated: undefined;
|
|
453
|
+
}, {}>;
|
|
454
|
+
updatedAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
455
|
+
name: string;
|
|
456
|
+
tableName: "TDGroupMemberEmail";
|
|
457
|
+
dataType: "object date";
|
|
458
|
+
data: Date;
|
|
459
|
+
driverParam: string | Date;
|
|
460
|
+
notNull: false;
|
|
461
|
+
hasDefault: false;
|
|
462
|
+
isPrimaryKey: false;
|
|
463
|
+
isAutoincrement: false;
|
|
464
|
+
hasRuntimeDefault: false;
|
|
465
|
+
enumValues: undefined;
|
|
466
|
+
baseColumn: never;
|
|
467
|
+
identity: undefined;
|
|
468
|
+
generated: undefined;
|
|
469
|
+
}, {}>;
|
|
470
|
+
updatedBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
471
|
+
name: string;
|
|
472
|
+
tableName: "TDGroupMemberEmail";
|
|
473
|
+
dataType: "string";
|
|
474
|
+
data: string;
|
|
475
|
+
driverParam: string | number;
|
|
476
|
+
notNull: false;
|
|
477
|
+
hasDefault: false;
|
|
478
|
+
isPrimaryKey: false;
|
|
479
|
+
isAutoincrement: false;
|
|
480
|
+
hasRuntimeDefault: false;
|
|
481
|
+
enumValues: [string, ...string[]];
|
|
482
|
+
baseColumn: never;
|
|
483
|
+
identity: undefined;
|
|
484
|
+
generated: undefined;
|
|
485
|
+
}, {}>;
|
|
486
|
+
id: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
487
|
+
name: string;
|
|
488
|
+
tableName: "TDGroupMemberEmail";
|
|
489
|
+
dataType: "number int53";
|
|
490
|
+
data: number;
|
|
491
|
+
driverParam: string;
|
|
492
|
+
notNull: true;
|
|
493
|
+
hasDefault: true;
|
|
494
|
+
isPrimaryKey: false;
|
|
495
|
+
isAutoincrement: false;
|
|
496
|
+
hasRuntimeDefault: false;
|
|
497
|
+
enumValues: undefined;
|
|
498
|
+
baseColumn: never;
|
|
499
|
+
identity: undefined;
|
|
500
|
+
generated: {};
|
|
501
|
+
}, {}>;
|
|
502
|
+
groupId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
503
|
+
name: string;
|
|
504
|
+
tableName: "TDGroupMemberEmail";
|
|
505
|
+
dataType: "number int53";
|
|
506
|
+
data: number;
|
|
507
|
+
driverParam: string;
|
|
508
|
+
notNull: true;
|
|
509
|
+
hasDefault: false;
|
|
510
|
+
isPrimaryKey: false;
|
|
511
|
+
isAutoincrement: false;
|
|
512
|
+
hasRuntimeDefault: false;
|
|
513
|
+
enumValues: undefined;
|
|
514
|
+
baseColumn: never;
|
|
515
|
+
identity: undefined;
|
|
516
|
+
generated: undefined;
|
|
517
|
+
}, {}>;
|
|
518
|
+
email: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
519
|
+
name: string;
|
|
520
|
+
tableName: "TDGroupMemberEmail";
|
|
521
|
+
dataType: "string";
|
|
522
|
+
data: string;
|
|
523
|
+
driverParam: string | number;
|
|
524
|
+
notNull: true;
|
|
525
|
+
hasDefault: false;
|
|
526
|
+
isPrimaryKey: false;
|
|
527
|
+
isAutoincrement: false;
|
|
528
|
+
hasRuntimeDefault: false;
|
|
529
|
+
enumValues: [string, ...string[]];
|
|
530
|
+
baseColumn: never;
|
|
531
|
+
identity: undefined;
|
|
532
|
+
generated: undefined;
|
|
533
|
+
}, {}>;
|
|
534
|
+
externalUserId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
535
|
+
name: string;
|
|
536
|
+
tableName: "TDGroupMemberEmail";
|
|
537
|
+
dataType: "string";
|
|
538
|
+
data: string;
|
|
539
|
+
driverParam: string | number;
|
|
540
|
+
notNull: false;
|
|
541
|
+
hasDefault: false;
|
|
542
|
+
isPrimaryKey: false;
|
|
543
|
+
isAutoincrement: false;
|
|
544
|
+
hasRuntimeDefault: false;
|
|
545
|
+
enumValues: [string, ...string[]];
|
|
546
|
+
baseColumn: never;
|
|
547
|
+
identity: undefined;
|
|
548
|
+
generated: undefined;
|
|
549
|
+
}, {}>;
|
|
550
|
+
resolvedUserId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
551
|
+
name: string;
|
|
552
|
+
tableName: "TDGroupMemberEmail";
|
|
553
|
+
dataType: "number int53";
|
|
554
|
+
data: number;
|
|
555
|
+
driverParam: string;
|
|
556
|
+
notNull: false;
|
|
557
|
+
hasDefault: false;
|
|
558
|
+
isPrimaryKey: false;
|
|
559
|
+
isAutoincrement: false;
|
|
560
|
+
hasRuntimeDefault: false;
|
|
561
|
+
enumValues: undefined;
|
|
562
|
+
baseColumn: never;
|
|
563
|
+
identity: undefined;
|
|
564
|
+
generated: undefined;
|
|
565
|
+
}, {}>;
|
|
566
|
+
observedAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
567
|
+
name: string;
|
|
568
|
+
tableName: "TDGroupMemberEmail";
|
|
569
|
+
dataType: "object date";
|
|
570
|
+
data: Date;
|
|
571
|
+
driverParam: string | Date;
|
|
572
|
+
notNull: true;
|
|
573
|
+
hasDefault: false;
|
|
574
|
+
isPrimaryKey: false;
|
|
575
|
+
isAutoincrement: false;
|
|
576
|
+
hasRuntimeDefault: false;
|
|
577
|
+
enumValues: undefined;
|
|
578
|
+
baseColumn: never;
|
|
579
|
+
identity: undefined;
|
|
580
|
+
generated: undefined;
|
|
581
|
+
}, {}>;
|
|
582
|
+
};
|
|
583
|
+
dialect: "mssql";
|
|
584
|
+
}>;
|
|
585
|
+
TDTenantMembershipGroup: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
|
|
586
|
+
name: "TDTenantMembershipGroup";
|
|
587
|
+
schema: S;
|
|
588
|
+
columns: {
|
|
589
|
+
createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
590
|
+
name: string;
|
|
591
|
+
tableName: "TDTenantMembershipGroup";
|
|
592
|
+
dataType: "object date";
|
|
593
|
+
data: Date;
|
|
594
|
+
driverParam: string | Date;
|
|
595
|
+
notNull: false;
|
|
596
|
+
hasDefault: false;
|
|
597
|
+
isPrimaryKey: false;
|
|
598
|
+
isAutoincrement: false;
|
|
599
|
+
hasRuntimeDefault: false;
|
|
600
|
+
enumValues: undefined;
|
|
601
|
+
baseColumn: never;
|
|
602
|
+
identity: undefined;
|
|
603
|
+
generated: undefined;
|
|
604
|
+
}, {}>;
|
|
605
|
+
createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
606
|
+
name: string;
|
|
607
|
+
tableName: "TDTenantMembershipGroup";
|
|
608
|
+
dataType: "string";
|
|
609
|
+
data: string;
|
|
610
|
+
driverParam: string | number;
|
|
611
|
+
notNull: false;
|
|
612
|
+
hasDefault: false;
|
|
613
|
+
isPrimaryKey: false;
|
|
614
|
+
isAutoincrement: false;
|
|
615
|
+
hasRuntimeDefault: false;
|
|
616
|
+
enumValues: [string, ...string[]];
|
|
617
|
+
baseColumn: never;
|
|
618
|
+
identity: undefined;
|
|
619
|
+
generated: undefined;
|
|
620
|
+
}, {}>;
|
|
621
|
+
tenantId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
622
|
+
name: string;
|
|
623
|
+
tableName: "TDTenantMembershipGroup";
|
|
624
|
+
dataType: "string";
|
|
625
|
+
data: string;
|
|
626
|
+
driverParam: string | number;
|
|
627
|
+
notNull: true;
|
|
628
|
+
hasDefault: false;
|
|
629
|
+
isPrimaryKey: false;
|
|
630
|
+
isAutoincrement: false;
|
|
631
|
+
hasRuntimeDefault: false;
|
|
632
|
+
enumValues: [string, ...string[]];
|
|
633
|
+
baseColumn: never;
|
|
634
|
+
identity: undefined;
|
|
635
|
+
generated: undefined;
|
|
636
|
+
}, {}>;
|
|
637
|
+
groupId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
638
|
+
name: string;
|
|
639
|
+
tableName: "TDTenantMembershipGroup";
|
|
640
|
+
dataType: "number int53";
|
|
641
|
+
data: number;
|
|
642
|
+
driverParam: string;
|
|
643
|
+
notNull: true;
|
|
644
|
+
hasDefault: false;
|
|
645
|
+
isPrimaryKey: false;
|
|
646
|
+
isAutoincrement: false;
|
|
647
|
+
hasRuntimeDefault: false;
|
|
648
|
+
enumValues: undefined;
|
|
649
|
+
baseColumn: never;
|
|
650
|
+
identity: undefined;
|
|
651
|
+
generated: undefined;
|
|
652
|
+
}, {}>;
|
|
653
|
+
isBreakGlass: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
654
|
+
name: string;
|
|
655
|
+
tableName: "TDTenantMembershipGroup";
|
|
656
|
+
dataType: "boolean";
|
|
657
|
+
data: boolean;
|
|
658
|
+
driverParam: string | number;
|
|
659
|
+
notNull: true;
|
|
660
|
+
hasDefault: false;
|
|
661
|
+
isPrimaryKey: false;
|
|
662
|
+
isAutoincrement: false;
|
|
663
|
+
hasRuntimeDefault: false;
|
|
664
|
+
enumValues: undefined;
|
|
665
|
+
baseColumn: never;
|
|
666
|
+
identity: undefined;
|
|
667
|
+
generated: undefined;
|
|
668
|
+
}, {}>;
|
|
669
|
+
};
|
|
670
|
+
dialect: "mssql";
|
|
671
|
+
}>;
|
|
672
|
+
TDAllowlistGroup: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
|
|
673
|
+
name: "TDAllowlistGroup";
|
|
674
|
+
schema: S;
|
|
675
|
+
columns: {
|
|
676
|
+
createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
677
|
+
name: string;
|
|
678
|
+
tableName: "TDAllowlistGroup";
|
|
679
|
+
dataType: "object date";
|
|
680
|
+
data: Date;
|
|
681
|
+
driverParam: string | Date;
|
|
682
|
+
notNull: false;
|
|
683
|
+
hasDefault: false;
|
|
684
|
+
isPrimaryKey: false;
|
|
685
|
+
isAutoincrement: false;
|
|
686
|
+
hasRuntimeDefault: false;
|
|
687
|
+
enumValues: undefined;
|
|
688
|
+
baseColumn: never;
|
|
689
|
+
identity: undefined;
|
|
690
|
+
generated: undefined;
|
|
691
|
+
}, {}>;
|
|
692
|
+
createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
693
|
+
name: string;
|
|
694
|
+
tableName: "TDAllowlistGroup";
|
|
695
|
+
dataType: "string";
|
|
696
|
+
data: string;
|
|
697
|
+
driverParam: string | number;
|
|
698
|
+
notNull: false;
|
|
699
|
+
hasDefault: false;
|
|
700
|
+
isPrimaryKey: false;
|
|
701
|
+
isAutoincrement: false;
|
|
702
|
+
hasRuntimeDefault: false;
|
|
703
|
+
enumValues: [string, ...string[]];
|
|
704
|
+
baseColumn: never;
|
|
705
|
+
identity: undefined;
|
|
706
|
+
generated: undefined;
|
|
707
|
+
}, {}>;
|
|
708
|
+
id: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
709
|
+
name: string;
|
|
710
|
+
tableName: "TDAllowlistGroup";
|
|
711
|
+
dataType: "number int53";
|
|
712
|
+
data: number;
|
|
713
|
+
driverParam: string;
|
|
714
|
+
notNull: true;
|
|
715
|
+
hasDefault: true;
|
|
716
|
+
isPrimaryKey: false;
|
|
717
|
+
isAutoincrement: false;
|
|
718
|
+
hasRuntimeDefault: false;
|
|
719
|
+
enumValues: undefined;
|
|
720
|
+
baseColumn: never;
|
|
721
|
+
identity: undefined;
|
|
722
|
+
generated: {};
|
|
723
|
+
}, {}>;
|
|
724
|
+
tenantId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
725
|
+
name: string;
|
|
726
|
+
tableName: "TDAllowlistGroup";
|
|
727
|
+
dataType: "string";
|
|
728
|
+
data: string;
|
|
729
|
+
driverParam: string | number;
|
|
730
|
+
notNull: true;
|
|
731
|
+
hasDefault: false;
|
|
732
|
+
isPrimaryKey: false;
|
|
733
|
+
isAutoincrement: false;
|
|
734
|
+
hasRuntimeDefault: false;
|
|
735
|
+
enumValues: [string, ...string[]];
|
|
736
|
+
baseColumn: never;
|
|
737
|
+
identity: undefined;
|
|
738
|
+
generated: undefined;
|
|
739
|
+
}, {}>;
|
|
740
|
+
groupId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
741
|
+
name: string;
|
|
742
|
+
tableName: "TDAllowlistGroup";
|
|
743
|
+
dataType: "number int53";
|
|
744
|
+
data: number;
|
|
745
|
+
driverParam: string;
|
|
746
|
+
notNull: true;
|
|
747
|
+
hasDefault: false;
|
|
748
|
+
isPrimaryKey: false;
|
|
749
|
+
isAutoincrement: false;
|
|
750
|
+
hasRuntimeDefault: false;
|
|
751
|
+
enumValues: undefined;
|
|
752
|
+
baseColumn: never;
|
|
753
|
+
identity: undefined;
|
|
754
|
+
generated: undefined;
|
|
755
|
+
}, {}>;
|
|
756
|
+
description: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
757
|
+
name: string;
|
|
758
|
+
tableName: "TDAllowlistGroup";
|
|
759
|
+
dataType: "string";
|
|
760
|
+
data: string;
|
|
761
|
+
driverParam: string | number;
|
|
762
|
+
notNull: false;
|
|
763
|
+
hasDefault: false;
|
|
764
|
+
isPrimaryKey: false;
|
|
765
|
+
isAutoincrement: false;
|
|
766
|
+
hasRuntimeDefault: false;
|
|
767
|
+
enumValues: [string, ...string[]];
|
|
768
|
+
baseColumn: never;
|
|
769
|
+
identity: undefined;
|
|
770
|
+
generated: undefined;
|
|
771
|
+
}, {}>;
|
|
772
|
+
};
|
|
773
|
+
dialect: "mssql";
|
|
774
|
+
}>;
|
|
775
|
+
TDDirectorySyncRequest: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
|
|
776
|
+
name: "TDDirectorySyncRequest";
|
|
777
|
+
schema: S;
|
|
778
|
+
columns: {
|
|
779
|
+
createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
780
|
+
name: string;
|
|
781
|
+
tableName: "TDDirectorySyncRequest";
|
|
782
|
+
dataType: "object date";
|
|
783
|
+
data: Date;
|
|
784
|
+
driverParam: string | Date;
|
|
785
|
+
notNull: false;
|
|
786
|
+
hasDefault: false;
|
|
787
|
+
isPrimaryKey: false;
|
|
788
|
+
isAutoincrement: false;
|
|
789
|
+
hasRuntimeDefault: false;
|
|
790
|
+
enumValues: undefined;
|
|
791
|
+
baseColumn: never;
|
|
792
|
+
identity: undefined;
|
|
793
|
+
generated: undefined;
|
|
794
|
+
}, {}>;
|
|
795
|
+
createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
796
|
+
name: string;
|
|
797
|
+
tableName: "TDDirectorySyncRequest";
|
|
798
|
+
dataType: "string";
|
|
799
|
+
data: string;
|
|
800
|
+
driverParam: string | number;
|
|
801
|
+
notNull: false;
|
|
802
|
+
hasDefault: false;
|
|
803
|
+
isPrimaryKey: false;
|
|
804
|
+
isAutoincrement: false;
|
|
805
|
+
hasRuntimeDefault: false;
|
|
806
|
+
enumValues: [string, ...string[]];
|
|
807
|
+
baseColumn: never;
|
|
808
|
+
identity: undefined;
|
|
809
|
+
generated: undefined;
|
|
810
|
+
}, {}>;
|
|
811
|
+
id: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
812
|
+
name: string;
|
|
813
|
+
tableName: "TDDirectorySyncRequest";
|
|
814
|
+
dataType: "number int53";
|
|
815
|
+
data: number;
|
|
816
|
+
driverParam: string;
|
|
817
|
+
notNull: true;
|
|
818
|
+
hasDefault: true;
|
|
819
|
+
isPrimaryKey: false;
|
|
820
|
+
isAutoincrement: false;
|
|
821
|
+
hasRuntimeDefault: false;
|
|
822
|
+
enumValues: undefined;
|
|
823
|
+
baseColumn: never;
|
|
824
|
+
identity: undefined;
|
|
825
|
+
generated: {};
|
|
826
|
+
}, {}>;
|
|
827
|
+
tenantId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
828
|
+
name: string;
|
|
829
|
+
tableName: "TDDirectorySyncRequest";
|
|
830
|
+
dataType: "string";
|
|
831
|
+
data: string;
|
|
832
|
+
driverParam: string | number;
|
|
833
|
+
notNull: true;
|
|
834
|
+
hasDefault: false;
|
|
835
|
+
isPrimaryKey: false;
|
|
836
|
+
isAutoincrement: false;
|
|
837
|
+
hasRuntimeDefault: false;
|
|
838
|
+
enumValues: [string, ...string[]];
|
|
839
|
+
baseColumn: never;
|
|
840
|
+
identity: undefined;
|
|
841
|
+
generated: undefined;
|
|
842
|
+
}, {}>;
|
|
843
|
+
groupId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
844
|
+
name: string;
|
|
845
|
+
tableName: "TDDirectorySyncRequest";
|
|
846
|
+
dataType: "number int53";
|
|
847
|
+
data: number;
|
|
848
|
+
driverParam: string;
|
|
849
|
+
notNull: false;
|
|
850
|
+
hasDefault: false;
|
|
851
|
+
isPrimaryKey: false;
|
|
852
|
+
isAutoincrement: false;
|
|
853
|
+
hasRuntimeDefault: false;
|
|
854
|
+
enumValues: undefined;
|
|
855
|
+
baseColumn: never;
|
|
856
|
+
identity: undefined;
|
|
857
|
+
generated: undefined;
|
|
858
|
+
}, {}>;
|
|
859
|
+
requestedBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
860
|
+
name: string;
|
|
861
|
+
tableName: "TDDirectorySyncRequest";
|
|
862
|
+
dataType: "string";
|
|
863
|
+
data: string;
|
|
864
|
+
driverParam: string | number;
|
|
865
|
+
notNull: true;
|
|
866
|
+
hasDefault: false;
|
|
867
|
+
isPrimaryKey: false;
|
|
868
|
+
isAutoincrement: false;
|
|
869
|
+
hasRuntimeDefault: false;
|
|
870
|
+
enumValues: [string, ...string[]];
|
|
871
|
+
baseColumn: never;
|
|
872
|
+
identity: undefined;
|
|
873
|
+
generated: undefined;
|
|
874
|
+
}, {}>;
|
|
875
|
+
requestedAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
876
|
+
name: string;
|
|
877
|
+
tableName: "TDDirectorySyncRequest";
|
|
878
|
+
dataType: "object date";
|
|
879
|
+
data: Date;
|
|
880
|
+
driverParam: string | Date;
|
|
881
|
+
notNull: true;
|
|
882
|
+
hasDefault: false;
|
|
883
|
+
isPrimaryKey: false;
|
|
884
|
+
isAutoincrement: false;
|
|
885
|
+
hasRuntimeDefault: false;
|
|
886
|
+
enumValues: undefined;
|
|
887
|
+
baseColumn: never;
|
|
888
|
+
identity: undefined;
|
|
889
|
+
generated: undefined;
|
|
890
|
+
}, {}>;
|
|
891
|
+
pickedAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
892
|
+
name: string;
|
|
893
|
+
tableName: "TDDirectorySyncRequest";
|
|
894
|
+
dataType: "object date";
|
|
895
|
+
data: Date;
|
|
896
|
+
driverParam: string | Date;
|
|
897
|
+
notNull: false;
|
|
898
|
+
hasDefault: false;
|
|
899
|
+
isPrimaryKey: false;
|
|
900
|
+
isAutoincrement: false;
|
|
901
|
+
hasRuntimeDefault: false;
|
|
902
|
+
enumValues: undefined;
|
|
903
|
+
baseColumn: never;
|
|
904
|
+
identity: undefined;
|
|
905
|
+
generated: undefined;
|
|
906
|
+
}, {}>;
|
|
907
|
+
finishedAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
908
|
+
name: string;
|
|
909
|
+
tableName: "TDDirectorySyncRequest";
|
|
910
|
+
dataType: "object date";
|
|
911
|
+
data: Date;
|
|
912
|
+
driverParam: string | Date;
|
|
913
|
+
notNull: false;
|
|
914
|
+
hasDefault: false;
|
|
915
|
+
isPrimaryKey: false;
|
|
916
|
+
isAutoincrement: false;
|
|
917
|
+
hasRuntimeDefault: false;
|
|
918
|
+
enumValues: undefined;
|
|
919
|
+
baseColumn: never;
|
|
920
|
+
identity: undefined;
|
|
921
|
+
generated: undefined;
|
|
922
|
+
}, {}>;
|
|
923
|
+
result: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
924
|
+
name: string;
|
|
925
|
+
tableName: "TDDirectorySyncRequest";
|
|
926
|
+
dataType: "string";
|
|
927
|
+
data: string;
|
|
928
|
+
driverParam: string | number;
|
|
929
|
+
notNull: false;
|
|
930
|
+
hasDefault: false;
|
|
931
|
+
isPrimaryKey: false;
|
|
932
|
+
isAutoincrement: false;
|
|
933
|
+
hasRuntimeDefault: false;
|
|
934
|
+
enumValues: [string, ...string[]];
|
|
935
|
+
baseColumn: never;
|
|
936
|
+
identity: undefined;
|
|
937
|
+
generated: undefined;
|
|
938
|
+
}, {}>;
|
|
939
|
+
error: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
940
|
+
name: string;
|
|
941
|
+
tableName: "TDDirectorySyncRequest";
|
|
942
|
+
dataType: "string";
|
|
943
|
+
data: string;
|
|
944
|
+
driverParam: string | number;
|
|
945
|
+
notNull: false;
|
|
946
|
+
hasDefault: false;
|
|
947
|
+
isPrimaryKey: false;
|
|
948
|
+
isAutoincrement: false;
|
|
949
|
+
hasRuntimeDefault: false;
|
|
950
|
+
enumValues: [string, ...string[]];
|
|
951
|
+
baseColumn: never;
|
|
952
|
+
identity: undefined;
|
|
953
|
+
generated: undefined;
|
|
954
|
+
}, {}>;
|
|
955
|
+
};
|
|
956
|
+
dialect: "mssql";
|
|
957
|
+
}>;
|
|
958
|
+
TMAllowlist: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
|
|
959
|
+
name: "TMAllowlist";
|
|
960
|
+
schema: S;
|
|
961
|
+
columns: {
|
|
962
|
+
createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
963
|
+
name: string;
|
|
964
|
+
tableName: "TMAllowlist";
|
|
965
|
+
dataType: "object date";
|
|
966
|
+
data: Date;
|
|
967
|
+
driverParam: string | Date;
|
|
968
|
+
notNull: false;
|
|
969
|
+
hasDefault: false;
|
|
970
|
+
isPrimaryKey: false;
|
|
971
|
+
isAutoincrement: false;
|
|
972
|
+
hasRuntimeDefault: false;
|
|
973
|
+
enumValues: undefined;
|
|
974
|
+
baseColumn: never;
|
|
975
|
+
identity: undefined;
|
|
976
|
+
generated: undefined;
|
|
977
|
+
}, {}>;
|
|
978
|
+
createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
979
|
+
name: string;
|
|
980
|
+
tableName: "TMAllowlist";
|
|
981
|
+
dataType: "string";
|
|
982
|
+
data: string;
|
|
983
|
+
driverParam: string | number;
|
|
984
|
+
notNull: false;
|
|
985
|
+
hasDefault: false;
|
|
986
|
+
isPrimaryKey: false;
|
|
987
|
+
isAutoincrement: false;
|
|
988
|
+
hasRuntimeDefault: false;
|
|
989
|
+
enumValues: [string, ...string[]];
|
|
990
|
+
baseColumn: never;
|
|
991
|
+
identity: undefined;
|
|
992
|
+
generated: undefined;
|
|
993
|
+
}, {}>;
|
|
994
|
+
id: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
995
|
+
name: string;
|
|
996
|
+
tableName: "TMAllowlist";
|
|
997
|
+
dataType: "number int53";
|
|
998
|
+
data: number;
|
|
999
|
+
driverParam: string;
|
|
1000
|
+
notNull: true;
|
|
1001
|
+
hasDefault: true;
|
|
1002
|
+
isPrimaryKey: false;
|
|
1003
|
+
isAutoincrement: false;
|
|
1004
|
+
hasRuntimeDefault: false;
|
|
1005
|
+
enumValues: undefined;
|
|
1006
|
+
baseColumn: never;
|
|
1007
|
+
identity: undefined;
|
|
1008
|
+
generated: {};
|
|
1009
|
+
}, {}>;
|
|
1010
|
+
tenantId: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
1011
|
+
name: string;
|
|
1012
|
+
tableName: "TMAllowlist";
|
|
1013
|
+
dataType: "string";
|
|
1014
|
+
data: string;
|
|
1015
|
+
driverParam: string | number;
|
|
1016
|
+
notNull: true;
|
|
1017
|
+
hasDefault: false;
|
|
1018
|
+
isPrimaryKey: false;
|
|
1019
|
+
isAutoincrement: false;
|
|
1020
|
+
hasRuntimeDefault: false;
|
|
1021
|
+
enumValues: [string, ...string[]];
|
|
1022
|
+
baseColumn: never;
|
|
1023
|
+
identity: undefined;
|
|
1024
|
+
generated: undefined;
|
|
1025
|
+
}, {}>;
|
|
1026
|
+
pattern: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
1027
|
+
name: string;
|
|
1028
|
+
tableName: "TMAllowlist";
|
|
1029
|
+
dataType: "string";
|
|
1030
|
+
data: string;
|
|
1031
|
+
driverParam: string | number;
|
|
1032
|
+
notNull: true;
|
|
1033
|
+
hasDefault: false;
|
|
1034
|
+
isPrimaryKey: false;
|
|
1035
|
+
isAutoincrement: false;
|
|
1036
|
+
hasRuntimeDefault: false;
|
|
1037
|
+
enumValues: [string, ...string[]];
|
|
1038
|
+
baseColumn: never;
|
|
1039
|
+
identity: undefined;
|
|
1040
|
+
generated: undefined;
|
|
1041
|
+
}, {}>;
|
|
1042
|
+
type: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
1043
|
+
name: string;
|
|
1044
|
+
tableName: "TMAllowlist";
|
|
1045
|
+
dataType: "string";
|
|
1046
|
+
data: string;
|
|
1047
|
+
driverParam: string | number;
|
|
1048
|
+
notNull: true;
|
|
1049
|
+
hasDefault: false;
|
|
1050
|
+
isPrimaryKey: false;
|
|
1051
|
+
isAutoincrement: false;
|
|
1052
|
+
hasRuntimeDefault: false;
|
|
1053
|
+
enumValues: [string, ...string[]];
|
|
1054
|
+
baseColumn: never;
|
|
1055
|
+
identity: undefined;
|
|
1056
|
+
generated: undefined;
|
|
1057
|
+
}, {}>;
|
|
1058
|
+
description: drizzle_orm_mssql_core.MsSqlColumn<{
|
|
1059
|
+
name: string;
|
|
1060
|
+
tableName: "TMAllowlist";
|
|
1061
|
+
dataType: "string";
|
|
1062
|
+
data: string;
|
|
1063
|
+
driverParam: string | number;
|
|
1064
|
+
notNull: false;
|
|
1065
|
+
hasDefault: false;
|
|
1066
|
+
isPrimaryKey: false;
|
|
1067
|
+
isAutoincrement: false;
|
|
1068
|
+
hasRuntimeDefault: false;
|
|
1069
|
+
enumValues: [string, ...string[]];
|
|
1070
|
+
baseColumn: never;
|
|
1071
|
+
identity: undefined;
|
|
1072
|
+
generated: undefined;
|
|
1073
|
+
}, {}>;
|
|
1074
|
+
};
|
|
1075
|
+
dialect: "mssql";
|
|
1076
|
+
}>;
|
|
1077
|
+
};
|
|
1078
|
+
/** Explicit alias for the tables `defineAuthDirectorySchema` returns (avoids TS2742). 明示型。 */
|
|
1079
|
+
type AuthDirectoryTables = {
|
|
1080
|
+
TDGroupExternalLink: ReturnType<typeof defineAuthDirectorySchema>["TDGroupExternalLink"];
|
|
1081
|
+
TDGroupMemberEmail: ReturnType<typeof defineAuthDirectorySchema>["TDGroupMemberEmail"];
|
|
1082
|
+
TDTenantMembershipGroup: ReturnType<typeof defineAuthDirectorySchema>["TDTenantMembershipGroup"];
|
|
1083
|
+
TDAllowlistGroup: ReturnType<typeof defineAuthDirectorySchema>["TDAllowlistGroup"];
|
|
1084
|
+
TDDirectorySyncRequest: ReturnType<typeof defineAuthDirectorySchema>["TDDirectorySyncRequest"];
|
|
1085
|
+
TMAllowlist: ReturnType<typeof defineAuthDirectorySchema>["TMAllowlist"];
|
|
1086
|
+
};
|
|
1087
|
+
|
|
1088
|
+
/**
|
|
1089
|
+
* Resolves which member-ledger rows belong to one identity.
|
|
1090
|
+
* 台帳のどの行が 1 人の identity のものかを解決するモジュール。
|
|
1091
|
+
*
|
|
1092
|
+
* 台帳 (`TDGroupMemberEmail`) は「上流に居る人」を、ローカルユーザーへ解決できているかに
|
|
1093
|
+
* 関わらず保持する。ここはその台帳から本人の行だけを取り出す唯一の場所であり、帰属証明
|
|
1094
|
+
* (`listLedgerGroupIds`) と初回ログイン時の昇格 (`promoteLedgerForUser`) は同じ答えを見る。
|
|
1095
|
+
* 突合規則が 2 箇所にあると、片方だけが「本人」と認めた瞬間に権限が食い違う。
|
|
1096
|
+
*/
|
|
1097
|
+
|
|
1098
|
+
/** One ledger row attributed to an identity. identity に帰属した台帳 1 行。 */
|
|
1099
|
+
type LedgerIdentityRow = {
|
|
1100
|
+
ledgerId: number;
|
|
1101
|
+
groupId: number;
|
|
1102
|
+
/** Inherited from the parent group — the ledger has no tenant column. 親グループ由来。 */
|
|
1103
|
+
tenantId: string;
|
|
1104
|
+
};
|
|
1105
|
+
/** The two tables this resolution spans. この解決が跨る 2 表。 */
|
|
1106
|
+
type LedgerIdentityTables = {
|
|
1107
|
+
/** `TDGroupMemberEmail`. */
|
|
1108
|
+
ledger: AuthDirectoryTables["TDGroupMemberEmail"];
|
|
1109
|
+
/** `TMGroup` — owns the tenant and the active flag. テナントと有効フラグの所有者。 */
|
|
1110
|
+
group: AuthzTables["TMGroup"];
|
|
1111
|
+
};
|
|
1112
|
+
/**
|
|
1113
|
+
* Finds every ledger row that belongs to the identity, within one tenant.
|
|
1114
|
+
* 1 テナント内で、その identity に属する台帳行をすべて探す処理。
|
|
1115
|
+
*
|
|
1116
|
+
* 突合順は上流 ID が第一キー、アドレスが第二キー。両方を `OR` で混ぜると優先順位が消え、
|
|
1117
|
+
* 退職者のアドレスを再利用した新入社員が前任者の所属をそのまま継承する。
|
|
1118
|
+
*
|
|
1119
|
+
* @param db - Connected database surface. 接続済みの DB 面。
|
|
1120
|
+
* @param tables - The ledger and its parent group table. 台帳と親グループ表。
|
|
1121
|
+
* @param args - Tenant scope and the identity to match. テナント範囲と突合対象の identity。
|
|
1122
|
+
* @returns Matching rows, deduplicated and ordered by ledger id. 重複排除・台帳 ID 昇順の一致行。
|
|
1123
|
+
*/
|
|
1124
|
+
declare function findLedgerRowsForIdentity(db: DirectoryDb, tables: LedgerIdentityTables, args: {
|
|
1125
|
+
tenantId: string;
|
|
1126
|
+
externalUserId: string | null;
|
|
1127
|
+
email: string;
|
|
1128
|
+
}): Promise<LedgerIdentityRow[]>;
|
|
1129
|
+
|
|
1130
|
+
/**
|
|
1131
|
+
* @module link-store
|
|
1132
|
+
* @description Reads and writes the identity-side tables: external group links, the upstream member
|
|
1133
|
+
* ledger, tenant membership proof, group-based login allowlist, and the sync request queue.
|
|
1134
|
+
* identity 側テーブルの読み書き。外部グループリンク・上流メンバー台帳・テナント帰属証明・
|
|
1135
|
+
* グループ単位のログイン許可・同期要求キュー。
|
|
1136
|
+
*
|
|
1137
|
+
* **テナントの扱いは 2 種類ある。混同すると事故になる。**
|
|
1138
|
+
*
|
|
1139
|
+
* - **絞り込み条件**: リンク・帰属証明グループ。読み書きの双方で SQL 述語になる。
|
|
1140
|
+
* - **所有者**: グループ許可。管理 UI の編集スコープを決めるだけで、**ログイン判定では
|
|
1141
|
+
* 述語にしない** — 認証はテナントの確定より前に起きるため、判定の時点でテナントは存在しない。
|
|
1142
|
+
* このモジュールでは {@link createDirectoryLinkStore} の `isEmailAllowedByGroup` だけが
|
|
1143
|
+
* その例外であり、意図的に全テナントを対象とする。
|
|
1144
|
+
*/
|
|
1145
|
+
|
|
1146
|
+
/**
|
|
1147
|
+
* Proves a group may become externally sourced. グループを外部供給にしてよいことの証明。
|
|
1148
|
+
*
|
|
1149
|
+
* `assertGroupMayBeLinked` を呼ぶだけのポートである。自由関数のままだと呼び出し側が忘れられ、
|
|
1150
|
+
* 「ローカルで管理ロールを付けてから連携させる」経路が残る。必須の構成項目にすることで、
|
|
1151
|
+
* 忘れることを構造的に不可能にする。
|
|
1152
|
+
*/
|
|
1153
|
+
type LinkableAssertion = {
|
|
1154
|
+
/** @throws When the group holds an administrative role. 管理ロールを保持している場合。 */
|
|
1155
|
+
assertLinkable(tenantId: string, groupId: number): Promise<void>;
|
|
1156
|
+
};
|
|
1157
|
+
/** Options for the link store. リンクストアの構成。 */
|
|
1158
|
+
type DirectoryLinkStoreOptions = {
|
|
1159
|
+
/** Required — see {@link LinkableAssertion}. 必須 (忘れられる経路を作らないため)。 */
|
|
1160
|
+
linkable: LinkableAssertion;
|
|
1161
|
+
/** Establishes the connection before the first statement. 最初の文の前に接続を確立する処理。 */
|
|
1162
|
+
ensureConnection?: EnsureConnection;
|
|
1163
|
+
/**
|
|
1164
|
+
* Seconds after which a successful sync counts as overdue. 同期が期限超過とみなされる秒数。
|
|
1165
|
+
*
|
|
1166
|
+
* 同期間隔の数倍を指定する。短すぎると常時警告が出て誰も読まなくなり、長すぎると停止に
|
|
1167
|
+
* 気付けない。
|
|
1168
|
+
*/
|
|
1169
|
+
stalenessThresholdSec: number;
|
|
1170
|
+
/** False when directory integration is not wired for this deployment. 未結線なら false。 */
|
|
1171
|
+
isEnabled: boolean;
|
|
1172
|
+
};
|
|
1173
|
+
/** One external link row as the admin surface sees it. 管理面が見る外部リンク行。 */
|
|
1174
|
+
type DirectoryLinkRow = AuthGroupExternalLink & {
|
|
1175
|
+
linkId: number;
|
|
1176
|
+
groupId: number;
|
|
1177
|
+
tenantId: string;
|
|
1178
|
+
};
|
|
1179
|
+
/** Input for creating a link. リンク作成の入力。 */
|
|
1180
|
+
type LinkGroupInput = {
|
|
1181
|
+
provider: string;
|
|
1182
|
+
externalId: string;
|
|
1183
|
+
externalKey: string;
|
|
1184
|
+
membershipMode: AuthDirectoryMembershipMode;
|
|
1185
|
+
};
|
|
1186
|
+
/**
|
|
1187
|
+
* Creates the identity-side data store.
|
|
1188
|
+
* identity 側のデータストアを生成する処理。
|
|
1189
|
+
*
|
|
1190
|
+
* @param dbUnknown Drizzle database instance. drizzle のデータベースインスタンス。
|
|
1191
|
+
* @param tables Identity-side tables. identity 側テーブル群。
|
|
1192
|
+
* @param authzTables Authorization tables (for the group master and the real membership).
|
|
1193
|
+
* 認可テーブル群 (グループマスタと実所属表のため)。
|
|
1194
|
+
* @param opts Store options. ストアの構成。
|
|
1195
|
+
* @returns The store. ストア。
|
|
1196
|
+
*/
|
|
1197
|
+
declare function createDirectoryLinkStore(dbUnknown: unknown, tables: AuthDirectoryTables, authzTables: AuthzTables, opts: DirectoryLinkStoreOptions): {
|
|
1198
|
+
/**
|
|
1199
|
+
* Lists every external link of the tenant. 当該テナントの外部リンクを列挙する処理。
|
|
1200
|
+
*
|
|
1201
|
+
* @param tenantId Tenant to narrow on. 絞り込むテナント。
|
|
1202
|
+
*/
|
|
1203
|
+
listLinks(tenantId: string): Promise<DirectoryLinkRow[]>;
|
|
1204
|
+
/**
|
|
1205
|
+
* Returns the upstream key of the group, or `null` when it is locally managed.
|
|
1206
|
+
* そのグループの上流キーを返す処理。ローカル管理なら `null`。
|
|
1207
|
+
*
|
|
1208
|
+
* `withExternalGroupGuards` の判定材料であり、同時に拒否メッセージの表示名でもある。
|
|
1209
|
+
* 判定と名前を 1 回の照会で返すことで、拒否のたびの往復を 1 本に保つ。
|
|
1210
|
+
*/
|
|
1211
|
+
externalGroupKey(tenantId: string, groupId: number): Promise<string | null>;
|
|
1212
|
+
/**
|
|
1213
|
+
* Links a local group to an upstream group. ローカルグループを上流グループへ結び付ける処理。
|
|
1214
|
+
*
|
|
1215
|
+
* 既に管理ロールを持つグループは {@link LinkableAssertion} が拒否する。
|
|
1216
|
+
*
|
|
1217
|
+
* @throws {Error} When the group belongs to another tenant. 他テナントのグループの場合。
|
|
1218
|
+
*/
|
|
1219
|
+
linkGroup(tenantId: string, groupId: number, input: LinkGroupInput, actor: string): Promise<void>;
|
|
1220
|
+
/**
|
|
1221
|
+
* Removes the link, leaving the projected membership in place.
|
|
1222
|
+
* リンクを解除する処理。射影済みの所属はそのまま残す。
|
|
1223
|
+
*
|
|
1224
|
+
* 所属まで消すと、連携を切っただけで全員がグループから外れる (= 大量剥奪) 。解除は
|
|
1225
|
+
* 「上流の言うことを聞くのをやめる」であって「今の所属を捨てる」ではない。台帳と、
|
|
1226
|
+
* 台帳を通してしか効かないグループ許可は、残しても意味を持たないため削除する。
|
|
1227
|
+
*/
|
|
1228
|
+
unlinkGroup(tenantId: string, groupId: number): Promise<void>;
|
|
1229
|
+
/** Pauses or resumes synchronization for one group. 1 グループの同期を停止・再開する処理。 */
|
|
1230
|
+
setSyncEnabled(tenantId: string, groupId: number, isSyncEnabled: boolean, actor: string): Promise<void>;
|
|
1231
|
+
/**
|
|
1232
|
+
* Queues a synchronization request. 同期要求をキューへ積む処理。
|
|
1233
|
+
*
|
|
1234
|
+
* web プロセスは上流へ到達できないため、要求を行として残し同期ジョブに拾わせる。
|
|
1235
|
+
* 誰がいつ何を要求し、結果がどうだったかがそのまま監査記録になる。
|
|
1236
|
+
*
|
|
1237
|
+
* @param groupId `null` requests every group of the tenant. `null` はテナント全件。
|
|
1238
|
+
*/
|
|
1239
|
+
requestSync(tenantId: string, groupId: number | null, requestedBy: string): Promise<void>;
|
|
1240
|
+
/**
|
|
1241
|
+
* Summarizes synchronization health for the admin header.
|
|
1242
|
+
* 管理ヘッダー向けに同期の健全性を要約する処理。
|
|
1243
|
+
*
|
|
1244
|
+
* 一度も成功していない場合も陳腐化として報告する。「不明」を健全側へ倒さない —
|
|
1245
|
+
* 判定できないことは、健全であることの証明ではない。
|
|
1246
|
+
*/
|
|
1247
|
+
getStatus(tenantId: string): Promise<AuthDirectoryStatus>;
|
|
1248
|
+
/**
|
|
1249
|
+
* Builds the tenant's membership policy, proving every break-glass group is local.
|
|
1250
|
+
* テナントの帰属方針を組み立てる処理。break-glass がローカル管理であることも証明する。
|
|
1251
|
+
*
|
|
1252
|
+
* 「証明を要求するか」を行数から推測しない。宣言が 1 行も無ければ `no-proof-required`
|
|
1253
|
+
* という **方針** を返し、宣言があれば `require-proof` を返す。区別を型の上に残すことで、
|
|
1254
|
+
* 「宣言し忘れ」や「障害で 0 件が返った」が「証明不要」に化ける経路を塞ぐ。
|
|
1255
|
+
*
|
|
1256
|
+
* @throws {Error} When a break-glass group is externally sourced. 上流所有だった場合。
|
|
1257
|
+
* @throws {TypeError} When the resulting policy is unsatisfiable. 成立しない方針の場合。
|
|
1258
|
+
*/
|
|
1259
|
+
loadTenantMembershipPolicy(tenantId: string): Promise<TenantMembershipPolicy>;
|
|
1260
|
+
/**
|
|
1261
|
+
* Declares a group as proof of tenant membership. グループをテナント帰属の証明に指定する処理。
|
|
1262
|
+
*
|
|
1263
|
+
* この表に 1 行でも入った瞬間、そのテナントの帰属証明は「証明必須」へ切り替わる。行が
|
|
1264
|
+
* 無い状態は「証明不要」であり、書き込み手段が無ければ機能そのものが到達不能になる。
|
|
1265
|
+
*
|
|
1266
|
+
* `isBreakGlass` は「同期が決して触れない復帰経路」を意味する。上流の事故はすべての
|
|
1267
|
+
* 連携グループを同時に壊すため、そこにこそ外部供給でない経路が要る。
|
|
1268
|
+
*
|
|
1269
|
+
* @param tenantId - Owning tenant. 所有テナント。
|
|
1270
|
+
* @param groupId - Group to declare. 指定するグループ。
|
|
1271
|
+
* @param isBreakGlass - True for the locally-managed recovery path. 復帰経路なら true。
|
|
1272
|
+
* @param actor - Who performed it. 実行者。
|
|
1273
|
+
* @returns Nothing. 戻り値なし。
|
|
1274
|
+
* @throws {Error} When the group is not in the tenant, or a break-glass group is linked.
|
|
1275
|
+
* 自テナントに無い場合、または break-glass に連携済みグループを指定した場合。
|
|
1276
|
+
*/
|
|
1277
|
+
setTenantMembershipGroup(tenantId: string, groupId: number, isBreakGlass: boolean, actor: string): Promise<void>;
|
|
1278
|
+
/**
|
|
1279
|
+
* Withdraws a group from the tenant membership proof.
|
|
1280
|
+
* グループをテナント帰属の証明から外す処理。
|
|
1281
|
+
*
|
|
1282
|
+
* 最後の break-glass 行を外すと、以降の証明は上流だけに依存する。上流の事故で全員が
|
|
1283
|
+
* 締め出される状態になるため、読み取り側の検証 (`assertTenantMembershipPolicy`) が
|
|
1284
|
+
* 成立しない方針を拒否する — ここで先に断る。
|
|
1285
|
+
*
|
|
1286
|
+
* @param tenantId - Owning tenant. 所有テナント。
|
|
1287
|
+
* @param groupId - Group to withdraw. 外すグループ。
|
|
1288
|
+
* @returns Nothing. 戻り値なし。
|
|
1289
|
+
* @throws {Error} When it is the last break-glass group of a non-empty policy.
|
|
1290
|
+
* 証明が残るのに最後の break-glass を外そうとした場合。
|
|
1291
|
+
*/
|
|
1292
|
+
removeTenantMembershipGroup(tenantId: string, groupId: number): Promise<void>;
|
|
1293
|
+
/**
|
|
1294
|
+
* Reactivates a group that was deactivated after vanishing upstream.
|
|
1295
|
+
* 上流消滅で無効化されたグループを再有効化する処理。
|
|
1296
|
+
*
|
|
1297
|
+
* 同期は成功時に自動で再有効化するが、運用者が先に直したい場合の入口も要る。無効化を
|
|
1298
|
+
* 一方通行の扉にしないための、もう 1 本の出口である。
|
|
1299
|
+
*/
|
|
1300
|
+
setGroupActive(tenantId: string, groupId: number, isActive: boolean, actor: string): Promise<void>;
|
|
1301
|
+
/**
|
|
1302
|
+
* Reports the groups the identity matches in the upstream ledger.
|
|
1303
|
+
* 上流台帳で identity が一致するグループを報告する処理。
|
|
1304
|
+
*
|
|
1305
|
+
* ⚠️ 実所属表ではなく **台帳** を見ること。初回ログインでユーザー行が生まれた直後、
|
|
1306
|
+
* まだ射影されていない瞬間に、正規の利用者が「非メンバー」として全拒否されるのを防ぐ。
|
|
1307
|
+
*/
|
|
1308
|
+
listLedgerGroupIds(tenantId: string, identity: {
|
|
1309
|
+
externalUserId: string | null;
|
|
1310
|
+
email: string | null | undefined;
|
|
1311
|
+
}): Promise<number[]>;
|
|
1312
|
+
/**
|
|
1313
|
+
* Reports whether an address may sign in through a group allowlist entry.
|
|
1314
|
+
* グループ許可によってそのアドレスがサインインできるかを判定する処理。
|
|
1315
|
+
*
|
|
1316
|
+
* ⚠️ **テナント述語を持たない。意図的である。** 認証はテナントの確定より前に起きるため、
|
|
1317
|
+
* 判定の時点でテナントは存在しない。この配備が受け持つ全テナントの和集合で判定する。
|
|
1318
|
+
* ここに述語を足すと初回ログインが全滅する。
|
|
1319
|
+
*
|
|
1320
|
+
* 判定は実所属ではなく **台帳** を見る。初回ログインの時点では、そもそもユーザー行が
|
|
1321
|
+
* まだ存在しない。
|
|
1322
|
+
*/
|
|
1323
|
+
isEmailAllowedByGroup(email: string | null | undefined): Promise<boolean>;
|
|
1324
|
+
/**
|
|
1325
|
+
* Lists group-based allowlist entries of the tenant. テナントのグループ許可を列挙する処理。
|
|
1326
|
+
*
|
|
1327
|
+
* `auth-core` の判別共用体をそのまま返す。別形で返すと、`type` と `readOnly` を消費側が
|
|
1328
|
+
* 付け直すことになり、「未設定 = 編集可」という暗黙の既定が呼び出し地点ごとに復活する。
|
|
1329
|
+
*/
|
|
1330
|
+
listAllowlistGroups(tenantId: string): Promise<AuthAllowlistEntry[]>;
|
|
1331
|
+
/** Adds a group-based allowlist entry. グループ許可を追加する処理。 */
|
|
1332
|
+
addAllowlistGroup(tenantId: string, groupId: number, description: string | undefined, actor: string): Promise<void>;
|
|
1333
|
+
/** Removes a group-based allowlist entry. グループ許可を削除する処理。 */
|
|
1334
|
+
removeAllowlistGroup(tenantId: string, id: number): Promise<void>;
|
|
1335
|
+
/**
|
|
1336
|
+
* Reports the number of real membership rows the tenant's linked groups hold.
|
|
1337
|
+
* テナントの連携グループが持つ実所属行の件数を報告する処理。
|
|
1338
|
+
*
|
|
1339
|
+
* 連携を切る前に「何人分の所属が残るのか」を運用者へ示すために使う。
|
|
1340
|
+
*/
|
|
1341
|
+
countProjectedMembers(tenantId: string, groupId: number): Promise<number>;
|
|
1342
|
+
};
|
|
1343
|
+
|
|
1344
|
+
/**
|
|
1345
|
+
* @module membership-mode
|
|
1346
|
+
* @description The single reader of the `membership_mode` column.
|
|
1347
|
+
* `membership_mode` 列を読む唯一の入口。
|
|
1348
|
+
*
|
|
1349
|
+
* 以前は読み手が 2 つあり、片方は未知の値を `TypeError` で拒否し、もう片方は黙って `"direct"` へ
|
|
1350
|
+
* 倒していた。同じ列に相反する 2 つの方針が同居し、しかも倒すほうが削除を決める側だった。
|
|
1351
|
+
* 入れ子展開のつもりのリンクが直接所属だけを返せば、入れ子側の全員が削除候補になる。
|
|
1352
|
+
*/
|
|
1353
|
+
|
|
1354
|
+
/** The two modes, in one place. 2 つのモードの唯一の定義位置。 */
|
|
1355
|
+
declare const MEMBERSHIP_MODES: readonly AuthDirectoryMembershipMode[];
|
|
1356
|
+
/**
|
|
1357
|
+
* Rejects a membership mode that is not one of the two known values.
|
|
1358
|
+
* 既知の 2 値でない所属展開モードを拒否する処理。
|
|
1359
|
+
*
|
|
1360
|
+
* 既定へ倒さないのは、入れ子展開が黙って有効になると権限が静かに広がり、逆に黙って無効になると
|
|
1361
|
+
* 入れ子側の全員が削除候補になるためである。どちらの向きにも倒さない。
|
|
1362
|
+
*
|
|
1363
|
+
* @param value Raw column value. 列の生値。
|
|
1364
|
+
* @returns The validated mode. 検証済みのモード。
|
|
1365
|
+
* @throws {TypeError} When the value is unknown. 未知の値の場合。
|
|
1366
|
+
*/
|
|
1367
|
+
declare function assertMembershipMode(value: string): AuthDirectoryMembershipMode;
|
|
1368
|
+
|
|
1369
|
+
/** Storage operations promotion performs. 昇格が行う記憶域操作。 */
|
|
1370
|
+
type PromotionRepository = {
|
|
1371
|
+
/**
|
|
1372
|
+
* Finds ledger rows matching the identity, across every linked group of the tenant.
|
|
1373
|
+
* テナントの全連携グループを対象に、identity と一致する台帳行を探す処理。
|
|
1374
|
+
*
|
|
1375
|
+
* 突合順は上流 ID が第一キー、アドレスが第二キー。
|
|
1376
|
+
*
|
|
1377
|
+
* ⚠️ 各行が属するテナントも返すこと。`TDGroupMemberEmail` はテナント列を持たず親から継承する
|
|
1378
|
+
* ため、台帳だけで絞った実装は静かにテナントを跨ぐ。呼び出し側はこの値で再検証する。
|
|
1379
|
+
*/
|
|
1380
|
+
findLedgerMatches(args: {
|
|
1381
|
+
tenantId: string;
|
|
1382
|
+
externalUserId: string | null;
|
|
1383
|
+
email: string;
|
|
1384
|
+
}): Promise<Array<{
|
|
1385
|
+
ledgerId: number;
|
|
1386
|
+
groupId: number;
|
|
1387
|
+
tenantId: string;
|
|
1388
|
+
}>>;
|
|
1389
|
+
/**
|
|
1390
|
+
* Records the resolution and inserts the missing membership rows, atomically.
|
|
1391
|
+
* 解決結果の記録と不足している所属行の挿入を、原子的に行う処理。
|
|
1392
|
+
*
|
|
1393
|
+
* @returns Group ids the user was actually added to. 実際に追加されたグループ ID。
|
|
1394
|
+
*/
|
|
1395
|
+
attachUserToGroups(args: {
|
|
1396
|
+
tenantId: string;
|
|
1397
|
+
userId: number;
|
|
1398
|
+
ledgerIds: number[];
|
|
1399
|
+
groupIds: number[];
|
|
1400
|
+
}): Promise<number[]>;
|
|
1401
|
+
};
|
|
1402
|
+
/** What the promotion did. 昇格が行ったこと。 */
|
|
1403
|
+
type PromotionResult = {
|
|
1404
|
+
/** Groups the user gained membership of. 所属を得たグループ。 */
|
|
1405
|
+
addedGroupIds: number[];
|
|
1406
|
+
/** Ledger rows the user was matched against. 突合した台帳行。 */
|
|
1407
|
+
matchedLedgerIds: number[];
|
|
1408
|
+
};
|
|
1409
|
+
/**
|
|
1410
|
+
* Promotes ledger rows to real memberships for one just-provisioned user.
|
|
1411
|
+
* プロビジョニング直後の 1 ユーザーについて、台帳の行を実所属へ昇格させる処理。
|
|
1412
|
+
*
|
|
1413
|
+
* 追加しか行わないため、最後の管理者ロックアウト判定は不要である (所属が増えて管理者が
|
|
1414
|
+
* 減ることはない)。それでも記憶域側では 1 トランザクションで書くこと — 台帳の解決記録だけが
|
|
1415
|
+
* 残って所属が入らないと、次回の同期まで「解決済みなのに権限が無い」状態が続く。
|
|
1416
|
+
*
|
|
1417
|
+
* @param repository Storage operations. 記憶域操作。
|
|
1418
|
+
* @param args Tenant, the resolved user, and the identity to match on. テナント・ユーザー・identity。
|
|
1419
|
+
* @returns What was promoted. 昇格した内容。
|
|
1420
|
+
* @throws {AuthzTenantError} When the tenant id is blank, or a matched row belongs to another
|
|
1421
|
+
* tenant. テナント ID が空、または一致行が別テナントに属する場合。
|
|
1422
|
+
* @throws {TypeError} When the user id is not a positive integer. ユーザー ID が正整数でない場合。
|
|
1423
|
+
*/
|
|
1424
|
+
declare function promoteLedgerForUser(repository: PromotionRepository, args: {
|
|
1425
|
+
tenantId: string;
|
|
1426
|
+
userId: number;
|
|
1427
|
+
externalUserId: string | null;
|
|
1428
|
+
email: string | null | undefined;
|
|
1429
|
+
}): Promise<PromotionResult>;
|
|
1430
|
+
|
|
1431
|
+
/** Options for {@link createPromotionRepository}. 昇格リポジトリの生成オプション。 */
|
|
1432
|
+
type PromotionRepositoryOptions = {
|
|
1433
|
+
/** Establishes the connection before the first statement. 最初の文の前に接続を確立する処理。 */
|
|
1434
|
+
ensureConnection?: EnsureConnection;
|
|
1435
|
+
/** Written to the audit columns of inserted membership rows. 挿入行の監査列に書く実行者。 */
|
|
1436
|
+
actor: string;
|
|
1437
|
+
/** Injected clock — tests must not depend on wall time. 注入時計 (実時刻に依存させない)。 */
|
|
1438
|
+
now?: () => Date;
|
|
1439
|
+
};
|
|
1440
|
+
declare function createPromotionRepository(dbUnknown: unknown, tables: AuthDirectoryTables, authzTables: AuthzTables, opts: PromotionRepositoryOptions): PromotionRepository;
|
|
1441
|
+
|
|
1442
|
+
/**
|
|
1443
|
+
* SQL Server parameter-limit helpers shared by every batched statement.
|
|
1444
|
+
* 一括文が共有する SQL Server のパラメータ上限まわりのヘルパー。
|
|
1445
|
+
*
|
|
1446
|
+
* ⚠️ 上限は **行数ではなくパラメータ数** である。1 行あたり何個の値を束ねるかは文ごとに違うので、
|
|
1447
|
+
* 行数だけで分割すると、列の多い `VALUES` が静かに上限を越える。しかも越えるのは件数が閾値を
|
|
1448
|
+
* 跨いだ日だけで、それまでは同じコードが問題なく動いて見える。
|
|
1449
|
+
*/
|
|
1450
|
+
/**
|
|
1451
|
+
* Hard limit of parameters per statement. 1 文あたりのパラメータ数の上限。
|
|
1452
|
+
*
|
|
1453
|
+
* SQL Server の RPC 1 回あたりのパラメータ上限は 2100。数個は文自身の値 (`SET` 句・スカラー
|
|
1454
|
+
* 述語) が使うため、分割の基準にはここから余裕を引いた値を用いる。
|
|
1455
|
+
*/
|
|
1456
|
+
declare const MAX_PARAMETERS = 2100;
|
|
1457
|
+
/**
|
|
1458
|
+
* Maximum ids per `IN` list of single-column predicates. 単列述語の `IN` 句 1 回あたりの最大 ID 数。
|
|
1459
|
+
*
|
|
1460
|
+
* 1 行 1 パラメータの用途 (`inArray(col, ids)`) 専用の既定値である。複数列を束ねる `VALUES` や、
|
|
1461
|
+
* 1 文に `IN` を 2 つ描画する `UPDATE` にそのまま使ってはならない — {@link chunkByParameters} を使う。
|
|
1462
|
+
*/
|
|
1463
|
+
declare const MAX_IN_LIST = 500;
|
|
1464
|
+
/**
|
|
1465
|
+
* Splits a list into chunks that fit one statement.
|
|
1466
|
+
* 1 文に収まる大きさへリストを分割する処理。
|
|
1467
|
+
*
|
|
1468
|
+
* @param items - Items to split. 分割対象。
|
|
1469
|
+
* @param size - Maximum chunk size. 1 チャンクの最大数。
|
|
1470
|
+
* @returns Chunks in the original order. 元の順序を保ったチャンク列。
|
|
1471
|
+
* @throws {TypeError} When the size is not a positive integer. 正の整数でない場合。
|
|
1472
|
+
*/
|
|
1473
|
+
declare function chunk<T>(items: readonly T[], size?: number): T[][];
|
|
1474
|
+
/**
|
|
1475
|
+
* Splits a list so each chunk fits the parameter budget of one statement.
|
|
1476
|
+
* 各チャンクが 1 文のパラメータ枠に収まるようリストを分割する処理。
|
|
1477
|
+
*
|
|
1478
|
+
* `VALUES` は 1 行につき列数ぶんのパラメータを束ねる。7 列の台帳行なら 500 行で 3500 個になり、
|
|
1479
|
+
* 上限 2100 を越えて **実行される前に** 拒否される。しかもその失敗は再試行しても同じ場所で起き、
|
|
1480
|
+
* そのグループは永久に台帳を持てない。
|
|
1481
|
+
*
|
|
1482
|
+
* @param items - Items to split. 分割対象。
|
|
1483
|
+
* @param parametersPerItem - Parameters each item binds. 1 件が束ねるパラメータ数。
|
|
1484
|
+
* @param reservedParameters - Parameters the statement itself binds. 文自身が束ねる数。
|
|
1485
|
+
* @returns Chunks in the original order. 元の順序を保ったチャンク列。
|
|
1486
|
+
* @throws {TypeError} When a single item cannot fit the budget. 1 件すら収まらない場合。
|
|
1487
|
+
*/
|
|
1488
|
+
declare function chunkByParameters<T>(items: readonly T[], parametersPerItem: number, reservedParameters?: number): T[][];
|
|
1489
|
+
|
|
1490
|
+
/**
|
|
1491
|
+
* @module sync-messages
|
|
1492
|
+
* @description Operator-facing text the synchronization records against a link.
|
|
1493
|
+
* 同期がリンクへ記録する、運用者向けの文言。
|
|
1494
|
+
*
|
|
1495
|
+
* 文言を注入可能にしてあるのは、`sync_error` が管理 UI にそのまま出るためである。ホスト非依存を
|
|
1496
|
+
* 求められるパッケージへ日本語を焼き込むと、日本語以外の配備がデータベースに日本語を持つことになる。
|
|
1497
|
+
* 既定は日本語 (このリポジトリの管理 UI に合わせる)。
|
|
1498
|
+
*/
|
|
1499
|
+
|
|
1500
|
+
/** The messages one synchronization can produce. 同期が生成し得る文言。 */
|
|
1501
|
+
type SyncMessages = {
|
|
1502
|
+
/** The upstream could not be read at all. 上流をまったく読めなかった。 */
|
|
1503
|
+
upstreamUnreadable: (reason: string) => string;
|
|
1504
|
+
/** The local write failed. ローカルへの書込が失敗した。 */
|
|
1505
|
+
localWriteFailed: (reason: string) => string;
|
|
1506
|
+
/** The resolver returned fewer members than the upstream listed. 突合が件数を減らした。 */
|
|
1507
|
+
resolverIncomplete: (upstream: number, resolved: number) => string;
|
|
1508
|
+
/** The group is missing upstream but not yet deactivated. 消滅の観測 (未確定)。 */
|
|
1509
|
+
groupMissing: (externalKey: string, observations: number, threshold: number) => string;
|
|
1510
|
+
/** The group has been deactivated after repeated absence. 消滅確定・無効化。 */
|
|
1511
|
+
groupVanished: (externalKey: string, observations: number) => string;
|
|
1512
|
+
/** The reconciler refused the plan. 突合が plan を拒否した。 */
|
|
1513
|
+
planRefused: (abort: SyncAbort) => string;
|
|
1514
|
+
/** The lockout guard refused some removals. ロックアウトガードが一部の削除を拒否した。 */
|
|
1515
|
+
removalsRefused: (refusals: readonly {
|
|
1516
|
+
userId: number;
|
|
1517
|
+
refusal?: string;
|
|
1518
|
+
}[]) => string;
|
|
1519
|
+
/** The link belongs to a different provider. 他 provider のリンクだった。 */
|
|
1520
|
+
foreignProvider: (linkProvider: string, runnerProvider: string) => string;
|
|
1521
|
+
};
|
|
1522
|
+
/** Default Japanese messages. 既定の日本語文言。 */
|
|
1523
|
+
declare const defaultSyncMessages: SyncMessages;
|
|
1524
|
+
|
|
1525
|
+
/**
|
|
1526
|
+
* @module sync-ports
|
|
1527
|
+
* @description The narrow storage surface the synchronization orchestration depends on.
|
|
1528
|
+
* 同期オーケストレーションが依存する、狭い記憶域の面。
|
|
1529
|
+
*
|
|
1530
|
+
* オーケストレーションを drizzle から切り離すために置いている。同期の手順そのもの
|
|
1531
|
+
* (何を順に行い、どこで打ち切るか) は、データベースを起動せずに全分岐を検証できるべきである —
|
|
1532
|
+
* 検証しにくい手順は検証されず、検証されない手順は「読めなかったら消さない」を静かに破る。
|
|
1533
|
+
*/
|
|
1534
|
+
|
|
1535
|
+
/**
|
|
1536
|
+
* One external group link, as the synchronization needs to see it.
|
|
1537
|
+
* 同期が見る必要のある外部グループリンク 1 件。
|
|
1538
|
+
*/
|
|
1539
|
+
type SyncLink = {
|
|
1540
|
+
linkId: number;
|
|
1541
|
+
groupId: number;
|
|
1542
|
+
groupKey: string;
|
|
1543
|
+
tenantId: string;
|
|
1544
|
+
/** Which upstream owns this group. どの上流がこのグループを所有するか。 */
|
|
1545
|
+
provider: string;
|
|
1546
|
+
externalId: string;
|
|
1547
|
+
externalKey: string;
|
|
1548
|
+
membershipMode: AuthDirectoryMembershipMode$1;
|
|
1549
|
+
/** False when the group has been deactivated. グループが無効化されている場合 false。 */
|
|
1550
|
+
isGroupActive: boolean;
|
|
1551
|
+
/**
|
|
1552
|
+
* How many consecutive runs have found the group missing upstream.
|
|
1553
|
+
* 上流でグループが見つからない状態が何回連続したか。
|
|
1554
|
+
*
|
|
1555
|
+
* 1 度の 404 で無効化すると、伝播待ちや権限変更の一瞬で生きているグループが落ちる。
|
|
1556
|
+
*/
|
|
1557
|
+
vanishedObservations: number;
|
|
1558
|
+
};
|
|
1559
|
+
/** Why one group's synchronization ended the way it did. 1 グループの同期がどう終わったか。 */
|
|
1560
|
+
type SyncOutcome = {
|
|
1561
|
+
kind: "applied";
|
|
1562
|
+
link: SyncLink;
|
|
1563
|
+
plan: GroupSyncPlan;
|
|
1564
|
+
}
|
|
1565
|
+
/** Nothing changed. Not a failure — an idempotent run. 変化なし。失敗ではなく冪等な実行。 */
|
|
1566
|
+
| {
|
|
1567
|
+
kind: "unchanged";
|
|
1568
|
+
link: SyncLink;
|
|
1569
|
+
}
|
|
1570
|
+
/** The plan was refused by the reconciler's own guards. 突合自身のガードが plan を拒否した。 */
|
|
1571
|
+
| {
|
|
1572
|
+
kind: "aborted";
|
|
1573
|
+
link: SyncLink;
|
|
1574
|
+
plan: GroupSyncPlan;
|
|
1575
|
+
}
|
|
1576
|
+
/** The group is missing upstream, but not yet often enough to act on. 消滅の観測 (未確定)。 */
|
|
1577
|
+
| {
|
|
1578
|
+
kind: "missing";
|
|
1579
|
+
link: SyncLink;
|
|
1580
|
+
observations: number;
|
|
1581
|
+
}
|
|
1582
|
+
/** The group has been missing long enough that it was deactivated. 消滅確定・無効化した。 */
|
|
1583
|
+
| {
|
|
1584
|
+
kind: "vanished";
|
|
1585
|
+
link: SyncLink;
|
|
1586
|
+
}
|
|
1587
|
+
/** Reading upstream failed. 上流の読み取りが失敗した。 */
|
|
1588
|
+
| {
|
|
1589
|
+
kind: "upstream-failed";
|
|
1590
|
+
link: SyncLink;
|
|
1591
|
+
error: Error;
|
|
1592
|
+
}
|
|
1593
|
+
/** Writing locally failed. ローカルへの書込が失敗した。 */
|
|
1594
|
+
| {
|
|
1595
|
+
kind: "local-failed";
|
|
1596
|
+
link: SyncLink;
|
|
1597
|
+
error: Error;
|
|
1598
|
+
}
|
|
1599
|
+
/** The link belongs to another provider than the one running. 他 provider のリンクだった。 */
|
|
1600
|
+
| {
|
|
1601
|
+
kind: "foreign-provider";
|
|
1602
|
+
link: SyncLink;
|
|
1603
|
+
};
|
|
1604
|
+
/** Outcomes that mean the group is not in a healthy, converged state. 健全でない結末。 */
|
|
1605
|
+
declare const UNHEALTHY_SYNC_OUTCOMES: readonly SyncOutcome["kind"][];
|
|
1606
|
+
/** What happened to one guarded removal. ガード付き削除 1 件の結末。 */
|
|
1607
|
+
type RemovalOutcome = {
|
|
1608
|
+
userId: number;
|
|
1609
|
+
applied: boolean;
|
|
1610
|
+
refusal?: string;
|
|
1611
|
+
};
|
|
1612
|
+
/** What `applyPlan` actually managed to do. `applyPlan` が実際に行えたこと。 */
|
|
1613
|
+
type ApplyReport = {
|
|
1614
|
+
/** Removals the administrator lockout guard refused. ロックアウトガードが拒否した削除。 */
|
|
1615
|
+
refusals: RemovalOutcome[];
|
|
1616
|
+
};
|
|
1617
|
+
/**
|
|
1618
|
+
* Storage operations the synchronization performs.
|
|
1619
|
+
* 同期が行う記憶域操作。
|
|
1620
|
+
*/
|
|
1621
|
+
type DirectorySyncRepository = {
|
|
1622
|
+
/**
|
|
1623
|
+
* Lists links that are eligible to run. 実行対象のリンクを列挙する処理。
|
|
1624
|
+
*
|
|
1625
|
+
* ⚠️ 無効化されたグループのリンクも返すこと。返さないと、上流が復旧しても二度と同期されず、
|
|
1626
|
+
* 再有効化の機会が永久に失われる。
|
|
1627
|
+
*
|
|
1628
|
+
* @param scope Restrict to one tenant, or one group within it. テナント、または特定グループへ限定。
|
|
1629
|
+
*/
|
|
1630
|
+
listSyncableLinks(scope: {
|
|
1631
|
+
tenantId?: string;
|
|
1632
|
+
groupId?: number;
|
|
1633
|
+
}): Promise<SyncLink[]>;
|
|
1634
|
+
/** Reads the local ledger and the real membership for one group. 台帳と実所属を読む処理。 */
|
|
1635
|
+
loadGroupSnapshot(link: SyncLink): Promise<LocalGroupSnapshot>;
|
|
1636
|
+
/**
|
|
1637
|
+
* Resolves upstream members against the local user table.
|
|
1638
|
+
* 上流メンバーをローカルユーザー表へ突合する処理。
|
|
1639
|
+
*
|
|
1640
|
+
* 突合順は上流 ID が第一キー、アドレスが第二キー。再利用されたアドレスが他人の所属を
|
|
1641
|
+
* 継承する事故を防ぐため、この順序は実装側の裁量ではなく契約である。
|
|
1642
|
+
*
|
|
1643
|
+
* ⚠️ **入力と同じ件数を返すこと。** 解決できないメンバーは省略せず `resolvedUserId: null` で
|
|
1644
|
+
* 返す。省略すると、その人物は「上流から消えた」と解釈されて削除対象になる。
|
|
1645
|
+
*/
|
|
1646
|
+
resolveMembers(members: readonly DirectoryMember[]): Promise<ResolvedDirectoryMember[]>;
|
|
1647
|
+
/**
|
|
1648
|
+
* Applies one group's plan, taking every membership removal through the lockout guard.
|
|
1649
|
+
* 1 グループ分の plan を適用する処理。実所属の削除は必ず最後の管理者ガードを通す。
|
|
1650
|
+
*
|
|
1651
|
+
* ⚠️ ロックアウトガードが 1 件の削除を拒否しても、**残りの削除を続けること**。1 件で打ち切ると、
|
|
1652
|
+
* 拒否された行がグループ全体の収束を永久に止める (次回以降も同じ行で止まる)。拒否は
|
|
1653
|
+
* {@link ApplyReport.refusals} で報告する。
|
|
1654
|
+
*
|
|
1655
|
+
* @returns What was refused. 拒否された内容。
|
|
1656
|
+
* @throws When the write itself failed. 書込そのものが失敗した場合。
|
|
1657
|
+
*/
|
|
1658
|
+
applyPlan(link: SyncLink, plan: GroupSyncPlan, observedAt: Date): Promise<ApplyReport>;
|
|
1659
|
+
/** Records a successful run and reactivates the group if it was deactivated. 成功の記録。 */
|
|
1660
|
+
recordSuccess(link: SyncLink, group: DirectoryGroup, syncedAt: Date): Promise<void>;
|
|
1661
|
+
/** Records a failure reason against the link, leaving membership untouched. 失敗を記録する処理。 */
|
|
1662
|
+
recordFailure(link: SyncLink, reason: string): Promise<void>;
|
|
1663
|
+
/**
|
|
1664
|
+
* Records one observation that the group is missing upstream. 上流での消滅を 1 回観測した記録。
|
|
1665
|
+
*
|
|
1666
|
+
* @returns How many consecutive observations there now are. 連続観測回数。
|
|
1667
|
+
*/
|
|
1668
|
+
recordVanishedObservation(link: SyncLink, reason: string): Promise<number>;
|
|
1669
|
+
/** Marks a group inactive after it has been missing long enough. 消滅確定後の無効化。 */
|
|
1670
|
+
markGroupInactive(link: SyncLink): Promise<void>;
|
|
1671
|
+
};
|
|
1672
|
+
/** Minimal logging surface. 最小のログ面。 */
|
|
1673
|
+
type SyncLoggerPort = {
|
|
1674
|
+
info(message: string, ...args: unknown[]): void;
|
|
1675
|
+
warn(message: string, ...args: unknown[]): void;
|
|
1676
|
+
error(message: string, ...args: unknown[]): void;
|
|
1677
|
+
};
|
|
1678
|
+
|
|
1679
|
+
/**
|
|
1680
|
+
* @module sync
|
|
1681
|
+
* @description Orchestration of one synchronization run: read upstream, reconcile, apply — and
|
|
1682
|
+
* stop at the first sign that "upstream said nothing" might mean "we could not read upstream".
|
|
1683
|
+
* 1 回の同期実行のオーケストレーション。上流を読み、突合し、適用する。そして「上流が何も
|
|
1684
|
+
* 言わなかった」が「上流を読めなかった」かもしれない兆候が出た時点で止める。
|
|
1685
|
+
*
|
|
1686
|
+
* 記憶域は {@link DirectorySyncRepository} 越しにしか触らないため、手順そのものは
|
|
1687
|
+
* データベースを起動せずに全分岐を検証できる。
|
|
1688
|
+
*/
|
|
1689
|
+
|
|
1690
|
+
/** Configuration of a synchronization runner. 同期ランナーの構成。 */
|
|
1691
|
+
type DirectorySyncConfig = {
|
|
1692
|
+
/**
|
|
1693
|
+
* Which upstream this runner speaks for. このランナーが担当する上流。
|
|
1694
|
+
*
|
|
1695
|
+
* リンク行の `provider` と照合する。照合しないと、別 provider のリンクを受け取った
|
|
1696
|
+
* ランナーがそれを「上流に存在しない」と判定し、他 provider のグループを無効化してしまう。
|
|
1697
|
+
*/
|
|
1698
|
+
provider: string;
|
|
1699
|
+
directory: DirectoryProvider;
|
|
1700
|
+
repository: DirectorySyncRepository;
|
|
1701
|
+
/** Per-axis removal limits. See `auth-directory-core`. 軸ごとの削除上限。 */
|
|
1702
|
+
policy: BlastRadiusPolicy;
|
|
1703
|
+
/**
|
|
1704
|
+
* Consecutive absences required before a group is deactivated. 無効化に要する連続不在回数。
|
|
1705
|
+
*
|
|
1706
|
+
* 1 度の 404 で無効化すると、伝播待ちや権限変更の一瞬で生きているグループが落ちる。
|
|
1707
|
+
*/
|
|
1708
|
+
vanishedThreshold: number;
|
|
1709
|
+
/**
|
|
1710
|
+
* Supplies the current time. 現在時刻を供給する処理。
|
|
1711
|
+
*
|
|
1712
|
+
* 注入するのは決定性のためだけではない。1 回の実行の中で「観測時刻」と「同期時刻」が
|
|
1713
|
+
* 別々に進むと、どの行がどの実行で書かれたのかを後から辿れなくなる。
|
|
1714
|
+
*/
|
|
1715
|
+
now: () => Date;
|
|
1716
|
+
logger: SyncLoggerPort;
|
|
1717
|
+
/** Operator-facing text. 運用者向けの文言。 */
|
|
1718
|
+
messages?: SyncMessages;
|
|
1719
|
+
};
|
|
1720
|
+
/** Result of one run over a set of links. リンク集合 1 巡分の結果。 */
|
|
1721
|
+
type DirectorySyncRunResult = {
|
|
1722
|
+
outcomes: SyncOutcome[];
|
|
1723
|
+
/**
|
|
1724
|
+
* Links that did not end in a healthy, converged state. 健全に収束しなかったリンク数。
|
|
1725
|
+
*
|
|
1726
|
+
* 消滅の観測と無効化も含める。グループが恒久的に同期対象から外れることは、実行の中で
|
|
1727
|
+
* 最も重い結末であり、それを「0 unhealthy」と報告しては監視の意味がない。
|
|
1728
|
+
*/
|
|
1729
|
+
unhealthyCount: number;
|
|
1730
|
+
};
|
|
1731
|
+
/**
|
|
1732
|
+
* Creates a synchronization runner. 同期ランナーを生成する処理。
|
|
1733
|
+
*
|
|
1734
|
+
* @param config Injected provider, repository, limits, clock and logger. 注入する構成。
|
|
1735
|
+
* @returns The runner. ランナー。
|
|
1736
|
+
* @throws {TypeError} When the policy or the threshold is invalid. 方針・しきい値が不正な場合。
|
|
1737
|
+
*/
|
|
1738
|
+
declare function createDirectorySync(config: DirectorySyncConfig): {
|
|
1739
|
+
syncOne: (link: SyncLink) => Promise<SyncOutcome>;
|
|
1740
|
+
/**
|
|
1741
|
+
* Synchronizes every eligible link in scope. 対象範囲の全リンクを同期する処理。
|
|
1742
|
+
*
|
|
1743
|
+
* リンクは **逐次** 処理する。並列化すると上流のレート制限を一気に消費し、最初に
|
|
1744
|
+
* 弾かれたグループだけが失敗して部分的に古い状態が残る。1 グループの失敗は他へ
|
|
1745
|
+
* 波及させず、実行自体は最後まで続ける。
|
|
1746
|
+
*
|
|
1747
|
+
* @param scope Restrict to one tenant, or one group within it. 対象範囲。
|
|
1748
|
+
* @returns Every outcome, and how many ended unhealthy. 全結果と不健全件数。
|
|
1749
|
+
*/
|
|
1750
|
+
run(scope?: {
|
|
1751
|
+
tenantId?: string;
|
|
1752
|
+
groupId?: number;
|
|
1753
|
+
}): Promise<DirectorySyncRunResult>;
|
|
1754
|
+
};
|
|
1755
|
+
|
|
1756
|
+
/** One claimed request. 取得済みの要求 1 件。 */
|
|
1757
|
+
type ClaimedSyncRequest = {
|
|
1758
|
+
id: number;
|
|
1759
|
+
tenantId: string;
|
|
1760
|
+
/** `null` means every group of the tenant. `null` はテナント全件を意味する。 */
|
|
1761
|
+
groupId: number | null;
|
|
1762
|
+
requestedBy: string;
|
|
1763
|
+
};
|
|
1764
|
+
/** How a claimed request ended. 取得した要求の終わり方。 */
|
|
1765
|
+
type SyncRequestResult = {
|
|
1766
|
+
result: "succeeded" | "failed";
|
|
1767
|
+
error?: string | null;
|
|
1768
|
+
};
|
|
1769
|
+
/** Options for {@link createSyncRequestQueue}. キュー消費側の生成オプション。 */
|
|
1770
|
+
type SyncRequestQueueOptions = {
|
|
1771
|
+
ensureConnection?: EnsureConnection;
|
|
1772
|
+
/** Injected clock — the run's timestamps must all come from one source. 注入時計。 */
|
|
1773
|
+
now: () => Date;
|
|
1774
|
+
/**
|
|
1775
|
+
* Longest an error message may be, matching the column. 列に合わせたエラー文の上限長。
|
|
1776
|
+
*
|
|
1777
|
+
* 超過分は切り捨てる。切り捨てないと、記録そのものが失敗して「何が起きたか分からない
|
|
1778
|
+
* まま要求が取得済みで固まる」という最悪の状態になる。
|
|
1779
|
+
*/
|
|
1780
|
+
maxErrorLength?: number;
|
|
1781
|
+
};
|
|
1782
|
+
/**
|
|
1783
|
+
* Creates the consumer for the synchronization request queue.
|
|
1784
|
+
* 同期要求キューの消費側を生成する処理。
|
|
1785
|
+
*
|
|
1786
|
+
* @param dbUnknown - Drizzle database instance. drizzle のデータベースインスタンス。
|
|
1787
|
+
* @param tables - Directory tables (owns the queue). ディレクトリ表 (キューの所有者)。
|
|
1788
|
+
* @param opts - Connection, clock and truncation bound. 接続・時計・切り詰め上限。
|
|
1789
|
+
* @returns The claim / finish pair. 取得と完了記録の 2 操作。
|
|
1790
|
+
*/
|
|
1791
|
+
declare function createSyncRequestQueue(dbUnknown: unknown, tables: AuthDirectoryTables, opts: SyncRequestQueueOptions): {
|
|
1792
|
+
/**
|
|
1793
|
+
* Claims the oldest unpicked request, marking it picked in the same statement.
|
|
1794
|
+
* 最も古い未取得の要求を、同じ文で取得済みにしながら取り出す処理。
|
|
1795
|
+
*
|
|
1796
|
+
* 取得と印付けを分けると、2 つのジョブが同じ要求を拾って同じグループを二重に同期する。
|
|
1797
|
+
* `UPDATE ... OUTPUT` は 1 文なので、行を掴んだのが誰かは常に 1 つに決まる。
|
|
1798
|
+
*
|
|
1799
|
+
* @returns The claimed request, or `null` when the queue is empty. 取得結果 (空なら `null`)。
|
|
1800
|
+
*/
|
|
1801
|
+
claim(): Promise<ClaimedSyncRequest | null>;
|
|
1802
|
+
/**
|
|
1803
|
+
* Records how a claimed request ended. 取得済みの要求がどう終わったかを記録する処理。
|
|
1804
|
+
*
|
|
1805
|
+
* @param id - The claimed request id. 取得した要求の ID。
|
|
1806
|
+
* @param outcome - Result and optional error text. 結果と (あれば) エラー文。
|
|
1807
|
+
* @returns Nothing. 戻り値なし。
|
|
1808
|
+
*/
|
|
1809
|
+
finish(id: number, outcome: SyncRequestResult): Promise<void>;
|
|
1810
|
+
/**
|
|
1811
|
+
* Lists requests claimed long ago but never finished. 取得後に完了しなかった要求の一覧。
|
|
1812
|
+
*
|
|
1813
|
+
* ジョブが落ちると、行は取得済みのまま完了しない。放置すると要求した人はいつまでも
|
|
1814
|
+
* 結果を見られないので、運用が拾えるよう明示的に数えられる形にしておく。
|
|
1815
|
+
*
|
|
1816
|
+
* @param olderThan - Cutoff for `picked_at`. `picked_at` の締切時刻。
|
|
1817
|
+
* @returns The stranded request ids. 取り残された要求の ID。
|
|
1818
|
+
*/
|
|
1819
|
+
listStranded(olderThan: Date): Promise<number[]>;
|
|
1820
|
+
};
|
|
1821
|
+
|
|
1822
|
+
/**
|
|
1823
|
+
* Resolves upstream members against the host's identity tables.
|
|
1824
|
+
* 上流メンバーをホストの identity 表へ突合するポート。
|
|
1825
|
+
*
|
|
1826
|
+
* ホストごとに identity の持ち方が違う (このリポジトリでは `TDOpenid` → `TDUsers`) ため、
|
|
1827
|
+
* パッケージ側では表を名指しできない。突合順が **上流 ID 第一・アドレス第二** であることは
|
|
1828
|
+
* 実装側の裁量ではなく契約である — 再利用されたアドレスが他人の所属を継承する事故を防ぐ。
|
|
1829
|
+
*
|
|
1830
|
+
* ⚠️ 入力と同じ件数を返すこと。解決できないメンバーを省略すると、その人物は削除対象になる。
|
|
1831
|
+
*/
|
|
1832
|
+
type MemberResolverPort = {
|
|
1833
|
+
resolve(members: readonly DirectoryMember[]): Promise<ResolvedDirectoryMember[]>;
|
|
1834
|
+
};
|
|
1835
|
+
/** Options for the synchronization repository. 同期リポジトリの構成。 */
|
|
1836
|
+
type SyncRepositoryOptions = {
|
|
1837
|
+
ensureConnection?: EnsureConnection;
|
|
1838
|
+
memberResolver: MemberResolverPort;
|
|
1839
|
+
/** Lockout guard from `@aiquants/authz-drizzle`. 認可側のロックアウトガード。 */
|
|
1840
|
+
lockoutGuard: ReturnType<typeof createAdminLockoutGuard>;
|
|
1841
|
+
/**
|
|
1842
|
+
* Actor recorded on rows the synchronization writes. 同期が書く行に記録する実行者。
|
|
1843
|
+
*
|
|
1844
|
+
* 空にすると、同期が作った行と手作業で入った行を監査上区別できなくなる。しかも更新系では
|
|
1845
|
+
* 最後に触れた人間の名前が残ったまま更新時刻だけ進み、監査が同期の変更を人間の仕業として
|
|
1846
|
+
* 記録することになる。
|
|
1847
|
+
*/
|
|
1848
|
+
actor: string;
|
|
1849
|
+
};
|
|
1850
|
+
/**
|
|
1851
|
+
* Creates the drizzle-backed synchronization repository.
|
|
1852
|
+
* drizzle を用いた同期リポジトリを生成する処理。
|
|
1853
|
+
*
|
|
1854
|
+
* @param dbUnknown Drizzle database instance. drizzle のデータベースインスタンス。
|
|
1855
|
+
* @param tables Identity-side tables. identity 側テーブル群。
|
|
1856
|
+
* @param authzTables Authorization tables (group master and real membership). 認可テーブル群。
|
|
1857
|
+
* @param opts Injected resolver, lockout guard and audit actor. 注入する構成。
|
|
1858
|
+
* @returns The repository. リポジトリ。
|
|
1859
|
+
*/
|
|
1860
|
+
declare function createDirectorySyncRepository(dbUnknown: unknown, tables: AuthDirectoryTables, authzTables: AuthzTables, opts: SyncRepositoryOptions): DirectorySyncRepository;
|
|
1861
|
+
|
|
1862
|
+
export { AUTH_DIRECTORY_PROVIDER_COLUMN, AUTH_DIRECTORY_TENANT_SCOPED_TABLES, type ApplyReport, type AuthDirectoryTables, type ClaimedSyncRequest, type DeleteChain, type DirectoryDb, type DirectoryLinkRow, type DirectoryLinkStoreOptions, type DirectorySyncConfig, type DirectorySyncRepository, type DirectorySyncRunResult, type EnsureConnection, type ExternalGroupGuardOptions, type ExternalLinkLookup, type InsertChain, type LedgerIdentityRow, type LedgerIdentityTables, type LinkGroupInput, type LinkableAssertion, MAX_IN_LIST, MAX_PARAMETERS, MEMBERSHIP_MODES, type MemberResolverPort, type PromotionRepository, type PromotionRepositoryOptions, type PromotionResult, type ReferencedTable, type RemovalOutcome, type SelectChain, type SyncLink, type SyncLoggerPort, type SyncMessages, type SyncOutcome, type SyncRepositoryOptions, type SyncRequestQueueOptions, type SyncRequestResult, UNHEALTHY_SYNC_OUTCOMES, type UpdateChain, assertGroupMayBeLinked, assertMembershipMode, chunk, chunkByParameters, createDirectoryLinkStore, createDirectorySync, createDirectorySyncRepository, createPromotionRepository, createSyncRequestQueue, defaultExternalGroupGuardMessage, defaultSyncMessages, defineAuthDirectorySchema, findLedgerRowsForIdentity, promoteLedgerForUser, withExternalGroupGuards };
|