@pengzi/kms 1.0.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.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -0
  3. package/dist/client.d.ts +130 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +266 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +20 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +54 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/asymmetric-crypto.d.ts +81 -0
  12. package/dist/core/asymmetric-crypto.d.ts.map +1 -0
  13. package/dist/core/asymmetric-crypto.js +171 -0
  14. package/dist/core/asymmetric-crypto.js.map +1 -0
  15. package/dist/core/crypto.d.ts +37 -0
  16. package/dist/core/crypto.d.ts.map +1 -0
  17. package/dist/core/crypto.js +100 -0
  18. package/dist/core/crypto.js.map +1 -0
  19. package/dist/core/crypto.service.d.ts +35 -0
  20. package/dist/core/crypto.service.d.ts.map +1 -0
  21. package/dist/core/crypto.service.js +67 -0
  22. package/dist/core/crypto.service.js.map +1 -0
  23. package/dist/core/key-derivation.d.ts +25 -0
  24. package/dist/core/key-derivation.d.ts.map +1 -0
  25. package/dist/core/key-derivation.js +96 -0
  26. package/dist/core/key-derivation.js.map +1 -0
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +51 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/models/audit.model.d.ts +40 -0
  32. package/dist/models/audit.model.d.ts.map +1 -0
  33. package/dist/models/audit.model.js +83 -0
  34. package/dist/models/audit.model.js.map +1 -0
  35. package/dist/models/key.model.d.ts +40 -0
  36. package/dist/models/key.model.d.ts.map +1 -0
  37. package/dist/models/key.model.js +120 -0
  38. package/dist/models/key.model.js.map +1 -0
  39. package/dist/models/project.model.d.ts +20 -0
  40. package/dist/models/project.model.d.ts.map +1 -0
  41. package/dist/models/project.model.js +54 -0
  42. package/dist/models/project.model.js.map +1 -0
  43. package/dist/models/user.model.d.ts +48 -0
  44. package/dist/models/user.model.d.ts.map +1 -0
  45. package/dist/models/user.model.js +141 -0
  46. package/dist/models/user.model.js.map +1 -0
  47. package/dist/repositories/audit.repository.d.ts +37 -0
  48. package/dist/repositories/audit.repository.d.ts.map +1 -0
  49. package/dist/repositories/audit.repository.js +116 -0
  50. package/dist/repositories/audit.repository.js.map +1 -0
  51. package/dist/repositories/base.repository.d.ts +54 -0
  52. package/dist/repositories/base.repository.d.ts.map +1 -0
  53. package/dist/repositories/base.repository.js +97 -0
  54. package/dist/repositories/base.repository.js.map +1 -0
  55. package/dist/repositories/key.repository.d.ts +60 -0
  56. package/dist/repositories/key.repository.d.ts.map +1 -0
  57. package/dist/repositories/key.repository.js +126 -0
  58. package/dist/repositories/key.repository.js.map +1 -0
  59. package/dist/repositories/project.repository.d.ts +42 -0
  60. package/dist/repositories/project.repository.d.ts.map +1 -0
  61. package/dist/repositories/project.repository.js +82 -0
  62. package/dist/repositories/project.repository.js.map +1 -0
  63. package/dist/repositories/user.repository.d.ts +58 -0
  64. package/dist/repositories/user.repository.d.ts.map +1 -0
  65. package/dist/repositories/user.repository.js +102 -0
  66. package/dist/repositories/user.repository.js.map +1 -0
  67. package/dist/services/audit.service.d.ts +63 -0
  68. package/dist/services/audit.service.d.ts.map +1 -0
  69. package/dist/services/audit.service.js +113 -0
  70. package/dist/services/audit.service.js.map +1 -0
  71. package/dist/services/auth.service.d.ts +39 -0
  72. package/dist/services/auth.service.d.ts.map +1 -0
  73. package/dist/services/auth.service.js +179 -0
  74. package/dist/services/auth.service.js.map +1 -0
  75. package/dist/services/key.service.d.ts +47 -0
  76. package/dist/services/key.service.d.ts.map +1 -0
  77. package/dist/services/key.service.js +135 -0
  78. package/dist/services/key.service.js.map +1 -0
  79. package/dist/services/permission.service.d.ts +37 -0
  80. package/dist/services/permission.service.d.ts.map +1 -0
  81. package/dist/services/permission.service.js +140 -0
  82. package/dist/services/permission.service.js.map +1 -0
  83. package/dist/services/project.service.d.ts +37 -0
  84. package/dist/services/project.service.d.ts.map +1 -0
  85. package/dist/services/project.service.js +96 -0
  86. package/dist/services/project.service.js.map +1 -0
  87. package/dist/types/audit.types.d.ts +122 -0
  88. package/dist/types/audit.types.d.ts.map +1 -0
  89. package/dist/types/audit.types.js +55 -0
  90. package/dist/types/audit.types.js.map +1 -0
  91. package/dist/types/client.types.d.ts +47 -0
  92. package/dist/types/client.types.d.ts.map +1 -0
  93. package/dist/types/client.types.js +6 -0
  94. package/dist/types/client.types.js.map +1 -0
  95. package/dist/types/crypto.types.d.ts +48 -0
  96. package/dist/types/crypto.types.d.ts.map +1 -0
  97. package/dist/types/crypto.types.js +6 -0
  98. package/dist/types/crypto.types.js.map +1 -0
  99. package/dist/types/index.d.ts +86 -0
  100. package/dist/types/index.d.ts.map +1 -0
  101. package/dist/types/index.js +92 -0
  102. package/dist/types/index.js.map +1 -0
  103. package/dist/types/key.types.d.ts +125 -0
  104. package/dist/types/key.types.d.ts.map +1 -0
  105. package/dist/types/key.types.js +28 -0
  106. package/dist/types/key.types.js.map +1 -0
  107. package/dist/types/project.types.d.ts +57 -0
  108. package/dist/types/project.types.d.ts.map +1 -0
  109. package/dist/types/project.types.js +16 -0
  110. package/dist/types/project.types.js.map +1 -0
  111. package/dist/types/user.types.d.ts +110 -0
  112. package/dist/types/user.types.d.ts.map +1 -0
  113. package/dist/types/user.types.js +49 -0
  114. package/dist/types/user.types.js.map +1 -0
  115. package/dist/utils/config-loader.d.ts +64 -0
  116. package/dist/utils/config-loader.d.ts.map +1 -0
  117. package/dist/utils/config-loader.js +126 -0
  118. package/dist/utils/config-loader.js.map +1 -0
  119. package/dist/utils/constants.d.ts +62 -0
  120. package/dist/utils/constants.d.ts.map +1 -0
  121. package/dist/utils/constants.js +119 -0
  122. package/dist/utils/constants.js.map +1 -0
  123. package/dist/utils/error-handler.d.ts +48 -0
  124. package/dist/utils/error-handler.d.ts.map +1 -0
  125. package/dist/utils/error-handler.js +109 -0
  126. package/dist/utils/error-handler.js.map +1 -0
  127. package/package.json +53 -0
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * 基础仓储类
4
+ * 提供通用的数据库操作
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BaseRepository = void 0;
8
+ /**
9
+ * 基础仓储类
10
+ */
11
+ class BaseRepository {
12
+ db;
13
+ collectionName;
14
+ constructor(db, collectionName) {
15
+ this.db = db;
16
+ this.collectionName = collectionName;
17
+ }
18
+ /**
19
+ * 获取集合
20
+ */
21
+ getCollection() {
22
+ return this.db.collection(this.collectionName);
23
+ }
24
+ /**
25
+ * 创建索引
26
+ */
27
+ async createIndexes(indexes) {
28
+ const collection = this.getCollection();
29
+ for (const index of indexes) {
30
+ await collection.createIndex(index);
31
+ }
32
+ }
33
+ /**
34
+ * 插入单个文档
35
+ */
36
+ async insertOne(document) {
37
+ const collection = this.getCollection();
38
+ const result = await collection.insertOne(document);
39
+ return { ...document, _id: result.insertedId.toString() };
40
+ }
41
+ /**
42
+ * 查询单个文档
43
+ */
44
+ async findOne(filter) {
45
+ const collection = this.getCollection();
46
+ return await collection.findOne(filter);
47
+ }
48
+ /**
49
+ * 查询多个文档
50
+ */
51
+ async findMany(filter = {}, options) {
52
+ const collection = this.getCollection();
53
+ let query = collection.find(filter);
54
+ if (options?.sort) {
55
+ query = query.sort(options.sort);
56
+ }
57
+ if (options?.skip) {
58
+ query = query.skip(options.skip);
59
+ }
60
+ if (options?.limit) {
61
+ query = query.limit(options.limit);
62
+ }
63
+ return await query.toArray();
64
+ }
65
+ /**
66
+ * 更新单个文档
67
+ */
68
+ async updateOne(filter, update) {
69
+ const collection = this.getCollection();
70
+ const result = await collection.updateOne(filter, update);
71
+ return result.modifiedCount > 0;
72
+ }
73
+ /**
74
+ * 删除单个文档
75
+ */
76
+ async deleteOne(filter) {
77
+ const collection = this.getCollection();
78
+ const result = await collection.deleteOne(filter);
79
+ return result.deletedCount > 0;
80
+ }
81
+ /**
82
+ * 统计文档数量
83
+ */
84
+ async count(filter = {}) {
85
+ const collection = this.getCollection();
86
+ return await collection.countDocuments(filter);
87
+ }
88
+ /**
89
+ * 检查文档是否存在
90
+ */
91
+ async exists(filter) {
92
+ const count = await this.count(filter);
93
+ return count > 0;
94
+ }
95
+ }
96
+ exports.BaseRepository = BaseRepository;
97
+ //# sourceMappingURL=base.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.repository.js","sourceRoot":"","sources":["../../src/repositories/base.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * 密钥仓储
3
+ * 负责密钥的数据访问
4
+ */
5
+ import { BaseRepository } from './base.repository';
6
+ import { Key, KeyFilters } from '../types';
7
+ export declare class KeyRepository extends BaseRepository<Key> {
8
+ constructor(db: any);
9
+ /**
10
+ * 初始化索引
11
+ */
12
+ private initializeIndexes;
13
+ /**
14
+ * 根据密钥ID查找
15
+ */
16
+ findByKeyId(keyId: string): Promise<Key | null>;
17
+ /**
18
+ * 根据密钥ID查找,如果不存在则抛出错误
19
+ */
20
+ getByKeyId(keyId: string): Promise<Key>;
21
+ /**
22
+ * 根据项目ID和密钥名称查找
23
+ */
24
+ findByProjectAndName(projectId: string, keyName: string): Promise<Key | null>;
25
+ /**
26
+ * 查询项目的所有密钥
27
+ */
28
+ findByProjectId(projectId: string, filters?: KeyFilters, options?: {
29
+ page?: number;
30
+ limit?: number;
31
+ }): Promise<{
32
+ keys: Key[];
33
+ total: number;
34
+ }>;
35
+ /**
36
+ * 更新密钥
37
+ */
38
+ updateKey(keyId: string, updates: Partial<Key>): Promise<boolean>;
39
+ /**
40
+ * 删除密钥(软删除)
41
+ */
42
+ softDeleteKey(keyId: string): Promise<boolean>;
43
+ /**
44
+ * 永久删除密钥
45
+ */
46
+ hardDeleteKey(keyId: string): Promise<boolean>;
47
+ /**
48
+ * 批量查询密钥
49
+ */
50
+ findByKeyIds(keyIds: string[]): Promise<Key[]>;
51
+ /**
52
+ * 更新密钥最后访问时间
53
+ */
54
+ updateLastAccessed(keyId: string): Promise<boolean>;
55
+ /**
56
+ * 查询过期密钥
57
+ */
58
+ findExpiredKeys(projectId?: string): Promise<Key[]>;
59
+ }
60
+ //# sourceMappingURL=key.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/key.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAsB,MAAM,UAAU,CAAC;AAG/D,qBAAa,aAAc,SAAQ,cAAc,CAAC,GAAG,CAAC;gBACxC,EAAE,EAAE,GAAG;IAKnB;;OAEG;YACW,iBAAiB;IAc/B;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAIrD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ7C;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAInF;;OAEG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,UAAU,EACpB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAiC1C;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAOvE;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpD;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAIpD;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOzD;;OAEG;IACG,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAY1D"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * 密钥仓储
4
+ * 负责密钥的数据访问
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.KeyRepository = void 0;
8
+ const base_repository_1 = require("./base.repository");
9
+ const types_1 = require("../types");
10
+ const types_2 = require("../types");
11
+ class KeyRepository extends base_repository_1.BaseRepository {
12
+ constructor(db) {
13
+ super(db, 'keys');
14
+ this.initializeIndexes();
15
+ }
16
+ /**
17
+ * 初始化索引
18
+ */
19
+ async initializeIndexes() {
20
+ await this.createIndexes([
21
+ { keyId: 1 },
22
+ { projectId: 1 },
23
+ { keyName: 1 },
24
+ { projectId: 1, keyName: 1 },
25
+ { keyType: 1 },
26
+ { status: 1 },
27
+ { tags: 1 },
28
+ { expiresAt: 1 },
29
+ { createdAt: -1 },
30
+ ]);
31
+ }
32
+ /**
33
+ * 根据密钥ID查找
34
+ */
35
+ async findByKeyId(keyId) {
36
+ return await this.findOne({ keyId });
37
+ }
38
+ /**
39
+ * 根据密钥ID查找,如果不存在则抛出错误
40
+ */
41
+ async getByKeyId(keyId) {
42
+ const key = await this.findByKeyId(keyId);
43
+ if (!key) {
44
+ throw new types_2.KeyNotFoundError(keyId);
45
+ }
46
+ return key;
47
+ }
48
+ /**
49
+ * 根据项目ID和密钥名称查找
50
+ */
51
+ async findByProjectAndName(projectId, keyName) {
52
+ return await this.findOne({ projectId, keyName });
53
+ }
54
+ /**
55
+ * 查询项目的所有密钥
56
+ */
57
+ async findByProjectId(projectId, filters, options) {
58
+ const query = { projectId };
59
+ if (filters?.keyType) {
60
+ query.keyType = filters.keyType;
61
+ }
62
+ if (filters?.status) {
63
+ query.status = filters.status;
64
+ }
65
+ if (filters?.tags && filters.tags.length > 0) {
66
+ query.tags = { $in: filters.tags };
67
+ }
68
+ if (filters?.search) {
69
+ query.keyName = { $regex: filters.search, $options: 'i' };
70
+ }
71
+ const total = await this.count(query);
72
+ const skip = options?.page && options?.limit ? (options.page - 1) * options.limit : 0;
73
+ const limit = options?.limit || 100;
74
+ const keys = await this.findMany(query, {
75
+ sort: { createdAt: -1 },
76
+ skip,
77
+ limit,
78
+ });
79
+ return { keys, total };
80
+ }
81
+ /**
82
+ * 更新密钥
83
+ */
84
+ async updateKey(keyId, updates) {
85
+ return await this.updateOne({ keyId }, { $set: { ...updates, updatedAt: new Date() } });
86
+ }
87
+ /**
88
+ * 删除密钥(软删除)
89
+ */
90
+ async softDeleteKey(keyId) {
91
+ return await this.updateOne({ keyId }, { $set: { status: types_1.KeyStatus.DELETED, updatedAt: new Date() } });
92
+ }
93
+ /**
94
+ * 永久删除密钥
95
+ */
96
+ async hardDeleteKey(keyId) {
97
+ return await this.deleteOne({ keyId });
98
+ }
99
+ /**
100
+ * 批量查询密钥
101
+ */
102
+ async findByKeyIds(keyIds) {
103
+ return await this.findMany({ keyId: { $in: keyIds } });
104
+ }
105
+ /**
106
+ * 更新密钥最后访问时间
107
+ */
108
+ async updateLastAccessed(keyId) {
109
+ return await this.updateOne({ keyId }, { $set: { lastAccessedAt: new Date() } });
110
+ }
111
+ /**
112
+ * 查询过期密钥
113
+ */
114
+ async findExpiredKeys(projectId) {
115
+ const query = {
116
+ expiresAt: { $lt: new Date() },
117
+ status: { $ne: types_1.KeyStatus.DELETED },
118
+ };
119
+ if (projectId) {
120
+ query.projectId = projectId;
121
+ }
122
+ return await this.findMany(query);
123
+ }
124
+ }
125
+ exports.KeyRepository = KeyRepository;
126
+ //# sourceMappingURL=key.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.repository.js","sourceRoot":"","sources":["../../src/repositories/key.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 项目仓储
3
+ * 负责项目的数据访问
4
+ */
5
+ import { BaseRepository } from './base.repository';
6
+ import { Project, ProjectFilter } from '../types';
7
+ export declare class ProjectRepository extends BaseRepository<Project> {
8
+ constructor(db: any);
9
+ /**
10
+ * 初始化索引
11
+ */
12
+ private initializeIndexes;
13
+ /**
14
+ * 根据项目ID查找
15
+ */
16
+ findByProjectId(projectId: string): Promise<Project | null>;
17
+ /**
18
+ * 根据项目ID查找,如果不存在则抛出错误
19
+ */
20
+ getByProjectId(projectId: string): Promise<Project>;
21
+ /**
22
+ * 根据项目名称查找
23
+ */
24
+ findByProjectName(projectName: string): Promise<Project | null>;
25
+ /**
26
+ * 查询项目列表
27
+ */
28
+ findProjects(filter?: ProjectFilter): Promise<Project[]>;
29
+ /**
30
+ * 更新项目
31
+ */
32
+ updateProject(projectId: string, updates: Partial<Project>): Promise<boolean>;
33
+ /**
34
+ * 删除项目(软删除)
35
+ */
36
+ softDeleteProject(projectId: string): Promise<boolean>;
37
+ /**
38
+ * 永久删除项目
39
+ */
40
+ hardDeleteProject(projectId: string): Promise<boolean>;
41
+ }
42
+ //# sourceMappingURL=project.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/project.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AAGjE,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,OAAO,CAAC;gBAChD,EAAE,EAAE,GAAG;IAKnB;;OAEG;YACW,iBAAiB;IAS/B;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAIjE;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzD;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAIrE;;OAEG;IACG,YAAY,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAc9D;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAOnF;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO5D;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7D"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /**
3
+ * 项目仓储
4
+ * 负责项目的数据访问
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ProjectRepository = void 0;
8
+ const base_repository_1 = require("./base.repository");
9
+ const types_1 = require("../types");
10
+ const types_2 = require("../types");
11
+ class ProjectRepository extends base_repository_1.BaseRepository {
12
+ constructor(db) {
13
+ super(db, 'projects');
14
+ this.initializeIndexes();
15
+ }
16
+ /**
17
+ * 初始化索引
18
+ */
19
+ async initializeIndexes() {
20
+ await this.createIndexes([
21
+ { projectId: 1 },
22
+ { projectName: 1 },
23
+ { status: 1 },
24
+ { createdAt: -1 },
25
+ ]);
26
+ }
27
+ /**
28
+ * 根据项目ID查找
29
+ */
30
+ async findByProjectId(projectId) {
31
+ return await this.findOne({ projectId });
32
+ }
33
+ /**
34
+ * 根据项目ID查找,如果不存在则抛出错误
35
+ */
36
+ async getByProjectId(projectId) {
37
+ const project = await this.findByProjectId(projectId);
38
+ if (!project) {
39
+ throw new types_2.ProjectNotFoundError(projectId);
40
+ }
41
+ return project;
42
+ }
43
+ /**
44
+ * 根据项目名称查找
45
+ */
46
+ async findByProjectName(projectName) {
47
+ return await this.findOne({ projectName });
48
+ }
49
+ /**
50
+ * 查询项目列表
51
+ */
52
+ async findProjects(filter) {
53
+ const query = {};
54
+ if (filter?.status) {
55
+ query.status = filter.status;
56
+ }
57
+ if (filter?.projectName) {
58
+ query.projectName = { $regex: filter.projectName, $options: 'i' };
59
+ }
60
+ return await this.findMany(query, { sort: { createdAt: -1 } });
61
+ }
62
+ /**
63
+ * 更新项目
64
+ */
65
+ async updateProject(projectId, updates) {
66
+ return await this.updateOne({ projectId }, { $set: { ...updates, updatedAt: new Date() } });
67
+ }
68
+ /**
69
+ * 删除项目(软删除)
70
+ */
71
+ async softDeleteProject(projectId) {
72
+ return await this.updateOne({ projectId }, { $set: { status: types_1.ProjectStatus.DELETED, updatedAt: new Date() } });
73
+ }
74
+ /**
75
+ * 永久删除项目
76
+ */
77
+ async hardDeleteProject(projectId) {
78
+ return await this.deleteOne({ projectId });
79
+ }
80
+ }
81
+ exports.ProjectRepository = ProjectRepository;
82
+ //# sourceMappingURL=project.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.repository.js","sourceRoot":"","sources":["../../src/repositories/project.repository.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uDAAmD;AACnD,oCAAiE;AACjE,oCAAgD;AAEhD,MAAa,iBAAkB,SAAQ,gCAAuB;IAC5D,YAAY,EAAO;QACjB,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,MAAM,IAAI,CAAC,aAAa,CAAC;YACvB,EAAE,SAAS,EAAE,CAAC,EAAE;YAChB,EAAE,WAAW,EAAE,CAAC,EAAE;YAClB,EAAE,MAAM,EAAE,CAAC,EAAE;YACb,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAS,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,4BAAoB,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAS,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,MAAsB;QACvC,MAAM,KAAK,GAAQ,EAAE,CAAC;QAEtB,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,CAAC;QAED,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;YACxB,KAAK,CAAC,WAAW,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACpE,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAyB;QAC9D,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,EAAE,SAAS,EAAS,EACpB,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAChD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,EAAE,SAAS,EAAS,EACpB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,qBAAa,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CACnE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAtFD,8CAsFC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 用户仓储
3
+ * 负责用户的数据访问
4
+ */
5
+ import { BaseRepository } from './base.repository';
6
+ import { User } from '../types';
7
+ export declare class UserRepository extends BaseRepository<User> {
8
+ constructor(db: any);
9
+ /**
10
+ * 初始化索引
11
+ */
12
+ private initializeIndexes;
13
+ /**
14
+ * 根据用户ID查找
15
+ */
16
+ findByUserId(userId: string): Promise<User | null>;
17
+ /**
18
+ * 根据用户ID查找,如果不存在则抛出错误
19
+ */
20
+ getByUserId(userId: string): Promise<User>;
21
+ /**
22
+ * 根据项目ID和用户名查找
23
+ */
24
+ findByProjectAndUsername(projectId: string, username: string): Promise<User | null>;
25
+ /**
26
+ * 查询项目的所有用户
27
+ */
28
+ findByProjectId(projectId: string): Promise<User[]>;
29
+ /**
30
+ * 根据API密钥哈希查找用户
31
+ */
32
+ findByApiKeyHash(apiKeyHash: string): Promise<User | null>;
33
+ /**
34
+ * 更新用户
35
+ */
36
+ updateUser(userId: string, updates: Partial<User>): Promise<boolean>;
37
+ /**
38
+ * 更新最后登录时间
39
+ */
40
+ updateLastLogin(userId: string): Promise<boolean>;
41
+ /**
42
+ * 锁定用户
43
+ */
44
+ lockUser(userId: string): Promise<boolean>;
45
+ /**
46
+ * 激活用户
47
+ */
48
+ activateUser(userId: string): Promise<boolean>;
49
+ /**
50
+ * 删除用户(软删除)
51
+ */
52
+ softDeleteUser(userId: string): Promise<boolean>;
53
+ /**
54
+ * 永久删除用户
55
+ */
56
+ hardDeleteUser(userId: string): Promise<boolean>;
57
+ }
58
+ //# sourceMappingURL=user.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/user.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAc,MAAM,UAAU,CAAC;AAG5C,qBAAa,cAAe,SAAQ,cAAc,CAAC,IAAI,CAAC;gBAC1C,EAAE,EAAE,GAAG;IAKnB;;OAEG;YACW,iBAAiB;IAY/B;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIxD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD;;OAEG;IACG,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIzF;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAIzD;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIhE;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAO1E;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOvD;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOhD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGvD"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * 用户仓储
4
+ * 负责用户的数据访问
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.UserRepository = void 0;
8
+ const base_repository_1 = require("./base.repository");
9
+ const types_1 = require("../types");
10
+ const types_2 = require("../types");
11
+ class UserRepository extends base_repository_1.BaseRepository {
12
+ constructor(db) {
13
+ super(db, 'users');
14
+ this.initializeIndexes();
15
+ }
16
+ /**
17
+ * 初始化索引
18
+ */
19
+ async initializeIndexes() {
20
+ await this.createIndexes([
21
+ { userId: 1 },
22
+ { projectId: 1 },
23
+ { username: 1 },
24
+ { projectId: 1, username: 1 },
25
+ { status: 1 },
26
+ { apiKeyHash: 1 },
27
+ { createdAt: -1 },
28
+ ]);
29
+ }
30
+ /**
31
+ * 根据用户ID查找
32
+ */
33
+ async findByUserId(userId) {
34
+ return await this.findOne({ userId });
35
+ }
36
+ /**
37
+ * 根据用户ID查找,如果不存在则抛出错误
38
+ */
39
+ async getByUserId(userId) {
40
+ const user = await this.findByUserId(userId);
41
+ if (!user) {
42
+ throw new types_2.UserNotFoundError(userId);
43
+ }
44
+ return user;
45
+ }
46
+ /**
47
+ * 根据项目ID和用户名查找
48
+ */
49
+ async findByProjectAndUsername(projectId, username) {
50
+ return await this.findOne({ projectId, username });
51
+ }
52
+ /**
53
+ * 查询项目的所有用户
54
+ */
55
+ async findByProjectId(projectId) {
56
+ return await this.findMany({ projectId }, { sort: { createdAt: -1 } });
57
+ }
58
+ /**
59
+ * 根据API密钥哈希查找用户
60
+ */
61
+ async findByApiKeyHash(apiKeyHash) {
62
+ return await this.findOne({ apiKeyHash });
63
+ }
64
+ /**
65
+ * 更新用户
66
+ */
67
+ async updateUser(userId, updates) {
68
+ return await this.updateOne({ userId }, { $set: { ...updates, updatedAt: new Date() } });
69
+ }
70
+ /**
71
+ * 更新最后登录时间
72
+ */
73
+ async updateLastLogin(userId) {
74
+ return await this.updateOne({ userId }, { $set: { lastLoginAt: new Date() } });
75
+ }
76
+ /**
77
+ * 锁定用户
78
+ */
79
+ async lockUser(userId) {
80
+ return await this.updateOne({ userId }, { $set: { status: types_1.UserStatus.LOCKED, updatedAt: new Date() } });
81
+ }
82
+ /**
83
+ * 激活用户
84
+ */
85
+ async activateUser(userId) {
86
+ return await this.updateOne({ userId }, { $set: { status: types_1.UserStatus.ACTIVE, updatedAt: new Date() } });
87
+ }
88
+ /**
89
+ * 删除用户(软删除)
90
+ */
91
+ async softDeleteUser(userId) {
92
+ return await this.updateOne({ userId }, { $set: { status: types_1.UserStatus.INACTIVE, updatedAt: new Date() } });
93
+ }
94
+ /**
95
+ * 永久删除用户
96
+ */
97
+ async hardDeleteUser(userId) {
98
+ return await this.deleteOne({ userId });
99
+ }
100
+ }
101
+ exports.UserRepository = UserRepository;
102
+ //# sourceMappingURL=user.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.repository.js","sourceRoot":"","sources":["../../src/repositories/user.repository.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uDAAmD;AACnD,oCAA4C;AAC5C,oCAA6C;AAE7C,MAAa,cAAe,SAAQ,gCAAoB;IACtD,YAAY,EAAO;QACjB,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,MAAM,IAAI,CAAC,aAAa,CAAC;YACvB,EAAE,MAAM,EAAE,CAAC,EAAE;YACb,EAAE,SAAS,EAAE,CAAC,EAAE;YAChB,EAAE,QAAQ,EAAE,CAAC,EAAE;YACf,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC7B,EAAE,MAAM,EAAE,CAAC,EAAE;YACb,EAAE,UAAU,EAAE,CAAC,EAAE;YACjB,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAS,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,yBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,wBAAwB,CAAC,SAAiB,EAAE,QAAgB;QAChE,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAS,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAS,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,UAAkB;QACvC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,EAAS,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,OAAsB;QACrD,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,EAAE,MAAM,EAAS,EACjB,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAChD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,EAAE,MAAM,EAAS,EACjB,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,EAAE,MAAM,EAAS,EACjB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,kBAAU,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,EAAE,MAAM,EAAS,EACjB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,kBAAU,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,OAAO,MAAM,IAAI,CAAC,SAAS,CACzB,EAAE,MAAM,EAAS,EACjB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,kBAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CACjE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAS,CAAC,CAAC;IACjD,CAAC;CACF;AApHD,wCAoHC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * 审计服务
3
+ * 负责记录和查询审计日志
4
+ */
5
+ import { AuditRepository } from '../repositories/audit.repository';
6
+ import { AuditLog, AuditQuery, AuditAction, ResourceType } from '../types';
7
+ export declare class AuditService {
8
+ private auditRepo;
9
+ constructor(auditRepo: AuditRepository);
10
+ /**
11
+ * 记录审计日志
12
+ */
13
+ log(data: {
14
+ projectId: string;
15
+ userId?: string;
16
+ action: AuditAction;
17
+ resourceType: ResourceType;
18
+ resourceId: string;
19
+ details: {
20
+ keyName?: string;
21
+ keyType?: string;
22
+ ipAddress?: string;
23
+ userAgent?: string;
24
+ success: boolean;
25
+ errorMessage?: string;
26
+ [key: string]: any;
27
+ };
28
+ }): Promise<void>;
29
+ /**
30
+ * 查询审计日志
31
+ */
32
+ getAuditLogs(projectId: string, query: AuditQuery): Promise<{
33
+ logs: AuditLog[];
34
+ total: number;
35
+ page: number;
36
+ limit: number;
37
+ }>;
38
+ /**
39
+ * 获取最近的审计日志
40
+ */
41
+ getRecentLogs(projectId: string, limit?: number): Promise<AuditLog[]>;
42
+ /**
43
+ * 统计失败登录次数
44
+ */
45
+ countFailedLogins(projectId: string, userId?: string, since?: Date): Promise<number>;
46
+ /**
47
+ * 记录项目创建
48
+ */
49
+ logProjectCreated(projectId: string, userId: string, projectName: string, success: boolean): Promise<void>;
50
+ /**
51
+ * 记录密钥创建
52
+ */
53
+ logKeyCreated(projectId: string, userId: string, keyId: string, keyName: string, keyType: string, success: boolean): Promise<void>;
54
+ /**
55
+ * 记录密钥读取
56
+ */
57
+ logKeyRead(projectId: string, userId: string, keyId: string, keyName: string, success: boolean): Promise<void>;
58
+ /**
59
+ * 记录密钥删除
60
+ */
61
+ logKeyDeleted(projectId: string, userId: string, keyId: string, keyName: string, success: boolean): Promise<void>;
62
+ }
63
+ //# sourceMappingURL=audit.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.service.d.ts","sourceRoot":"","sources":["../../src/services/audit.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG3E,qBAAa,YAAY;IACX,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,eAAe;IAE9C;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,WAAW,CAAC;QACpB,YAAY,EAAE,YAAY,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE;YACP,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,EAAE,OAAO,CAAC;YACjB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;SACpB,CAAC;KACH,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjB;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC;QAChE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAUF;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIhF;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1F;;OAEG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;CAajB"}