@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.
- package/LICENSE +21 -0
- package/README.md +325 -0
- package/dist/client.d.ts +130 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +266 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/core/asymmetric-crypto.d.ts +81 -0
- package/dist/core/asymmetric-crypto.d.ts.map +1 -0
- package/dist/core/asymmetric-crypto.js +171 -0
- package/dist/core/asymmetric-crypto.js.map +1 -0
- package/dist/core/crypto.d.ts +37 -0
- package/dist/core/crypto.d.ts.map +1 -0
- package/dist/core/crypto.js +100 -0
- package/dist/core/crypto.js.map +1 -0
- package/dist/core/crypto.service.d.ts +35 -0
- package/dist/core/crypto.service.d.ts.map +1 -0
- package/dist/core/crypto.service.js +67 -0
- package/dist/core/crypto.service.js.map +1 -0
- package/dist/core/key-derivation.d.ts +25 -0
- package/dist/core/key-derivation.d.ts.map +1 -0
- package/dist/core/key-derivation.js +96 -0
- package/dist/core/key-derivation.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/models/audit.model.d.ts +40 -0
- package/dist/models/audit.model.d.ts.map +1 -0
- package/dist/models/audit.model.js +83 -0
- package/dist/models/audit.model.js.map +1 -0
- package/dist/models/key.model.d.ts +40 -0
- package/dist/models/key.model.d.ts.map +1 -0
- package/dist/models/key.model.js +120 -0
- package/dist/models/key.model.js.map +1 -0
- package/dist/models/project.model.d.ts +20 -0
- package/dist/models/project.model.d.ts.map +1 -0
- package/dist/models/project.model.js +54 -0
- package/dist/models/project.model.js.map +1 -0
- package/dist/models/user.model.d.ts +48 -0
- package/dist/models/user.model.d.ts.map +1 -0
- package/dist/models/user.model.js +141 -0
- package/dist/models/user.model.js.map +1 -0
- package/dist/repositories/audit.repository.d.ts +37 -0
- package/dist/repositories/audit.repository.d.ts.map +1 -0
- package/dist/repositories/audit.repository.js +116 -0
- package/dist/repositories/audit.repository.js.map +1 -0
- package/dist/repositories/base.repository.d.ts +54 -0
- package/dist/repositories/base.repository.d.ts.map +1 -0
- package/dist/repositories/base.repository.js +97 -0
- package/dist/repositories/base.repository.js.map +1 -0
- package/dist/repositories/key.repository.d.ts +60 -0
- package/dist/repositories/key.repository.d.ts.map +1 -0
- package/dist/repositories/key.repository.js +126 -0
- package/dist/repositories/key.repository.js.map +1 -0
- package/dist/repositories/project.repository.d.ts +42 -0
- package/dist/repositories/project.repository.d.ts.map +1 -0
- package/dist/repositories/project.repository.js +82 -0
- package/dist/repositories/project.repository.js.map +1 -0
- package/dist/repositories/user.repository.d.ts +58 -0
- package/dist/repositories/user.repository.d.ts.map +1 -0
- package/dist/repositories/user.repository.js +102 -0
- package/dist/repositories/user.repository.js.map +1 -0
- package/dist/services/audit.service.d.ts +63 -0
- package/dist/services/audit.service.d.ts.map +1 -0
- package/dist/services/audit.service.js +113 -0
- package/dist/services/audit.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +39 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +179 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/key.service.d.ts +47 -0
- package/dist/services/key.service.d.ts.map +1 -0
- package/dist/services/key.service.js +135 -0
- package/dist/services/key.service.js.map +1 -0
- package/dist/services/permission.service.d.ts +37 -0
- package/dist/services/permission.service.d.ts.map +1 -0
- package/dist/services/permission.service.js +140 -0
- package/dist/services/permission.service.js.map +1 -0
- package/dist/services/project.service.d.ts +37 -0
- package/dist/services/project.service.d.ts.map +1 -0
- package/dist/services/project.service.js +96 -0
- package/dist/services/project.service.js.map +1 -0
- package/dist/types/audit.types.d.ts +122 -0
- package/dist/types/audit.types.d.ts.map +1 -0
- package/dist/types/audit.types.js +55 -0
- package/dist/types/audit.types.js.map +1 -0
- package/dist/types/client.types.d.ts +47 -0
- package/dist/types/client.types.d.ts.map +1 -0
- package/dist/types/client.types.js +6 -0
- package/dist/types/client.types.js.map +1 -0
- package/dist/types/crypto.types.d.ts +48 -0
- package/dist/types/crypto.types.d.ts.map +1 -0
- package/dist/types/crypto.types.js +6 -0
- package/dist/types/crypto.types.js.map +1 -0
- package/dist/types/index.d.ts +86 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +92 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/key.types.d.ts +125 -0
- package/dist/types/key.types.d.ts.map +1 -0
- package/dist/types/key.types.js +28 -0
- package/dist/types/key.types.js.map +1 -0
- package/dist/types/project.types.d.ts +57 -0
- package/dist/types/project.types.d.ts.map +1 -0
- package/dist/types/project.types.js +16 -0
- package/dist/types/project.types.js.map +1 -0
- package/dist/types/user.types.d.ts +110 -0
- package/dist/types/user.types.d.ts.map +1 -0
- package/dist/types/user.types.js +49 -0
- package/dist/types/user.types.js.map +1 -0
- package/dist/utils/config-loader.d.ts +64 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +126 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/constants.d.ts +62 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +119 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/error-handler.d.ts +48 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +109 -0
- package/dist/utils/error-handler.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|