@simplysm/service-common 14.0.49 → 14.0.51

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,52 @@
1
+ # ServiceMessage
2
+
3
+ 모든 서비스 메시지의 유니언 타입. 클라이언트·서버 양방향 메시지를 모두 포함한다.
4
+
5
+ ```typescript
6
+ export type ServiceMessage =
7
+ | ServiceRequestMessage
8
+ | ServiceAuthMessage
9
+ | ServiceProgressMessage
10
+ | ServiceResponseMessage
11
+ | ServiceErrorMessage
12
+ | ServiceAddEventListenerMessage
13
+ | ServiceRemoveEventListenerMessage
14
+ | ServiceGetEventListenerInfosMessage
15
+ | ServiceEmitEventMessage
16
+ | ServiceEventMessage;
17
+ ```
18
+
19
+ ## Related Types
20
+
21
+ ### `ServiceClientMessage`
22
+
23
+ 클라이언트 → 서버 메시지 유니언.
24
+
25
+ ```typescript
26
+ export type ServiceClientMessage =
27
+ | ServiceRequestMessage
28
+ | ServiceAuthMessage
29
+ | ServiceAddEventListenerMessage
30
+ | ServiceRemoveEventListenerMessage
31
+ | ServiceGetEventListenerInfosMessage
32
+ | ServiceEmitEventMessage;
33
+ ```
34
+
35
+ ### `ServiceServerMessage`
36
+
37
+ 서버 → 클라이언트 메시지 유니언.
38
+
39
+ ```typescript
40
+ export type ServiceServerMessage =
41
+ | ServiceResponseMessage
42
+ | ServiceErrorMessage
43
+ | ServiceEventMessage;
44
+ ```
45
+
46
+ ### `ServiceServerRawMessage`
47
+
48
+ 서버가 보내는 모든 메시지 (진행 상태 포함).
49
+
50
+ ```typescript
51
+ export type ServiceServerRawMessage = ServiceProgressMessage | ServiceServerMessage;
52
+ ```
@@ -0,0 +1,21 @@
1
+ # ServiceProgressMessage
2
+
3
+ 서버가 보내는 청크 수신 진행 상태 알림 메시지.
4
+
5
+ ```typescript
6
+ export interface ServiceProgressMessage {
7
+ name: "progress";
8
+ body: {
9
+ totalSize: number;
10
+ completedSize: number;
11
+ };
12
+ }
13
+ ```
14
+
15
+ ## Members
16
+
17
+ | Field | Type | Description |
18
+ |-------|------|-------------|
19
+ | `name` | `"progress"` | 고정 문자열 discriminant |
20
+ | `body.totalSize` | `number` | 전체 메시지 크기 (바이트) |
21
+ | `body.completedSize` | `number` | 현재까지 수신 완료된 크기 (바이트) |
@@ -0,0 +1,19 @@
1
+ # ServiceRemoveEventListenerMessage
2
+
3
+ 클라이언트가 보내는 이벤트 리스너 제거 메시지.
4
+
5
+ ```typescript
6
+ export interface ServiceRemoveEventListenerMessage {
7
+ name: "evt:remove";
8
+ body: {
9
+ key: string;
10
+ };
11
+ }
12
+ ```
13
+
14
+ ## Members
15
+
16
+ | Field | Type | Description |
17
+ |-------|------|-------------|
18
+ | `name` | `"evt:remove"` | 고정 문자열 discriminant |
19
+ | `body.key` | `string` | 제거할 리스너 키 (UUID) |
@@ -0,0 +1,17 @@
1
+ # ServiceRequestMessage
2
+
3
+ 클라이언트가 보내는 서비스 메서드 요청 메시지.
4
+
5
+ ```typescript
6
+ export interface ServiceRequestMessage {
7
+ name: `${string}.${string}`;
8
+ body: unknown[];
9
+ }
10
+ ```
11
+
12
+ ## Members
13
+
14
+ | Field | Type | Description |
15
+ |-------|------|-------------|
16
+ | `name` | `` `${string}.${string}` `` | 서비스명.메서드명 형식 (예: `"OrmService.connect"`) |
17
+ | `body` | `unknown[]` | 메서드 매개변수 배열 |
@@ -0,0 +1,17 @@
1
+ # ServiceResponseMessage
2
+
3
+ 서버가 보내는 서비스 메서드 응답 메시지.
4
+
5
+ ```typescript
6
+ export interface ServiceResponseMessage {
7
+ name: "response";
8
+ body?: unknown;
9
+ }
10
+ ```
11
+
12
+ ## Members
13
+
14
+ | Field | Type | Description |
15
+ |-------|------|-------------|
16
+ | `name` | `"response"` | 고정 문자열 discriminant |
17
+ | `body` | `unknown?` | 메서드 실행 결과 (없으면 void) |
@@ -0,0 +1,15 @@
1
+ # AppStructureService
2
+
3
+ 서버에 등록된 앱 구조 항목을 클라이언트명 기준 맵으로 조회하는 서비스 인터페이스.
4
+
5
+ ```typescript
6
+ export interface AppStructureService {
7
+ getItems(): Record<string, AppStructureItem[]>;
8
+ }
9
+ ```
10
+
11
+ ## Members
12
+
13
+ | Method | Parameters | Return | Description |
14
+ |--------|-----------|--------|-------------|
15
+ | `getItems` | 없음 | `Record<string, AppStructureItem[]>` | 클라이언트명을 키로, 해당 클라이언트의 앱 구조 항목 배열을 값으로 하는 맵 반환 |
@@ -0,0 +1,20 @@
1
+ # AutoUpdateService
2
+
3
+ 클라이언트 애플리케이션의 최신 버전 정보를 조회하는 서비스 인터페이스.
4
+
5
+ ```typescript
6
+ export interface AutoUpdateService {
7
+ getLastVersion(platform: string): Promise<
8
+ | { version: string; downloadPath: string }
9
+ | undefined
10
+ >;
11
+ }
12
+ ```
13
+
14
+ ## Members
15
+
16
+ | Method | Parameters | Return | Description |
17
+ |--------|-----------|--------|-------------|
18
+ | `getLastVersion` | `platform: string` | `Promise<{ version: string; downloadPath: string } \| undefined>` | 지정된 플랫폼의 최신 버전 정보 조회. 버전이 없으면 `undefined` |
19
+
20
+ `platform` 예시: `"win32"`, `"darwin"`, `"linux"`
@@ -1,90 +1,61 @@
1
- # Service Types
2
-
3
- ## `OrmService`
4
-
5
- 데이터베이스 연결, 트랜잭션 관리, 쿼리 실행을 제공하는 서비스 인터페이스. MySQL, MSSQL, PostgreSQL을 지원한다. 이 패키지에는 구현체가 없으며, 서버(`service-server`)와 클라이언트(`service-client`)가 공유하는 타입 계약이다.
6
-
7
- ```typescript
8
- export interface OrmService {
9
- getInfo(opt: DbConnOptions & { configName: string }): Promise<{
10
- dialect: Dialect;
11
- database?: string;
12
- schema?: string;
13
- }>;
14
- connect(opt: DbConnOptions & { configName: string }): Promise<number>;
15
- close(connId: number): Promise<void>;
16
- beginTransaction(connId: number, isolationLevel?: IsolationLevel): Promise<void>;
17
- commitTransaction(connId: number): Promise<void>;
18
- rollbackTransaction(connId: number): Promise<void>;
19
- executeParametrized(connId: number, query: string, params?: unknown[]): Promise<unknown[][]>;
20
- executeDefs(
21
- connId: number,
22
- defs: QueryDef[],
23
- options?: (ResultMeta | undefined)[],
24
- ): Promise<unknown[][]>;
25
- bulkInsert(
26
- connId: number,
27
- tableName: string,
28
- columnDefs: Record<string, ColumnMeta>,
29
- records: Record<string, unknown>[],
30
- ): Promise<void>;
31
- }
32
- ```
33
-
34
- | Method | Parameters | Return | Description |
35
- |--------|-----------|--------|-------------|
36
- | `getInfo` | `opt: DbConnOptions & { configName: string }` | `Promise<{ dialect, database?, schema? }>` | DB 연결 정보 (dialect, database, schema) 조회 |
37
- | `connect` | `opt: DbConnOptions & { configName: string }` | `Promise<number>` | DB 연결을 생성하고 연결 ID 반환 |
38
- | `close` | `connId: number` | `Promise<void>` | 연결 종료 |
39
- | `beginTransaction` | `connId: number, isolationLevel?: IsolationLevel` | `Promise<void>` | 트랜잭션 시작 |
40
- | `commitTransaction` | `connId: number` | `Promise<void>` | 트랜잭션 커밋 |
41
- | `rollbackTransaction` | `connId: number` | `Promise<void>` | 트랜잭션 롤백 |
42
- | `executeParametrized` | `connId: number, query: string, params?: unknown[]` | `Promise<unknown[][]>` | 파라미터 바인딩 쿼리 실행 |
43
- | `executeDefs` | `connId: number, defs: QueryDef[], options?: (ResultMeta \| undefined)[]` | `Promise<unknown[][]>` | QueryDef 배열로 쿼리 실행 |
44
- | `bulkInsert` | `connId: number, tableName: string, columnDefs: Record<string, ColumnMeta>, records: Record<string, unknown>[]` | `Promise<void>` | 대량 삽입 |
45
-
46
- 사용 순서: `connect()` -> `beginTransaction()` -> `executeDefs()`/`executeParametrized()` -> `commitTransaction()`/`rollbackTransaction()` -> `close()`
47
-
48
- ## `DbConnOptions`
49
-
50
- 데이터베이스 연결 옵션.
51
-
52
- ```typescript
53
- export type DbConnOptions = { configName?: string; config?: Record<string, unknown> };
54
- ```
55
-
56
- | Field | Type | Description |
57
- |-------|------|-------------|
58
- | `configName` | `string?` | 서버에 등록된 DB 설정 이름 |
59
- | `config` | `Record<string, unknown>?` | 직접 지정하는 DB 연결 설정 |
60
-
61
- ## `AutoUpdateService`
62
-
63
- 클라이언트 애플리케이션의 최신 버전 정보를 조회하는 서비스 인터페이스.
64
-
65
- ```typescript
66
- export interface AutoUpdateService {
67
- getLastVersion(platform: string): Promise<
68
- | { version: string; downloadPath: string }
69
- | undefined
70
- >;
71
- }
72
- ```
73
-
74
- | Method | Parameters | Return | Description |
75
- |--------|-----------|--------|-------------|
76
- | `getLastVersion` | `platform: string` | `Promise<{ version, downloadPath } \| undefined>` | 지정된 플랫폼(예: "win32", "darwin", "linux")의 최신 버전 정보 조회. 버전이 없으면 undefined |
77
-
78
- ## `AppStructureService`
79
-
80
- 서버에 등록된 앱 구조 항목을 클라이언트명 기준 맵으로 조회하는 서비스 인터페이스.
81
-
82
- ```typescript
83
- export interface AppStructureService {
84
- getItems(): Record<string, AppStructureItem[]>;
85
- }
86
- ```
87
-
88
- | Method | Parameters | Return | Description |
89
- |--------|-----------|--------|-------------|
90
- | `getItems` | 없음 | `Record<string, AppStructureItem[]>` | 클라이언트명을 키로, 해당 클라이언트의 앱 구조 항목 배열을 값으로 하는 맵 반환 |
1
+ # OrmService
2
+
3
+ 데이터베이스 연결, 트랜잭션 관리, 쿼리 실행을 제공하는 서비스 인터페이스. MySQL, MSSQL, PostgreSQL을 지원한다. 이 패키지에는 구현체가 없으며, 서버(`service-server`)와 클라이언트(`service-client`)가 공유하는 타입 계약이다.
4
+
5
+ ```typescript
6
+ export interface OrmService {
7
+ getInfo(opt: DbConnOptions & { configName: string }): Promise<{
8
+ dialect: Dialect;
9
+ database?: string;
10
+ schema?: string;
11
+ }>;
12
+ connect(opt: DbConnOptions & { configName: string }): Promise<number>;
13
+ close(connId: number): Promise<void>;
14
+ beginTransaction(connId: number, isolationLevel?: IsolationLevel): Promise<void>;
15
+ commitTransaction(connId: number): Promise<void>;
16
+ rollbackTransaction(connId: number): Promise<void>;
17
+ executeParametrized(connId: number, query: string, params?: unknown[]): Promise<unknown[][]>;
18
+ executeDefs(
19
+ connId: number,
20
+ defs: QueryDef[],
21
+ options?: (ResultMeta | undefined)[],
22
+ ): Promise<unknown[][]>;
23
+ bulkInsert(
24
+ connId: number,
25
+ tableName: string,
26
+ columnDefs: Record<string, ColumnMeta>,
27
+ records: Record<string, unknown>[],
28
+ ): Promise<void>;
29
+ }
30
+ ```
31
+
32
+ ## Members
33
+
34
+ | Method | Parameters | Return | Description |
35
+ |--------|-----------|--------|-------------|
36
+ | `getInfo` | `opt: DbConnOptions & { configName: string }` | `Promise<{ dialect: Dialect; database?: string; schema?: string }>` | DB 연결 정보 조회 |
37
+ | `connect` | `opt: DbConnOptions & { configName: string }` | `Promise<number>` | DB 연결을 생성하고 연결 ID 반환 |
38
+ | `close` | `connId: number` | `Promise<void>` | 연결 종료 |
39
+ | `beginTransaction` | `connId: number, isolationLevel?: IsolationLevel` | `Promise<void>` | 트랜잭션 시작 |
40
+ | `commitTransaction` | `connId: number` | `Promise<void>` | 트랜잭션 커밋 |
41
+ | `rollbackTransaction` | `connId: number` | `Promise<void>` | 트랜잭션 롤백 |
42
+ | `executeParametrized` | `connId: number, query: string, params?: unknown[]` | `Promise<unknown[][]>` | 파라미터 바인딩 쿼리 실행 |
43
+ | `executeDefs` | `connId: number, defs: QueryDef[], options?: (ResultMeta \| undefined)[]` | `Promise<unknown[][]>` | QueryDef 배열로 쿼리 실행 |
44
+ | `bulkInsert` | `connId: number, tableName: string, columnDefs: Record<string, ColumnMeta>, records: Record<string, unknown>[]` | `Promise<void>` | 대량 삽입 |
45
+
46
+ 사용 순서: `connect()` `beginTransaction()` `executeDefs()`/`executeParametrized()` `commitTransaction()`/`rollbackTransaction()` `close()`
47
+
48
+ ## Related Types
49
+
50
+ ### `DbConnOptions`
51
+
52
+ 데이터베이스 연결 옵션.
53
+
54
+ ```typescript
55
+ export type DbConnOptions = { configName?: string; config?: Record<string, unknown> };
56
+ ```
57
+
58
+ | Field | Type | Description |
59
+ |-------|------|-------------|
60
+ | `configName` | `string?` | 서버에 등록된 DB 설정 이름 |
61
+ | `config` | `Record<string, unknown>?` | 직접 지정하는 DB 연결 설정 |
@@ -1,19 +1,19 @@
1
- # Types
2
-
3
- ## `ServiceUploadResult`
4
-
5
- 파일 업로드 결과. 서버에 업로드된 파일의 정보를 포함한다.
6
-
7
- ```typescript
8
- export interface ServiceUploadResult {
9
- path: string;
10
- filename: string;
11
- size: number;
12
- }
13
- ```
14
-
15
- | Field | Type | Description |
16
- |-------|------|-------------|
17
- | `path` | `string` | 서버 내 저장 경로 |
18
- | `filename` | `string` | 원본 파일명 |
19
- | `size` | `number` | 파일 크기 (바이트) |
1
+ # ServiceUploadResult
2
+
3
+ 파일 업로드 결과. 서버에 업로드된 파일의 정보를 포함한다.
4
+
5
+ ```typescript
6
+ export interface ServiceUploadResult {
7
+ path: string;
8
+ filename: string;
9
+ size: number;
10
+ }
11
+ ```
12
+
13
+ ## Members
14
+
15
+ | Field | Type | Description |
16
+ |-------|------|-------------|
17
+ | `path` | `string` | 서버 내 저장 경로 |
18
+ | `filename` | `string` | 원본 파일명 |
19
+ | `size` | `number` | 파일 크기 (바이트) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/service-common",
3
- "version": "14.0.49",
3
+ "version": "14.0.51",
4
4
  "description": "심플리즘 패키지 - 서비스 (common)",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",
@@ -22,7 +22,7 @@
22
22
  "@types/node": "^20.19.39"
23
23
  },
24
24
  "dependencies": {
25
- "@simplysm/core-common": "14.0.49",
26
- "@simplysm/orm-common": "14.0.49"
25
+ "@simplysm/core-common": "14.0.51",
26
+ "@simplysm/orm-common": "14.0.51"
27
27
  }
28
28
  }
@@ -1,175 +0,0 @@
1
- # App Structure
2
-
3
- ## `AppStructureItem`
4
-
5
- 앱 구조 항목 유니언 타입. `children` 필드 유무로 그룹과 리프를 구분한다.
6
-
7
- ```typescript
8
- export type AppStructureItem<TModule = unknown> =
9
- | AppStructureGroupItem<TModule>
10
- | AppStructureLeafItem<TModule>;
11
- ```
12
-
13
- `TModule` 제네릭은 모듈 식별자 타입이다 (일반적으로 `string`).
14
-
15
- ## `AppStructureGroupItem`
16
-
17
- 자식을 가진 그룹 메뉴 항목. `children` 필드로 하위 항목을 재귀적으로 포함한다.
18
-
19
- ```typescript
20
- export interface AppStructureGroupItem<TModule> {
21
- code: string;
22
- title: string;
23
- modules?: TModule[];
24
- requiredModules?: TModule[];
25
- icon?: string;
26
- children: AppStructureItem<TModule>[];
27
- }
28
- ```
29
-
30
- | Field | Type | Description |
31
- |-------|------|-------------|
32
- | `code` | `string` | 항목 코드 (권한 코드 체인에 사용) |
33
- | `title` | `string` | 표시 이름 |
34
- | `modules` | `TModule[]?` | 접근에 필요한 모듈 목록 (OR 조건: 하나라도 있으면 접근 가능) |
35
- | `requiredModules` | `TModule[]?` | 접근에 필수인 모듈 목록 (AND 조건: 모두 있어야 접근 가능) |
36
- | `icon` | `string?` | 아이콘 식별자 |
37
- | `children` | `AppStructureItem<TModule>[]` | 하위 메뉴 항목 배열 |
38
-
39
- ## `AppStructureLeafItem`
40
-
41
- 말단 메뉴 항목. 실제 페이지 URL과 권한(perms)을 가진다.
42
-
43
- ```typescript
44
- export interface AppStructureLeafItem<TModule> {
45
- code: string;
46
- title: string;
47
- modules?: TModule[];
48
- requiredModules?: TModule[];
49
- perms?: ("use" | "edit")[];
50
- subPerms?: AppStructureSubPermission<TModule>[];
51
- icon?: string;
52
- url?: string;
53
- isNotMenu?: boolean;
54
- }
55
- ```
56
-
57
- | Field | Type | Description |
58
- |-------|------|-------------|
59
- | `code` | `string` | 항목 코드 |
60
- | `title` | `string` | 표시 이름 |
61
- | `modules` | `TModule[]?` | 접근에 필요한 모듈 목록 (OR 조건) |
62
- | `requiredModules` | `TModule[]?` | 접근에 필수인 모듈 목록 (AND 조건) |
63
- | `perms` | `("use" \| "edit")[]?` | 이 항목에 부여 가능한 권한 종류 |
64
- | `subPerms` | `AppStructureSubPermission<TModule>[]?` | 하위 권한 정의 배열 |
65
- | `icon` | `string?` | 아이콘 식별자 |
66
- | `url` | `string?` | 페이지 URL |
67
- | `isNotMenu` | `boolean?` | true이면 메뉴에 표시하지 않음 |
68
-
69
- ## `AppStructureSubPermission`
70
-
71
- 리프 항목의 하위 권한 정의. 각 하위 권한도 모듈 접근 제어를 가진다.
72
-
73
- ```typescript
74
- export interface AppStructureSubPermission<TModule> {
75
- code: string;
76
- title: string;
77
- modules?: TModule[];
78
- requiredModules?: TModule[];
79
- perms: ("use" | "edit")[];
80
- }
81
- ```
82
-
83
- | Field | Type | Description |
84
- |-------|------|-------------|
85
- | `code` | `string` | 하위 권한 코드 |
86
- | `title` | `string` | 하위 권한 표시 이름 |
87
- | `modules` | `TModule[]?` | 접근에 필요한 모듈 목록 (OR 조건) |
88
- | `requiredModules` | `TModule[]?` | 접근에 필수인 모듈 목록 (AND 조건) |
89
- | `perms` | `("use" \| "edit")[]` | 부여 가능한 권한 종류 |
90
-
91
- ## `FlatPermission`
92
-
93
- 트리를 플래트닝한 권한 결과. `getFlatPermissions()`의 반환 타입이다.
94
-
95
- ```typescript
96
- export interface FlatPermission<TModule = unknown> {
97
- titleChain: string[];
98
- codeChain: string[];
99
- modulesChain: TModule[][];
100
- }
101
- ```
102
-
103
- | Field | Type | Description |
104
- |-------|------|-------------|
105
- | `titleChain` | `string[]` | 루트부터 현재 권한까지의 표시 이름 체인 (예: `[관리, 사용자]`) |
106
- | `codeChain` | `string[]` | 루트부터 현재 권한까지의 코드 체인 (예: `[admin, user, use]`) |
107
- | `modulesChain` | `TModule[][]` | 각 레벨에서 필요한 모듈 목록의 체인 |
108
-
109
- ## `isUsableModules`
110
-
111
- 단일 항목의 모듈 접근 가능 여부를 판단한다.
112
-
113
- ```typescript
114
- export function isUsableModules<TModule>(
115
- modules: TModule[] | undefined,
116
- requiredModules: TModule[] | undefined,
117
- usableModules: TModule[] | undefined,
118
- ): boolean;
119
- ```
120
-
121
- | Parameter | Type | Description |
122
- |-----------|------|-------------|
123
- | `modules` | `TModule[] \| undefined` | OR 조건 모듈 목록. 하나라도 `usableModules`에 포함되면 통과 |
124
- | `requiredModules` | `TModule[] \| undefined` | AND 조건 모듈 목록. 모두 `usableModules`에 포함되어야 통과 |
125
- | `usableModules` | `TModule[] \| undefined` | 사용자가 보유한 활성 모듈 목록 |
126
-
127
- 반환: `modules`와 `requiredModules` 조건을 모두 만족하면 `true`.
128
-
129
- - `modules`가 undefined이거나 빈 배열이면 OR 조건은 자동 통과
130
- - `requiredModules`가 undefined이거나 빈 배열이면 AND 조건은 자동 통과
131
- - `usableModules`가 undefined이면 `modules`가 있을 때 `false`
132
-
133
- ## `isUsableModulesChain`
134
-
135
- 모듈 체인 전체의 접근 가능 여부를 판단한다. 트리의 각 레벨에서 모듈 조건을 모두 만족해야 한다.
136
-
137
- ```typescript
138
- export function isUsableModulesChain<TModule>(
139
- modulesChain: TModule[][],
140
- requiredModulesChain: TModule[][],
141
- usableModules: TModule[] | undefined,
142
- ): boolean;
143
- ```
144
-
145
- | Parameter | Type | Description |
146
- |-----------|------|-------------|
147
- | `modulesChain` | `TModule[][]` | 각 레벨의 OR 조건 모듈 배열 |
148
- | `requiredModulesChain` | `TModule[][]` | 각 레벨의 AND 조건 모듈 배열 |
149
- | `usableModules` | `TModule[] \| undefined` | 사용자가 보유한 활성 모듈 목록 |
150
-
151
- 반환: 모든 레벨의 조건을 만족하면 `true`. 하나라도 실패하면 `false`.
152
-
153
- ## `getFlatPermissions`
154
-
155
- 앱 구조 트리를 BFS로 순회하며 모듈 조건을 필터링하여 `FlatPermission[]`으로 플래트닝한다.
156
-
157
- ```typescript
158
- export function getFlatPermissions<TModule>(
159
- items: AppStructureItem<TModule>[],
160
- usableModules: TModule[] | undefined,
161
- ): FlatPermission<TModule>[];
162
- ```
163
-
164
- | Parameter | Type | Description |
165
- |-----------|------|-------------|
166
- | `items` | `AppStructureItem<TModule>[]` | 앱 구조 트리의 최상위 항목 배열 |
167
- | `usableModules` | `TModule[] \| undefined` | 사용자가 보유한 활성 모듈 목록. undefined이면 모듈 조건이 없는 항목만 포함 |
168
-
169
- 반환: 모듈 조건을 만족하는 모든 권한의 플랫 목록.
170
-
171
- 처리 로직:
172
- 1. BFS로 트리를 순회하며 각 레벨의 `modules`(OR)와 `requiredModules`(AND) 조건을 체크
173
- 2. 조건 미충족 항목은 하위 트리 전체를 건너뜀
174
- 3. `AppStructureLeafItem`의 `perms`를 `codeChain`에 추가하여 `FlatPermission` 생성
175
- 4. `subPerms`도 개별 모듈 조건을 체크하여 `FlatPermission`으로 변환