@simplysm/service-common 14.0.49 → 14.0.50
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/README.md +32 -53
- package/docs/app-structure/app-structure-item.md +107 -0
- package/docs/app-structure/get-flat-permissions.md +57 -0
- package/docs/app-structure/is-usable-modules-chain.md +23 -0
- package/docs/app-structure/is-usable-modules.md +42 -0
- package/docs/{events.md → events/define-event.md} +30 -26
- package/docs/protocol/create-service-protocol.md +93 -0
- package/docs/protocol/protocol-config.md +21 -0
- package/docs/protocol/service-add-event-listener-message.md +23 -0
- package/docs/protocol/service-auth-message.md +17 -0
- package/docs/protocol/service-emit-event-message.md +21 -0
- package/docs/protocol/service-error-message.md +29 -0
- package/docs/protocol/service-event-message.md +21 -0
- package/docs/protocol/service-get-event-listener-infos-message.md +19 -0
- package/docs/protocol/service-message.md +52 -0
- package/docs/protocol/service-progress-message.md +21 -0
- package/docs/protocol/service-remove-event-listener-message.md +19 -0
- package/docs/protocol/service-request-message.md +17 -0
- package/docs/protocol/service-response-message.md +17 -0
- package/docs/service-types/app-structure-service.md +15 -0
- package/docs/service-types/auto-update-service.md +20 -0
- package/docs/{service-types.md → service-types/orm-service.md} +61 -90
- package/docs/{types.md → types/service-upload-result.md} +19 -19
- package/package.json +3 -3
- package/docs/app-structure.md +0 -175
- package/docs/protocol.md +0 -331
|
@@ -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
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
| Method | Parameters | Return | Description |
|
|
35
|
-
|--------|-----------|--------|-------------|
|
|
36
|
-
| `getInfo` | `opt: DbConnOptions & { configName: string }` | `Promise<{ dialect
|
|
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()`
|
|
47
|
-
|
|
48
|
-
##
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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.
|
|
3
|
+
"version": "14.0.50",
|
|
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.
|
|
26
|
-
"@simplysm/orm-common": "14.0.
|
|
25
|
+
"@simplysm/core-common": "14.0.50",
|
|
26
|
+
"@simplysm/orm-common": "14.0.50"
|
|
27
27
|
}
|
|
28
28
|
}
|
package/docs/app-structure.md
DELETED
|
@@ -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`으로 변환
|