@kevisual/cnb 0.0.57 → 0.0.59

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.
@@ -0,0 +1,574 @@
1
+ /**
2
+ * @title 组织管理模块
3
+ * @description 提供组织(Organizations)的管理功能,包括创建、更新、删除组织,获取组织列表、子组织、组织设置等
4
+ * @tags organization, group, team, cnb, api
5
+ * @createdAt 2025-12-04
6
+ */
7
+
8
+ import { CNBCore, CNBCoreOptions } from "../cnb-core.ts";
9
+ import { Result } from "@kevisual/query";
10
+
11
+ /**
12
+ * 组织角色枚举
13
+ */
14
+ export enum AccessRole {
15
+ Guest = "Guest",
16
+ Reporter = "Reporter",
17
+ Developer = "Developer",
18
+ Master = "Master",
19
+ Owner = "Owner",
20
+ }
21
+
22
+ /**
23
+ * 组织设置值枚举
24
+ */
25
+ export enum SettingValue {
26
+ /** 关闭组织介绍页 */
27
+ DisableOrganizationReadme = "disable_organization_readme",
28
+ /** 仅可使用云原生开发 */
29
+ CloudNativeDevOnly = "cloud_native_dev_only",
30
+ /** 支持重写分支保护规则 */
31
+ UseRootGroupBranchProtectionOnly = "user_root_group_branch_protection_only",
32
+ /** 禁止仓库修改保护分支规则 */
33
+ ForbidRedefineBranchProtection = "forbid_redefine_branch_protection",
34
+ /** 允许 TAPD 访问组织资源 */
35
+ EnableTAPDAccess = "enable_tapd_access",
36
+ /** 私有任务集显示水印 */
37
+ EnableShowPrivateMissionWaterMark = "enable_show_private_mission_water_mark",
38
+ /** 禁止创建组织 */
39
+ PreventOrganizationCreation = "prevent_organization_creation",
40
+ /** 禁止创建仓库 */
41
+ PreventRepositoryCreation = "prevent_repository_creation",
42
+ /** 禁止创建任务集 */
43
+ PreventMissionCreation = "prevent_mission_creation",
44
+ /** 禁止创建制品库 */
45
+ PreventRegistryCreation = "prevent_registry_creation",
46
+ /** 禁止邀请成员 */
47
+ DisableInvitation = "disable_invitation",
48
+ /** 禁止修改资源可见性 */
49
+ PreventVisibilityModification = "prevent_visibility_modification",
50
+ /** 禁止删除资源 */
51
+ PreventResourceDeletion = "prevent_resource_deletion",
52
+ /** 禁止归档仓库 */
53
+ PreventRepositoryArchival = "prevent_repository_archival",
54
+ /** 禁止转移组织 */
55
+ PreventOrganizationTransfer = "prevent_organization_transfer",
56
+ /** 禁止转移仓库 */
57
+ PreventRepositoryTransfer = "prevent_repository_transfer",
58
+ /** 禁止转移任务集 */
59
+ PreventMissionTransfer = "prevent_mission_transfer",
60
+ /** 禁止转移制品库 */
61
+ PreventRegistryTransfer = "prevent_registry_transfer",
62
+ /** 使用组织仓库配额 */
63
+ UseGroupGitQuota = "use_group_git_quota",
64
+ /** 使用组织仓库对象限制 */
65
+ UseGroupGitObjectLimit = "use_group_git_object_limit",
66
+ /** 仅根组织管理员可添加成员 */
67
+ EnableAddMemberOnlyRoot = "enable_add_member_only_root",
68
+ /** 开启根组织推送限制选项 */
69
+ UseRootGroupGitPushLimit = "use_root_group_git_push_limit",
70
+ /** 允许子组织管理员添加成员 */
71
+ EnableAddMember = "enable_add_member",
72
+ /** 仅根组织管理员可修改成员角色 */
73
+ EnableChangeMemberRoleOnlyRoot = "enable_change_member_role_only_root",
74
+ }
75
+
76
+ /**
77
+ * 创建组织请求参数
78
+ */
79
+ export interface CreateGroupParams {
80
+ /** 组织路径 */
81
+ path: string;
82
+ /** 组织描述 */
83
+ description?: string;
84
+ /** 根组织绑定的域名 */
85
+ bind_domain?: string;
86
+ /** 备注 */
87
+ remark?: string;
88
+ }
89
+
90
+ /**
91
+ * 更新组织信息请求参数
92
+ */
93
+ export interface UpdateGroupParams {
94
+ /** 组织描述 */
95
+ description?: string;
96
+ /** 组织展示名称 */
97
+ remark?: string;
98
+ /** 组织网站 */
99
+ site?: string;
100
+ /** 组织联系邮箱 */
101
+ email?: string;
102
+ /** 绑定的域名 */
103
+ domain?: string;
104
+ /** 微信公众号 */
105
+ wechat_mp?: string;
106
+ /** README 仓库 ID */
107
+ readme_repo_id?: number;
108
+ /** README 仓库路径 */
109
+ readme_repo_path?: string;
110
+ }
111
+
112
+ /**
113
+ * 转移组织请求参数
114
+ */
115
+ export interface TransferGroupParams {
116
+ /** 源组织路径 */
117
+ source: string;
118
+ /** 目标组织路径 */
119
+ target: string;
120
+ }
121
+
122
+ /**
123
+ * 上传 Logo 请求参数
124
+ */
125
+ export interface UploadLogoParams {
126
+ /** 文件名 */
127
+ name: string;
128
+ /** 文件大小(字节) */
129
+ size: number;
130
+ /** 额外参数 */
131
+ ext?: Record<string, string>;
132
+ }
133
+
134
+ /**
135
+ * 更新组织设置请求参数
136
+ */
137
+ export interface UpdateGroupSettingParams {
138
+ /** 是否对外隐藏组织成员,0 - 否, 1 - 是 */
139
+ hide_members?: number;
140
+ /** 是否对外隐藏子组织,0 - 否, 1 - 是 */
141
+ hide_sub_groups?: number;
142
+ /** 是否对外显示私有仓库水印,0 - 否, 1 - 是 */
143
+ show_private_repo_watermark?: number;
144
+ /** 组织保护开关,0 - 关闭,1 - 打开 */
145
+ group_protection?: number;
146
+ /** 组织限制指定邮箱认证才能加入 */
147
+ email_verification?: string[];
148
+ /** 组织设置值,多个选项用逗号拼接 */
149
+ values?: string;
150
+ }
151
+
152
+ /**
153
+ * 组织信息(包含访问权限)
154
+ */
155
+ export interface OrganizationAccess {
156
+ /** 用户在当前资源的最大权限 */
157
+ access_role?: AccessRole;
158
+ /** 所有层级成员总数 */
159
+ all_member_count?: number;
160
+ /** 所有层级子组织数量 */
161
+ all_sub_group_count?: number;
162
+ /** 所有层级子任务数量 */
163
+ all_sub_mission_count?: number;
164
+ /** 所有层级制品库数量 */
165
+ all_sub_registry_count?: number;
166
+ /** 所有层级仓库数量 */
167
+ all_sub_repo_count?: number;
168
+ /** 创建时间 */
169
+ created_at?: string;
170
+ /** 组织描述 */
171
+ description?: string;
172
+ /** 绑定的域名 */
173
+ domain?: string;
174
+ /** 组织邮箱 */
175
+ email?: string;
176
+ /** 关注数量 */
177
+ follow_count?: number;
178
+ /** 是否冻结 */
179
+ freeze?: boolean;
180
+ /** 是否有子组织 */
181
+ has_sub_group?: boolean;
182
+ /** 组织 ID */
183
+ id?: string;
184
+ /** 直接成员数量 */
185
+ member_count?: number;
186
+ /** 组织展示名称 */
187
+ name?: string;
188
+ /** 组织路径 */
189
+ path?: string;
190
+ /** 是否置顶 */
191
+ pinned?: boolean;
192
+ /** 置顶时间 */
193
+ pinned_time?: string;
194
+ /** README 仓库路径 */
195
+ readme_repo_path?: string;
196
+ /** 备注 */
197
+ remark?: string;
198
+ /** 组织网站 */
199
+ site?: string;
200
+ /** 下一级子组织数量 */
201
+ sub_group_count?: number;
202
+ /** 下一级子任务数量 */
203
+ sub_mission_count?: number;
204
+ /** 下一级制品库数量 */
205
+ sub_registry_count?: number;
206
+ /** 下一级仓库数量 */
207
+ sub_repo_count?: number;
208
+ /** 更新时间 */
209
+ updated_at?: string;
210
+ /** 微信公众号 */
211
+ wechat_mp?: string;
212
+ }
213
+
214
+ /**
215
+ * 组织信息(联合类型)
216
+ */
217
+ export interface OrganizationUnion {
218
+ /** 所有层级成员总数 */
219
+ all_member_count?: number;
220
+ /** 所有层级子组织数量 */
221
+ all_sub_group_count?: number;
222
+ /** 所有层级子任务数量 */
223
+ all_sub_mission_count?: number;
224
+ /** 所有层级制品库数量 */
225
+ all_sub_registry_count?: number;
226
+ /** 所有层级仓库数量 */
227
+ all_sub_repo_count?: number;
228
+ /** 创建时间 */
229
+ created_at?: string;
230
+ /** 组织描述 */
231
+ description?: string;
232
+ /** 绑定的域名 */
233
+ domain?: string;
234
+ /** 组织邮箱 */
235
+ email?: string;
236
+ /** 关注数量 */
237
+ follow_count?: number;
238
+ /** 是否冻结 */
239
+ freeze?: boolean;
240
+ /** 是否有子组织 */
241
+ has_sub_group?: boolean;
242
+ /** 组织 ID */
243
+ id?: string;
244
+ /** 直接成员数量 */
245
+ member_count?: number;
246
+ /** 组织展示名称 */
247
+ name?: string;
248
+ /** 组织路径 */
249
+ path?: string;
250
+ /** 是否置顶 */
251
+ pinned?: boolean;
252
+ /** 置顶时间 */
253
+ pinned_time?: string;
254
+ /** README 仓库路径 */
255
+ readme_repo_path?: string;
256
+ /** 备注 */
257
+ remark?: string;
258
+ /** 组织网站 */
259
+ site?: string;
260
+ /** 下一级子组织数量 */
261
+ sub_group_count?: number;
262
+ /** 下一级子任务数量 */
263
+ sub_mission_count?: number;
264
+ /** 下一级制品库数量 */
265
+ sub_registry_count?: number;
266
+ /** 下一级仓库数量 */
267
+ sub_repo_count?: number;
268
+ /** 更新时间 */
269
+ updated_at?: string;
270
+ /** 微信公众号 */
271
+ wechat_mp?: string;
272
+ }
273
+
274
+ /**
275
+ * 上传 Logo 响应
276
+ */
277
+ export interface UploadLogoResponse {
278
+ /** 上传后的文件信息 */
279
+ assets?: {
280
+ /** 文件大小 */
281
+ size?: number;
282
+ /** 文件名 */
283
+ name?: string;
284
+ /** 文件路径 */
285
+ path?: string;
286
+ /** 内容类型 */
287
+ content_type?: string;
288
+ /** 额外信息 */
289
+ ext?: Record<string, string>;
290
+ };
291
+ /** 上传表单字段 */
292
+ form?: Record<string, string>;
293
+ /** 上传 URL */
294
+ upload_url?: string;
295
+ /** 后续确认接口使用的 token */
296
+ token?: string;
297
+ }
298
+
299
+ /**
300
+ * 组织设置值
301
+ */
302
+ export interface SettingValues {
303
+ /** 禁用组织 README */
304
+ disable_organization_readme?: boolean;
305
+ /** 云原生开发限制 */
306
+ cloud_native_dev_only?: boolean;
307
+ /** 根组织分支保护规则限制 */
308
+ user_root_group_branch_protection_only?: boolean;
309
+ /** 禁止重定义分支保护 */
310
+ forbid_redefine_branch_protection?: boolean;
311
+ /** TAPD 访问 */
312
+ enable_tapd_access?: boolean;
313
+ /** 私有任务水印 */
314
+ enable_show_private_mission_water_mark?: boolean;
315
+ /** 禁止组织创建 */
316
+ prevent_organization_creation?: boolean;
317
+ /** 禁止仓库创建 */
318
+ prevent_repository_creation?: boolean;
319
+ /** 禁止任务集创建 */
320
+ prevent_mission_creation?: boolean;
321
+ /** 禁止制品库创建 */
322
+ prevent_registry_creation?: boolean;
323
+ /** 禁止邀请 */
324
+ disable_invitation?: boolean;
325
+ /** 禁止可见性修改 */
326
+ prevent_visibility_modification?: boolean;
327
+ /** 禁止资源删除 */
328
+ prevent_resource_deletion?: boolean;
329
+ /** 禁止仓库归档 */
330
+ prevent_repository_archival?: boolean;
331
+ /** 禁止组织转移 */
332
+ prevent_organization_transfer?: boolean;
333
+ /** 禁止仓库转移 */
334
+ prevent_repository_transfer?: boolean;
335
+ /** 禁止任务集转移 */
336
+ prevent_mission_transfer?: boolean;
337
+ /** 禁止制品库转移 */
338
+ prevent_registry_transfer?: boolean;
339
+ /** 使用组织 Git 配额 */
340
+ use_group_git_quota?: boolean;
341
+ /** 使用组织 Git 对象限制 */
342
+ use_group_git_object_limit?: boolean;
343
+ /** 仅根组织可添加成员 */
344
+ enable_add_member_only_root?: boolean;
345
+ /** 使用根组织 Git 推送限制 */
346
+ use_root_group_git_push_limit?: boolean;
347
+ /** 允许添加成员 */
348
+ enable_add_member?: boolean;
349
+ /** 仅根组织可修改成员角色 */
350
+ enable_change_member_role_only_root?: boolean;
351
+ }
352
+
353
+ /**
354
+ * 组织设置信息(包含父级继承)
355
+ */
356
+ export interface OrganizationSettingWithParent {
357
+ /** 上级是否隐藏成员,true - 上级禁止显示 */
358
+ can_show_members?: boolean;
359
+ /** 上级是否隐藏子组织,true - 上级禁止显示 */
360
+ can_show_sub_groups?: boolean;
361
+ /** 是否可以显示水印 */
362
+ can_show_watermark?: boolean;
363
+ /** 邮箱验证配置 */
364
+ email_verification?: string[];
365
+ /** 组织保护开关 */
366
+ group_protection?: number;
367
+ /** 是否对外隐藏组织成员,0 - 否, 1 - 是 */
368
+ hide_members?: number;
369
+ /** 是否对外隐藏子组织,0 - 否, 1 - 是 */
370
+ hide_sub_groups?: number;
371
+ /** 根组织邮箱验证配置 */
372
+ root_email_verification?: string[];
373
+ /** 根组织保护开关 */
374
+ root_group_protection?: boolean;
375
+ /** 根组织设置值 */
376
+ root_values?: SettingValues;
377
+ /** 是否对外显示私有仓库水印 */
378
+ show_private_repo_watermark?: number;
379
+ /** 当前组织设置值 */
380
+ values?: SettingValues;
381
+ }
382
+
383
+ /**
384
+ * 组织管理模块
385
+ * https://api.cnb.cool/#/operations/GetGroup
386
+ */
387
+ export class Organization extends CNBCore {
388
+ constructor(options: CNBCoreOptions) {
389
+ super(options);
390
+ }
391
+
392
+ /**
393
+ * 创建新组织
394
+ * @param params 组织信息
395
+ */
396
+ create(params: CreateGroupParams): Promise<Result<OrganizationAccess>> {
397
+ return this.post({
398
+ url: "/groups",
399
+ data: params,
400
+ });
401
+ }
402
+
403
+ /**
404
+ * 获取当前用户拥有权限的顶层组织列表
405
+ * @param params 查询参数
406
+ */
407
+ listTopGroups(params?: {
408
+ page?: number;
409
+ page_size?: number;
410
+ search?: string;
411
+ role?: AccessRole;
412
+ }): Promise<Result<OrganizationAccess[]>> {
413
+ return this.get({
414
+ url: "/user/groups",
415
+ params,
416
+ });
417
+ }
418
+
419
+ /**
420
+ * 查询当前用户在指定组织下拥有指定权限的子组织列表
421
+ * @param slug 组织路径
422
+ * @param params 查询参数
423
+ */
424
+ listGroups(
425
+ slug: string,
426
+ params?: {
427
+ page?: number;
428
+ page_size?: number;
429
+ access?: number;
430
+ }
431
+ ): Promise<Result<OrganizationAccess[]>> {
432
+ return this.get({
433
+ url: `/user/groups/${slug}`,
434
+ params,
435
+ });
436
+ }
437
+
438
+ /**
439
+ * 获取指定用户拥有权限的顶层组织列表
440
+ * @param username 用户名
441
+ * @param params 查询参数
442
+ */
443
+ getGroupsByUsername(
444
+ username: string,
445
+ params?: {
446
+ search?: string;
447
+ page?: number;
448
+ page_size?: number;
449
+ }
450
+ ): Promise<Result<OrganizationUnion>> {
451
+ return this.get({
452
+ url: `/users/${username}/groups`,
453
+ params,
454
+ });
455
+ }
456
+
457
+ /**
458
+ * 获取指定组织信息
459
+ * @param group 组织路径
460
+ */
461
+ getGroup(group: string): Promise<Result<OrganizationAccess>> {
462
+ return this.get({
463
+ url: `/${group}`,
464
+ });
465
+ }
466
+
467
+ /**
468
+ * 更新组织信息,可更新的内容为:组织描述、组织展示名称、组织网站、组织联系邮箱
469
+ * @param group 组织路径
470
+ * @param params 更新内容
471
+ */
472
+ updateGroup(
473
+ group: string,
474
+ params: UpdateGroupParams
475
+ ): Promise<Result<OrganizationAccess>> {
476
+ return this.put({
477
+ url: `/${group}`,
478
+ data: params,
479
+ });
480
+ }
481
+
482
+ /**
483
+ * 删除指定组织
484
+ * @param group 组织路径
485
+ * @param identityTicket 微信身份验证票据
486
+ */
487
+ deleteGroup(
488
+ group: string,
489
+ identityTicket?: string
490
+ ): Promise<Result<void>> {
491
+ return this.delete({
492
+ url: `/${group}`,
493
+ headers: identityTicket
494
+ ? { "x-cnb-identity-ticket": identityTicket }
495
+ : undefined,
496
+ });
497
+ }
498
+
499
+ /**
500
+ * 转移组织
501
+ * @param group 组织路径
502
+ * @param params 转移参数
503
+ */
504
+ transfer(
505
+ group: string,
506
+ params: TransferGroupParams
507
+ ): Promise<Result<void>> {
508
+ return this.post({
509
+ url: `/${group}/-/transfer`,
510
+ data: params,
511
+ });
512
+ }
513
+
514
+ /**
515
+ * 上传 Logo,发起上传请求,返回上传文件的 URL,请使用 PUT 发起流式上传
516
+ * @param group 组织路径
517
+ * @param params 上传参数
518
+ */
519
+ uploadLogo(
520
+ group: string,
521
+ params: UploadLogoParams
522
+ ): Promise<Result<UploadLogoResponse>> {
523
+ return this.post({
524
+ url: `/${group}/-/upload/logos`,
525
+ data: params,
526
+ });
527
+ }
528
+
529
+ /**
530
+ * 获取指定组织的配置详情
531
+ * @param slug 组织路径
532
+ */
533
+ getSetting(
534
+ slug: string
535
+ ): Promise<Result<OrganizationSettingWithParent>> {
536
+ return this.get({
537
+ url: `/${slug}/-/settings`,
538
+ });
539
+ }
540
+
541
+ /**
542
+ * 更新指定组织的配置
543
+ * @param slug 组织路径
544
+ * @param params 设置参数
545
+ */
546
+ updateSetting(
547
+ slug: string,
548
+ params: UpdateGroupSettingParams
549
+ ): Promise<Result<void>> {
550
+ return this.put({
551
+ url: `/${slug}/-/settings`,
552
+ data: params,
553
+ });
554
+ }
555
+
556
+ /**
557
+ * 获取指定组织下的子组织列表
558
+ * @param slug 组织路径
559
+ * @param params 查询参数
560
+ */
561
+ listSubgroups(
562
+ slug: string,
563
+ params?: {
564
+ search?: string;
565
+ page?: number;
566
+ page_size?: number;
567
+ }
568
+ ): Promise<Result<OrganizationUnion[]>> {
569
+ return this.get({
570
+ url: `/${slug}/-/sub-groups`,
571
+ params,
572
+ });
573
+ }
574
+ }