@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,120 @@
1
+ "use strict";
2
+ /**
3
+ * 密钥数据模型
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createKey = createKey;
7
+ exports.validateKey = validateKey;
8
+ exports.updateKey = updateKey;
9
+ exports.toKeyValue = toKeyValue;
10
+ exports.isKeyExpired = isKeyExpired;
11
+ exports.isKeyAccessible = isKeyAccessible;
12
+ const types_1 = require("../types");
13
+ const constants_1 = require("../utils/constants");
14
+ /**
15
+ * 创建新密钥
16
+ */
17
+ function createKey(projectId, keyData, encryptedData, createdBy) {
18
+ const now = new Date();
19
+ return {
20
+ keyId: (0, constants_1.generateId)('key'),
21
+ projectId,
22
+ keyName: keyData.keyName,
23
+ keyType: keyData.keyType,
24
+ encryptedValue: encryptedData.encrypted,
25
+ iv: encryptedData.iv,
26
+ authTag: encryptedData.authTag,
27
+ version: 1,
28
+ tags: keyData.tags || [],
29
+ description: keyData.description,
30
+ createdBy,
31
+ createdAt: now,
32
+ updatedAt: now,
33
+ expiresAt: keyData.expiresAt,
34
+ status: types_1.KeyStatus.ACTIVE,
35
+ };
36
+ }
37
+ /**
38
+ * 验证密钥数据
39
+ */
40
+ function validateKey(keyData) {
41
+ const errors = [];
42
+ if (!keyData.keyName || keyData.keyName.trim().length === 0) {
43
+ errors.push('Key name is required');
44
+ }
45
+ if (keyData.keyName && keyData.keyName.length > 100) {
46
+ errors.push('Key name must be less than 100 characters');
47
+ }
48
+ if (!keyData.keyType) {
49
+ errors.push('Key type is required');
50
+ }
51
+ if (!keyData.value || keyData.value.trim().length === 0) {
52
+ errors.push('Key value is required');
53
+ }
54
+ if (keyData.value && keyData.value.length > 2000) {
55
+ errors.push('Key value must be less than 2000 characters');
56
+ }
57
+ if (keyData.expiresAt && keyData.expiresAt < new Date()) {
58
+ errors.push('Expiration date must be in the future');
59
+ }
60
+ return {
61
+ valid: errors.length === 0,
62
+ errors,
63
+ };
64
+ }
65
+ /**
66
+ * 更新密钥
67
+ */
68
+ function updateKey(key, updates, newEncryptedData) {
69
+ const updatedKey = { ...key };
70
+ if (newEncryptedData) {
71
+ updatedKey.encryptedValue = newEncryptedData.encrypted;
72
+ updatedKey.iv = newEncryptedData.iv;
73
+ updatedKey.authTag = newEncryptedData.authTag;
74
+ updatedKey.version += 1;
75
+ updatedKey.lastRotatedAt = new Date();
76
+ }
77
+ if (updates.tags !== undefined) {
78
+ updatedKey.tags = updates.tags;
79
+ }
80
+ if (updates.description !== undefined) {
81
+ updatedKey.description = updates.description;
82
+ }
83
+ if (updates.expiresAt !== undefined) {
84
+ updatedKey.expiresAt = updates.expiresAt;
85
+ }
86
+ if (updates.status !== undefined) {
87
+ updatedKey.status = updates.status;
88
+ }
89
+ updatedKey.updatedAt = new Date();
90
+ return updatedKey;
91
+ }
92
+ /**
93
+ * 转换密钥为KeyValue(包含解密值)
94
+ */
95
+ function toKeyValue(key, decryptedValue) {
96
+ const { encryptedValue, iv, authTag, ...keyValue } = key;
97
+ return {
98
+ ...keyValue,
99
+ value: decryptedValue,
100
+ };
101
+ }
102
+ /**
103
+ * 检查密钥是否已过期
104
+ */
105
+ function isKeyExpired(key) {
106
+ return key.expiresAt !== undefined && key.expiresAt < new Date();
107
+ }
108
+ /**
109
+ * 检查密钥是否可用
110
+ */
111
+ function isKeyAccessible(key) {
112
+ if (key.status !== types_1.KeyStatus.ACTIVE) {
113
+ return false;
114
+ }
115
+ if (isKeyExpired(key)) {
116
+ return false;
117
+ }
118
+ return true;
119
+ }
120
+ //# sourceMappingURL=key.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.model.js","sourceRoot":"","sources":["../../src/models/key.model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 项目数据模型
3
+ */
4
+ import { Project, CreateProjectOptions } from '../types';
5
+ /**
6
+ * 创建新项目
7
+ */
8
+ export declare function createProject(options: CreateProjectOptions, masterKeyEncrypted: string, masterKeyHash: string, salt: string): Project;
9
+ /**
10
+ * 验证项目数据
11
+ */
12
+ export declare function validateProject(project: Partial<Project>): {
13
+ valid: boolean;
14
+ errors: string[];
15
+ };
16
+ /**
17
+ * 转换项目为安全格式(不包含敏感信息)
18
+ */
19
+ export declare function toSafeProject(project: Project): Omit<Project, 'masterKeyHash' | 'masterKeyEncrypted' | 'salt'>;
20
+ //# sourceMappingURL=project.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.model.d.ts","sourceRoot":"","sources":["../../src/models/project.model.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAiB,MAAM,UAAU,CAAC;AAGxE;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAcrI;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAmB/F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,oBAAoB,GAAG,MAAM,CAAC,CAG9G"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * 项目数据模型
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createProject = createProject;
7
+ exports.validateProject = validateProject;
8
+ exports.toSafeProject = toSafeProject;
9
+ const types_1 = require("../types");
10
+ const constants_1 = require("../utils/constants");
11
+ /**
12
+ * 创建新项目
13
+ */
14
+ function createProject(options, masterKeyEncrypted, masterKeyHash, salt) {
15
+ const now = new Date();
16
+ return {
17
+ projectId: (0, constants_1.generateId)('proj'),
18
+ projectName: options.projectName,
19
+ masterKeyHash,
20
+ masterKeyEncrypted,
21
+ salt,
22
+ createdAt: now,
23
+ updatedAt: now,
24
+ status: types_1.ProjectStatus.ACTIVE,
25
+ metadata: options.metadata,
26
+ };
27
+ }
28
+ /**
29
+ * 验证项目数据
30
+ */
31
+ function validateProject(project) {
32
+ const errors = [];
33
+ if (!project.projectName || project.projectName.trim().length === 0) {
34
+ errors.push('Project name is required');
35
+ }
36
+ if (project.projectName && project.projectName.length > 100) {
37
+ errors.push('Project name must be less than 100 characters');
38
+ }
39
+ if (!project.projectId || project.projectId.trim().length === 0) {
40
+ errors.push('Project ID is required');
41
+ }
42
+ return {
43
+ valid: errors.length === 0,
44
+ errors,
45
+ };
46
+ }
47
+ /**
48
+ * 转换项目为安全格式(不包含敏感信息)
49
+ */
50
+ function toSafeProject(project) {
51
+ const { masterKeyHash, masterKeyEncrypted, salt, ...safeProject } = project;
52
+ return safeProject;
53
+ }
54
+ //# sourceMappingURL=project.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.model.js","sourceRoot":"","sources":["../../src/models/project.model.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAQH,sCAcC;AAKD,0CAmBC;AAKD,sCAGC;AApDD,oCAAwE;AACxE,kDAAgD;AAEhD;;GAEG;AACH,SAAgB,aAAa,CAAC,OAA6B,EAAE,kBAA0B,EAAE,aAAqB,EAAE,IAAY;IAC1H,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,OAAO;QACL,SAAS,EAAE,IAAA,sBAAU,EAAC,MAAM,CAAC;QAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,aAAa;QACb,kBAAkB;QAClB,IAAI;QACJ,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,qBAAa,CAAC,MAAM;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,OAAyB;IACvD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,OAAgB;IAC5C,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAC5E,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * 用户数据模型
3
+ */
4
+ import { User, CreateUserData, Role } from '../types';
5
+ /**
6
+ * 创建新用户
7
+ */
8
+ export declare function createUser(projectId: string, userData: CreateUserData, passwordHash: string, apiKeyHash?: string): User;
9
+ /**
10
+ * 验证用户数据
11
+ */
12
+ export declare function validateUser(userData: Partial<CreateUserData>): {
13
+ valid: boolean;
14
+ errors: string[];
15
+ };
16
+ /**
17
+ * 更新用户最后登录时间
18
+ */
19
+ export declare function updateLastLogin(user: User): User;
20
+ /**
21
+ * 锁定用户
22
+ */
23
+ export declare function lockUser(user: User): User;
24
+ /**
25
+ * 激活用户
26
+ */
27
+ export declare function activateUser(user: User): User;
28
+ /**
29
+ * 添加角色
30
+ */
31
+ export declare function addRole(user: User, role: Role): User;
32
+ /**
33
+ * 移除角色
34
+ */
35
+ export declare function removeRole(user: User, role: Role): User;
36
+ /**
37
+ * 添加权限
38
+ */
39
+ export declare function addPermission(user: User, permission: string): User;
40
+ /**
41
+ * 移除权限
42
+ */
43
+ export declare function removePermission(user: User, permission: string): User;
44
+ /**
45
+ * 转换用户为安全格式(不包含敏感信息)
46
+ */
47
+ export declare function toSafeUser(user: User): Omit<User, 'passwordHash' | 'apiKeyHash'>;
48
+ //# sourceMappingURL=user.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.model.d.ts","sourceRoot":"","sources":["../../src/models/user.model.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAc,MAAM,UAAU,CAAC;AAGlE;;GAEG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAuBpG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAMhD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAMzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAM7C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAUpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAMvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAUlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAMrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAAC,CAGhF"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /**
3
+ * 用户数据模型
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createUser = createUser;
7
+ exports.validateUser = validateUser;
8
+ exports.updateLastLogin = updateLastLogin;
9
+ exports.lockUser = lockUser;
10
+ exports.activateUser = activateUser;
11
+ exports.addRole = addRole;
12
+ exports.removeRole = removeRole;
13
+ exports.addPermission = addPermission;
14
+ exports.removePermission = removePermission;
15
+ exports.toSafeUser = toSafeUser;
16
+ const types_1 = require("../types");
17
+ const constants_1 = require("../utils/constants");
18
+ /**
19
+ * 创建新用户
20
+ */
21
+ function createUser(projectId, userData, passwordHash, apiKeyHash) {
22
+ const now = new Date();
23
+ return {
24
+ userId: (0, constants_1.generateId)('user'),
25
+ projectId,
26
+ username: userData.username,
27
+ passwordHash,
28
+ roles: userData.roles || [],
29
+ permissions: userData.permissions || [],
30
+ apiKeyHash,
31
+ createdAt: now,
32
+ updatedAt: now,
33
+ status: types_1.UserStatus.ACTIVE,
34
+ };
35
+ }
36
+ /**
37
+ * 验证用户数据
38
+ */
39
+ function validateUser(userData) {
40
+ const errors = [];
41
+ if (!userData.username || userData.username.trim().length === 0) {
42
+ errors.push('Username is required');
43
+ }
44
+ if (userData.username && (userData.username.length < 3 || userData.username.length > 50)) {
45
+ errors.push('Username must be between 3 and 50 characters');
46
+ }
47
+ if (!userData.password || userData.password.length === 0) {
48
+ errors.push('Password is required');
49
+ }
50
+ if (userData.roles && userData.roles.length === 0) {
51
+ errors.push('At least one role is required');
52
+ }
53
+ return {
54
+ valid: errors.length === 0,
55
+ errors,
56
+ };
57
+ }
58
+ /**
59
+ * 更新用户最后登录时间
60
+ */
61
+ function updateLastLogin(user) {
62
+ return {
63
+ ...user,
64
+ lastLoginAt: new Date(),
65
+ updatedAt: new Date(),
66
+ };
67
+ }
68
+ /**
69
+ * 锁定用户
70
+ */
71
+ function lockUser(user) {
72
+ return {
73
+ ...user,
74
+ status: types_1.UserStatus.LOCKED,
75
+ updatedAt: new Date(),
76
+ };
77
+ }
78
+ /**
79
+ * 激活用户
80
+ */
81
+ function activateUser(user) {
82
+ return {
83
+ ...user,
84
+ status: types_1.UserStatus.ACTIVE,
85
+ updatedAt: new Date(),
86
+ };
87
+ }
88
+ /**
89
+ * 添加角色
90
+ */
91
+ function addRole(user, role) {
92
+ if (user.roles.includes(role)) {
93
+ return user;
94
+ }
95
+ return {
96
+ ...user,
97
+ roles: [...user.roles, role],
98
+ updatedAt: new Date(),
99
+ };
100
+ }
101
+ /**
102
+ * 移除角色
103
+ */
104
+ function removeRole(user, role) {
105
+ return {
106
+ ...user,
107
+ roles: user.roles.filter((r) => r !== role),
108
+ updatedAt: new Date(),
109
+ };
110
+ }
111
+ /**
112
+ * 添加权限
113
+ */
114
+ function addPermission(user, permission) {
115
+ if (user.permissions.includes(permission)) {
116
+ return user;
117
+ }
118
+ return {
119
+ ...user,
120
+ permissions: [...user.permissions, permission],
121
+ updatedAt: new Date(),
122
+ };
123
+ }
124
+ /**
125
+ * 移除权限
126
+ */
127
+ function removePermission(user, permission) {
128
+ return {
129
+ ...user,
130
+ permissions: user.permissions.filter((p) => p !== permission),
131
+ updatedAt: new Date(),
132
+ };
133
+ }
134
+ /**
135
+ * 转换用户为安全格式(不包含敏感信息)
136
+ */
137
+ function toSafeUser(user) {
138
+ const { passwordHash, apiKeyHash, ...safeUser } = user;
139
+ return safeUser;
140
+ }
141
+ //# sourceMappingURL=user.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.model.js","sourceRoot":"","sources":["../../src/models/user.model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 审计日志仓储
3
+ * 负责审计日志的数据访问
4
+ */
5
+ import { BaseRepository } from './base.repository';
6
+ import { AuditLog, AuditQuery, AuditAction } from '../types';
7
+ export declare class AuditRepository extends BaseRepository<AuditLog> {
8
+ constructor(db: any);
9
+ /**
10
+ * 初始化索引
11
+ */
12
+ private initializeIndexes;
13
+ /**
14
+ * 查询审计日志
15
+ */
16
+ findAuditLogs(projectId: string, query: AuditQuery): Promise<{
17
+ logs: AuditLog[];
18
+ total: number;
19
+ }>;
20
+ /**
21
+ * 查询最近的审计日志
22
+ */
23
+ findRecentLogs(projectId: string, limit?: number): Promise<AuditLog[]>;
24
+ /**
25
+ * 统计特定操作的次数
26
+ */
27
+ countByAction(projectId: string, action: AuditAction, startDate?: Date, endDate?: Date): Promise<number>;
28
+ /**
29
+ * 统计失败的登录尝试
30
+ */
31
+ countFailedLogins(projectId: string, userId?: string, since?: Date): Promise<number>;
32
+ /**
33
+ * 删除旧日志(用于归档)
34
+ */
35
+ deleteOldLogs(beforeDate: Date): Promise<number>;
36
+ }
37
+ //# sourceMappingURL=audit.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/audit.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAA+B,MAAM,UAAU,CAAC;AAE1F,qBAAa,eAAgB,SAAQ,cAAc,CAAC,QAAQ,CAAC;gBAC/C,EAAE,EAAE,GAAG;IAKnB;;OAEG;YACW,iBAAiB;IAc/B;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA8C/C;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC;IAOtB;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,SAAS,CAAC,EAAE,IAAI,EAChB,OAAO,CAAC,EAAE,IAAI,GACb,OAAO,CAAC,MAAM,CAAC;IAYlB;;OAEG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,IAAI,GACX,OAAO,CAAC,MAAM,CAAC;IAiBlB;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAOvD"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * 审计日志仓储
4
+ * 负责审计日志的数据访问
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AuditRepository = void 0;
8
+ const base_repository_1 = require("./base.repository");
9
+ const types_1 = require("../types");
10
+ class AuditRepository extends base_repository_1.BaseRepository {
11
+ constructor(db) {
12
+ super(db, 'audit_logs');
13
+ this.initializeIndexes();
14
+ }
15
+ /**
16
+ * 初始化索引
17
+ */
18
+ async initializeIndexes() {
19
+ await this.createIndexes([
20
+ { projectId: 1 },
21
+ { userId: 1 },
22
+ { action: 1 },
23
+ { resourceType: 1 },
24
+ { resourceId: 1 },
25
+ { timestamp: -1 },
26
+ { severity: 1 },
27
+ { projectId: 1, timestamp: -1 },
28
+ { userId: 1, timestamp: -1 },
29
+ ]);
30
+ }
31
+ /**
32
+ * 查询审计日志
33
+ */
34
+ async findAuditLogs(projectId, query) {
35
+ const filter = { projectId };
36
+ if (query.startDate) {
37
+ filter.timestamp = { ...filter.timestamp, $gte: query.startDate };
38
+ }
39
+ if (query.endDate) {
40
+ filter.timestamp = { ...filter.timestamp, $lte: query.endDate };
41
+ }
42
+ if (query.action) {
43
+ filter.action = query.action;
44
+ }
45
+ if (query.resourceType) {
46
+ filter.resourceType = query.resourceType;
47
+ }
48
+ if (query.userId) {
49
+ filter.userId = query.userId;
50
+ }
51
+ if (query.severity) {
52
+ filter.severity = query.severity;
53
+ }
54
+ if (query.success !== undefined) {
55
+ filter['details.success'] = query.success;
56
+ }
57
+ const total = await this.count(filter);
58
+ const page = query.page || 1;
59
+ const limit = query.limit || 50;
60
+ const skip = (page - 1) * limit;
61
+ const logs = await this.findMany(filter, {
62
+ sort: { timestamp: -1 },
63
+ skip,
64
+ limit,
65
+ });
66
+ return { logs, total };
67
+ }
68
+ /**
69
+ * 查询最近的审计日志
70
+ */
71
+ async findRecentLogs(projectId, limit = 100) {
72
+ return await this.findMany({ projectId }, { sort: { timestamp: -1 }, limit });
73
+ }
74
+ /**
75
+ * 统计特定操作的次数
76
+ */
77
+ async countByAction(projectId, action, startDate, endDate) {
78
+ const filter = { projectId, action };
79
+ if (startDate || endDate) {
80
+ filter.timestamp = {};
81
+ if (startDate)
82
+ filter.timestamp.$gte = startDate;
83
+ if (endDate)
84
+ filter.timestamp.$lte = endDate;
85
+ }
86
+ return await this.count(filter);
87
+ }
88
+ /**
89
+ * 统计失败的登录尝试
90
+ */
91
+ async countFailedLogins(projectId, userId, since) {
92
+ const filter = {
93
+ projectId,
94
+ action: types_1.AuditAction.LOGIN_FAILED,
95
+ };
96
+ if (userId) {
97
+ filter.userId = userId;
98
+ }
99
+ if (since) {
100
+ filter.timestamp = { $gte: since };
101
+ }
102
+ return await this.count(filter);
103
+ }
104
+ /**
105
+ * 删除旧日志(用于归档)
106
+ */
107
+ async deleteOldLogs(beforeDate) {
108
+ const collection = this.getCollection();
109
+ const result = await collection.deleteMany({
110
+ timestamp: { $lt: beforeDate },
111
+ });
112
+ return result.deletedCount;
113
+ }
114
+ }
115
+ exports.AuditRepository = AuditRepository;
116
+ //# sourceMappingURL=audit.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.repository.js","sourceRoot":"","sources":["../../src/repositories/audit.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 基础仓储类
3
+ * 提供通用的数据库操作
4
+ */
5
+ import { Db, Collection, Filter, UpdateFilter, Document } from 'mongodb';
6
+ /**
7
+ * 基础仓储类
8
+ */
9
+ export declare abstract class BaseRepository<T extends Document> {
10
+ protected db: Db;
11
+ protected collectionName: string;
12
+ constructor(db: Db, collectionName: string);
13
+ /**
14
+ * 获取集合
15
+ */
16
+ protected getCollection(): Collection<T>;
17
+ /**
18
+ * 创建索引
19
+ */
20
+ protected createIndexes(indexes: Record<string, 1 | -1>[]): Promise<void>;
21
+ /**
22
+ * 插入单个文档
23
+ */
24
+ insertOne(document: T): Promise<T>;
25
+ /**
26
+ * 查询单个文档
27
+ */
28
+ findOne(filter: Filter<T>): Promise<T | null>;
29
+ /**
30
+ * 查询多个文档
31
+ */
32
+ findMany(filter?: Filter<T>, options?: {
33
+ sort?: Record<string, 1 | -1>;
34
+ limit?: number;
35
+ skip?: number;
36
+ }): Promise<T[]>;
37
+ /**
38
+ * 更新单个文档
39
+ */
40
+ updateOne(filter: Filter<T>, update: UpdateFilter<T>): Promise<boolean>;
41
+ /**
42
+ * 删除单个文档
43
+ */
44
+ deleteOne(filter: Filter<T>): Promise<boolean>;
45
+ /**
46
+ * 统计文档数量
47
+ */
48
+ count(filter?: Filter<T>): Promise<number>;
49
+ /**
50
+ * 检查文档是否存在
51
+ */
52
+ exists(filter: Filter<T>): Promise<boolean>;
53
+ }
54
+ //# sourceMappingURL=base.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/base.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAe,EAAE,EAAE,UAAU,EAAY,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIhG;;GAEG;AACH,8BAAsB,cAAc,CAAC,CAAC,SAAS,QAAQ;IACrD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACjB,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;gBAErB,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM;IAK1C;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,UAAU,CAAC,CAAC,CAAC;IAIxC;;OAEG;cACa,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/E;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAMxC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAKnD;;OAEG;IACG,QAAQ,CACZ,MAAM,GAAE,MAAM,CAAC,CAAC,CAAM,EACtB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GACA,OAAO,CAAC,CAAC,EAAE,CAAC;IAmBf;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAM7E;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAMpD;;OAEG;IACG,KAAK,CAAC,MAAM,GAAE,MAAM,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKpD;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAIlD"}