@qq33357486/oh-my-task 1.4.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -236
- package/dist/__tests__/auth-admin.test.d.ts +2 -0
- package/dist/__tests__/auth-admin.test.d.ts.map +1 -0
- package/dist/__tests__/auth-admin.test.js +440 -0
- package/dist/__tests__/auth-admin.test.js.map +1 -0
- package/dist/__tests__/auth-login-logout.test.d.ts +2 -0
- package/dist/__tests__/auth-login-logout.test.d.ts.map +1 -0
- package/dist/__tests__/auth-login-logout.test.js +400 -0
- package/dist/__tests__/auth-login-logout.test.js.map +1 -0
- package/dist/__tests__/auth-password.test.d.ts +2 -0
- package/dist/__tests__/auth-password.test.d.ts.map +1 -0
- package/dist/__tests__/auth-password.test.js +419 -0
- package/dist/__tests__/auth-password.test.js.map +1 -0
- package/dist/__tests__/auth-register.test.d.ts +2 -0
- package/dist/__tests__/auth-register.test.d.ts.map +1 -0
- package/dist/__tests__/auth-register.test.js +342 -0
- package/dist/__tests__/auth-register.test.js.map +1 -0
- package/dist/__tests__/auth-tokens.test.d.ts +2 -0
- package/dist/__tests__/auth-tokens.test.d.ts.map +1 -0
- package/dist/__tests__/auth-tokens.test.js +392 -0
- package/dist/__tests__/auth-tokens.test.js.map +1 -0
- package/dist/__tests__/db-schema.test.d.ts +2 -0
- package/dist/__tests__/db-schema.test.d.ts.map +1 -0
- package/dist/__tests__/db-schema.test.js +245 -0
- package/dist/__tests__/db-schema.test.js.map +1 -0
- package/dist/__tests__/express-server.test.d.ts +2 -0
- package/dist/__tests__/express-server.test.d.ts.map +1 -0
- package/dist/__tests__/express-server.test.js +119 -0
- package/dist/__tests__/express-server.test.js.map +1 -0
- package/dist/__tests__/fix-hcaptcha-dev-bypass.test.d.ts +2 -0
- package/dist/__tests__/fix-hcaptcha-dev-bypass.test.d.ts.map +1 -0
- package/dist/__tests__/fix-hcaptcha-dev-bypass.test.js +85 -0
- package/dist/__tests__/fix-hcaptcha-dev-bypass.test.js.map +1 -0
- package/dist/__tests__/mcp/mcp-tools.test.d.ts +2 -0
- package/dist/__tests__/mcp/mcp-tools.test.d.ts.map +1 -0
- package/dist/__tests__/mcp/mcp-tools.test.js +547 -0
- package/dist/__tests__/mcp/mcp-tools.test.js.map +1 -0
- package/dist/__tests__/projects.test.d.ts +2 -0
- package/dist/__tests__/projects.test.d.ts.map +1 -0
- package/dist/__tests__/projects.test.js +406 -0
- package/dist/__tests__/projects.test.js.map +1 -0
- package/dist/__tests__/schedule.test.d.ts +2 -0
- package/dist/__tests__/schedule.test.d.ts.map +1 -0
- package/dist/__tests__/schedule.test.js +587 -0
- package/dist/__tests__/schedule.test.js.map +1 -0
- package/dist/__tests__/tasks-crud.test.d.ts +2 -0
- package/dist/__tests__/tasks-crud.test.d.ts.map +1 -0
- package/dist/__tests__/tasks-crud.test.js +606 -0
- package/dist/__tests__/tasks-crud.test.js.map +1 -0
- package/dist/__tests__/tasks-lifecycle.test.d.ts +2 -0
- package/dist/__tests__/tasks-lifecycle.test.d.ts.map +1 -0
- package/dist/__tests__/tasks-lifecycle.test.js +712 -0
- package/dist/__tests__/tasks-lifecycle.test.js.map +1 -0
- package/dist/__tests__/versions.test.d.ts +2 -0
- package/dist/__tests__/versions.test.d.ts.map +1 -0
- package/dist/__tests__/versions.test.js +613 -0
- package/dist/__tests__/versions.test.js.map +1 -0
- package/dist/api/middleware/auth.d.ts +1 -2
- package/dist/api/middleware/auth.d.ts.map +1 -1
- package/dist/api/middleware/auth.js +5 -12
- package/dist/api/middleware/auth.js.map +1 -1
- package/dist/api/middleware/captcha.d.ts +8 -0
- package/dist/api/middleware/captcha.d.ts.map +1 -1
- package/dist/api/middleware/captcha.js +29 -4
- package/dist/api/middleware/captcha.js.map +1 -1
- package/dist/api/middleware/ownerCheck.d.ts +0 -5
- package/dist/api/middleware/ownerCheck.d.ts.map +1 -1
- package/dist/api/middleware/ownerCheck.js +15 -49
- package/dist/api/middleware/ownerCheck.js.map +1 -1
- package/dist/api/routes/{sops.d.ts → admin.d.ts} +1 -1
- package/dist/api/routes/admin.d.ts.map +1 -0
- package/dist/api/routes/admin.js +20 -0
- package/dist/api/routes/admin.js.map +1 -0
- package/dist/api/routes/auth.d.ts.map +1 -1
- package/dist/api/routes/auth.js +106 -20
- package/dist/api/routes/auth.js.map +1 -1
- package/dist/api/routes/config.d.ts.map +1 -1
- package/dist/api/routes/config.js +6 -1
- package/dist/api/routes/config.js.map +1 -1
- package/dist/api/routes/projects.d.ts.map +1 -1
- package/dist/api/routes/projects.js +29 -18
- package/dist/api/routes/projects.js.map +1 -1
- package/dist/api/routes/tasks.d.ts.map +1 -1
- package/dist/api/routes/tasks.js +79 -104
- package/dist/api/routes/tasks.js.map +1 -1
- package/dist/api/routes/tokens.d.ts.map +1 -1
- package/dist/api/routes/tokens.js +11 -8
- package/dist/api/routes/tokens.js.map +1 -1
- package/dist/api/routes/users.d.ts.map +1 -1
- package/dist/api/routes/users.js +7 -59
- package/dist/api/routes/users.js.map +1 -1
- package/dist/api/routes/versions.d.ts.map +1 -1
- package/dist/api/routes/versions.js +63 -34
- package/dist/api/routes/versions.js.map +1 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +23 -14
- package/dist/api/server.js.map +1 -1
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +52 -117
- package/dist/db/connection.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +15 -64
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/activate-task.d.ts.map +1 -1
- package/dist/mcp/tools/activate-task.js +3 -17
- package/dist/mcp/tools/activate-task.js.map +1 -1
- package/dist/mcp/tools/{get-next-task.d.ts → auto-schedule.d.ts} +3 -3
- package/dist/mcp/tools/auto-schedule.d.ts.map +1 -0
- package/dist/mcp/tools/auto-schedule.js +59 -0
- package/dist/mcp/tools/auto-schedule.js.map +1 -0
- package/dist/mcp/tools/complete-task.d.ts.map +1 -1
- package/dist/mcp/tools/complete-task.js +2 -12
- package/dist/mcp/tools/complete-task.js.map +1 -1
- package/dist/mcp/tools/create-task.d.ts.map +1 -1
- package/dist/mcp/tools/create-task.js +33 -38
- package/dist/mcp/tools/create-task.js.map +1 -1
- package/dist/mcp/tools/create-version.d.ts.map +1 -1
- package/dist/mcp/tools/create-version.js +2 -17
- package/dist/mcp/tools/create-version.js.map +1 -1
- package/dist/mcp/tools/{get-task-context.d.ts → get-current-task.d.ts} +3 -3
- package/dist/mcp/tools/get-current-task.d.ts.map +1 -0
- package/dist/mcp/tools/get-current-task.js +85 -0
- package/dist/mcp/tools/get-current-task.js.map +1 -0
- package/dist/mcp/tools/get-task.d.ts.map +1 -1
- package/dist/mcp/tools/get-task.js +7 -12
- package/dist/mcp/tools/get-task.js.map +1 -1
- package/dist/mcp/tools/init-project.d.ts +0 -2
- package/dist/mcp/tools/init-project.d.ts.map +1 -1
- package/dist/mcp/tools/init-project.js +39 -75
- package/dist/mcp/tools/init-project.js.map +1 -1
- package/dist/mcp/tools/list-tasks.d.ts.map +1 -1
- package/dist/mcp/tools/list-tasks.js +8 -33
- package/dist/mcp/tools/list-tasks.js.map +1 -1
- package/dist/mcp/tools/list-versions.d.ts.map +1 -1
- package/dist/mcp/tools/list-versions.js +16 -25
- package/dist/mcp/tools/list-versions.js.map +1 -1
- package/dist/mcp/tools/utils/config.js +1 -1
- package/dist/mcp/tools/utils/config.js.map +1 -1
- package/dist/services/admin.service.d.ts +27 -0
- package/dist/services/admin.service.d.ts.map +1 -0
- package/dist/services/admin.service.js +88 -0
- package/dist/services/admin.service.js.map +1 -0
- package/dist/services/config.service.d.ts +1 -0
- package/dist/services/config.service.d.ts.map +1 -1
- package/dist/services/config.service.js +7 -0
- package/dist/services/config.service.js.map +1 -1
- package/dist/services/project.service.d.ts +7 -7
- package/dist/services/project.service.d.ts.map +1 -1
- package/dist/services/project.service.js +47 -40
- package/dist/services/project.service.js.map +1 -1
- package/dist/services/schedule.service.d.ts +6 -0
- package/dist/services/schedule.service.d.ts.map +1 -1
- package/dist/services/schedule.service.js +36 -12
- package/dist/services/schedule.service.js.map +1 -1
- package/dist/services/task.service.d.ts +6 -18
- package/dist/services/task.service.d.ts.map +1 -1
- package/dist/services/task.service.js +161 -194
- package/dist/services/task.service.js.map +1 -1
- package/dist/services/token.service.d.ts +1 -0
- package/dist/services/token.service.d.ts.map +1 -1
- package/dist/services/token.service.js +5 -2
- package/dist/services/token.service.js.map +1 -1
- package/dist/services/user.service.d.ts +11 -34
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +54 -113
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/version.service.d.ts +26 -8
- package/dist/services/version.service.d.ts.map +1 -1
- package/dist/services/version.service.js +149 -41
- package/dist/services/version.service.js.map +1 -1
- package/dist/types/index.d.ts +17 -60
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/email.d.ts +6 -0
- package/dist/utils/email.d.ts.map +1 -0
- package/dist/utils/email.js +28 -0
- package/dist/utils/email.js.map +1 -0
- package/package.json +6 -13
- package/src/db/schema.sql +113 -70
- package/dist/api/routes/sops.d.ts.map +0 -1
- package/dist/api/routes/sops.js +0 -155
- package/dist/api/routes/sops.js.map +0 -1
- package/dist/mcp/tools/add-task-note.d.ts +0 -10
- package/dist/mcp/tools/add-task-note.d.ts.map +0 -1
- package/dist/mcp/tools/add-task-note.js +0 -46
- package/dist/mcp/tools/add-task-note.js.map +0 -1
- package/dist/mcp/tools/approve-task.d.ts +0 -10
- package/dist/mcp/tools/approve-task.d.ts.map +0 -1
- package/dist/mcp/tools/approve-task.js +0 -59
- package/dist/mcp/tools/approve-task.js.map +0 -1
- package/dist/mcp/tools/archive-version.d.ts +0 -10
- package/dist/mcp/tools/archive-version.d.ts.map +0 -1
- package/dist/mcp/tools/archive-version.js +0 -57
- package/dist/mcp/tools/archive-version.js.map +0 -1
- package/dist/mcp/tools/assign-task.d.ts +0 -10
- package/dist/mcp/tools/assign-task.d.ts.map +0 -1
- package/dist/mcp/tools/assign-task.js +0 -53
- package/dist/mcp/tools/assign-task.js.map +0 -1
- package/dist/mcp/tools/create-sop.d.ts +0 -10
- package/dist/mcp/tools/create-sop.d.ts.map +0 -1
- package/dist/mcp/tools/create-sop.js +0 -90
- package/dist/mcp/tools/create-sop.js.map +0 -1
- package/dist/mcp/tools/get-my-tasks.d.ts +0 -10
- package/dist/mcp/tools/get-my-tasks.d.ts.map +0 -1
- package/dist/mcp/tools/get-my-tasks.js +0 -88
- package/dist/mcp/tools/get-my-tasks.js.map +0 -1
- package/dist/mcp/tools/get-next-task.d.ts.map +0 -1
- package/dist/mcp/tools/get-next-task.js +0 -84
- package/dist/mcp/tools/get-next-task.js.map +0 -1
- package/dist/mcp/tools/get-sop.d.ts +0 -10
- package/dist/mcp/tools/get-sop.d.ts.map +0 -1
- package/dist/mcp/tools/get-sop.js +0 -67
- package/dist/mcp/tools/get-sop.js.map +0 -1
- package/dist/mcp/tools/get-task-context.d.ts.map +0 -1
- package/dist/mcp/tools/get-task-context.js +0 -114
- package/dist/mcp/tools/get-task-context.js.map +0 -1
- package/dist/mcp/tools/helpers.d.ts +0 -10
- package/dist/mcp/tools/helpers.d.ts.map +0 -1
- package/dist/mcp/tools/helpers.js +0 -17
- package/dist/mcp/tools/helpers.js.map +0 -1
- package/dist/mcp/tools/list-sops.d.ts +0 -10
- package/dist/mcp/tools/list-sops.d.ts.map +0 -1
- package/dist/mcp/tools/list-sops.js +0 -57
- package/dist/mcp/tools/list-sops.js.map +0 -1
- package/dist/mcp/tools/reject-task.d.ts +0 -10
- package/dist/mcp/tools/reject-task.d.ts.map +0 -1
- package/dist/mcp/tools/reject-task.js +0 -63
- package/dist/mcp/tools/reject-task.js.map +0 -1
- package/dist/mcp/tools/reschedule.d.ts +0 -17
- package/dist/mcp/tools/reschedule.d.ts.map +0 -1
- package/dist/mcp/tools/reschedule.js +0 -107
- package/dist/mcp/tools/reschedule.js.map +0 -1
- package/dist/mcp/tools/start-task.d.ts +0 -10
- package/dist/mcp/tools/start-task.d.ts.map +0 -1
- package/dist/mcp/tools/start-task.js +0 -42
- package/dist/mcp/tools/start-task.js.map +0 -1
- package/dist/mcp/tools/submit-for-review.d.ts +0 -10
- package/dist/mcp/tools/submit-for-review.d.ts.map +0 -1
- package/dist/mcp/tools/submit-for-review.js +0 -64
- package/dist/mcp/tools/submit-for-review.js.map +0 -1
- package/dist/mcp/tools/update-sop.d.ts +0 -10
- package/dist/mcp/tools/update-sop.d.ts.map +0 -1
- package/dist/mcp/tools/update-sop.js +0 -113
- package/dist/mcp/tools/update-sop.js.map +0 -1
- package/dist/mcp/tools/update-task-doc.d.ts +0 -10
- package/dist/mcp/tools/update-task-doc.d.ts.map +0 -1
- package/dist/mcp/tools/update-task-doc.js +0 -70
- package/dist/mcp/tools/update-task-doc.js.map +0 -1
- package/dist/mcp/tools/update-task.d.ts +0 -10
- package/dist/mcp/tools/update-task.d.ts.map +0 -1
- package/dist/mcp/tools/update-task.js +0 -106
- package/dist/mcp/tools/update-task.js.map +0 -1
- package/dist/services/sop.service.d.ts +0 -53
- package/dist/services/sop.service.d.ts.map +0 -1
- package/dist/services/sop.service.js +0 -275
- package/dist/services/sop.service.js.map +0 -1
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import type { User } from '../types/index.js';
|
|
2
2
|
export interface CreateUserParams {
|
|
3
|
-
name: string;
|
|
4
3
|
email: string;
|
|
5
4
|
password: string;
|
|
5
|
+
code: string;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* 发送邮箱注册验证码
|
|
9
|
+
*/
|
|
10
|
+
export declare function sendEmailCode(email: string): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* 校验邮箱验证码(通过后从 store 中删除)
|
|
13
|
+
*/
|
|
14
|
+
export declare function verifyEmailCode(email: string, code: string): void;
|
|
15
|
+
export declare function _setEmailCodeForTest(email: string, code: string): void;
|
|
7
16
|
export interface LoginParams {
|
|
8
17
|
email: string;
|
|
9
18
|
password: string;
|
|
@@ -18,7 +27,7 @@ export interface ResetPasswordParams {
|
|
|
18
27
|
newPassword: string;
|
|
19
28
|
}
|
|
20
29
|
/**
|
|
21
|
-
*
|
|
30
|
+
* 创建用户(邮箱+验证码+密码,name 自动取邮箱前缀)
|
|
22
31
|
*/
|
|
23
32
|
export declare function createUser(params: CreateUserParams): Promise<User>;
|
|
24
33
|
/**
|
|
@@ -44,23 +53,10 @@ export declare function getAllUsers(page?: number, pageSize?: number): {
|
|
|
44
53
|
users: User[];
|
|
45
54
|
total: number;
|
|
46
55
|
};
|
|
47
|
-
/**
|
|
48
|
-
* 管理员创建用户(带邮箱和密码)
|
|
49
|
-
*/
|
|
50
|
-
export declare function createUserByAdmin(params: {
|
|
51
|
-
name: string;
|
|
52
|
-
email: string;
|
|
53
|
-
password: string;
|
|
54
|
-
role?: string;
|
|
55
|
-
}): Promise<User>;
|
|
56
56
|
/**
|
|
57
57
|
* 修改密码
|
|
58
58
|
*/
|
|
59
59
|
export declare function changePassword(params: ChangePasswordParams): Promise<boolean>;
|
|
60
|
-
/**
|
|
61
|
-
* 强制修改密码(首次登录)
|
|
62
|
-
*/
|
|
63
|
-
export declare function forceChangePassword(userId: string, newPassword: string): Promise<boolean>;
|
|
64
60
|
/**
|
|
65
61
|
* 生成密码重置令牌
|
|
66
62
|
*/
|
|
@@ -69,27 +65,8 @@ export declare function generateResetToken(email: string): string | null;
|
|
|
69
65
|
* 使用重置令牌重置密码
|
|
70
66
|
*/
|
|
71
67
|
export declare function resetPassword(params: ResetPasswordParams): Promise<boolean>;
|
|
72
|
-
/**
|
|
73
|
-
* 清除首次登录标记
|
|
74
|
-
*/
|
|
75
|
-
export declare function clearFirstLoginFlag(userId: string): void;
|
|
76
|
-
/**
|
|
77
|
-
* 创建用户(仅名字,用于旧 API)
|
|
78
|
-
*/
|
|
79
|
-
export declare function createUserByName(name: string, role?: string): User;
|
|
80
|
-
/**
|
|
81
|
-
* 更新用户
|
|
82
|
-
*/
|
|
83
|
-
export declare function updateUser(id: string, data: {
|
|
84
|
-
name?: string;
|
|
85
|
-
role?: string;
|
|
86
|
-
}): User | null;
|
|
87
68
|
/**
|
|
88
69
|
* 删除用户
|
|
89
70
|
*/
|
|
90
71
|
export declare function deleteUser(id: string): boolean;
|
|
91
|
-
/**
|
|
92
|
-
* 重新生成 API Key
|
|
93
|
-
*/
|
|
94
|
-
export declare function regenerateApiKey(id: string): User | null;
|
|
95
72
|
//# sourceMappingURL=user.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAcjE;AAGD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtE;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCxE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAInD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAIzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,GAAG,qBAAqB,CAAC,CAS5G;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAW,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAWrG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB/D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAI9C"}
|
|
@@ -2,12 +2,49 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
2
2
|
import { getDb } from '../db/connection.js';
|
|
3
3
|
import { hashPassword, verifyPassword, validatePasswordStrength } from '../utils/password.js';
|
|
4
4
|
import { validateEmail, normalizeEmail } from '../utils/validation.js';
|
|
5
|
+
import { sendEmail } from '../utils/email.js';
|
|
6
|
+
// 内存验证码存储:email -> { code, expiresAt }
|
|
7
|
+
const emailCodeStore = new Map();
|
|
8
|
+
/**
|
|
9
|
+
* 发送邮箱注册验证码
|
|
10
|
+
*/
|
|
11
|
+
export async function sendEmailCode(email) {
|
|
12
|
+
if (!validateEmail(email)) {
|
|
13
|
+
throw new Error('邮箱格式无效');
|
|
14
|
+
}
|
|
15
|
+
const code = String(Math.floor(100000 + Math.random() * 900000));
|
|
16
|
+
const expiresAt = Date.now() + 5 * 60 * 1000; // 5分钟
|
|
17
|
+
emailCodeStore.set(normalizeEmail(email), { code, expiresAt });
|
|
18
|
+
await sendEmail(email, '注册验证码 - oh-my-task', `您的注册验证码是:${code}\n验证码 5 分钟内有效,请勿泄露给他人。`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 校验邮箱验证码(通过后从 store 中删除)
|
|
22
|
+
*/
|
|
23
|
+
export function verifyEmailCode(email, code) {
|
|
24
|
+
const normalized = normalizeEmail(email);
|
|
25
|
+
const entry = emailCodeStore.get(normalized);
|
|
26
|
+
if (!entry) {
|
|
27
|
+
throw new Error('验证码不存在或已过期,请重新发送');
|
|
28
|
+
}
|
|
29
|
+
if (Date.now() > entry.expiresAt) {
|
|
30
|
+
emailCodeStore.delete(normalized);
|
|
31
|
+
throw new Error('验证码已过期,请重新发送');
|
|
32
|
+
}
|
|
33
|
+
if (entry.code !== code) {
|
|
34
|
+
throw new Error('验证码错误');
|
|
35
|
+
}
|
|
36
|
+
emailCodeStore.delete(normalized);
|
|
37
|
+
}
|
|
38
|
+
// 供测试直接写入验证码
|
|
39
|
+
export function _setEmailCodeForTest(email, code) {
|
|
40
|
+
emailCodeStore.set(normalizeEmail(email), { code, expiresAt: Date.now() + 5 * 60 * 1000 });
|
|
41
|
+
}
|
|
5
42
|
// ========== 认证相关 ==========
|
|
6
43
|
/**
|
|
7
|
-
*
|
|
44
|
+
* 创建用户(邮箱+验证码+密码,name 自动取邮箱前缀)
|
|
8
45
|
*/
|
|
9
46
|
export async function createUser(params) {
|
|
10
|
-
const {
|
|
47
|
+
const { email, password } = params;
|
|
11
48
|
// 验证邮箱
|
|
12
49
|
if (!validateEmail(email)) {
|
|
13
50
|
throw new Error('邮箱格式无效');
|
|
@@ -26,12 +63,16 @@ export async function createUser(params) {
|
|
|
26
63
|
}
|
|
27
64
|
// 哈希密码
|
|
28
65
|
const passwordHash = await hashPassword(password);
|
|
29
|
-
//
|
|
66
|
+
// name 取邮箱前缀
|
|
67
|
+
const name = normalizedEmail.split('@')[0];
|
|
68
|
+
// 创建用户(第一个注册的普通用户自动成为 admin)
|
|
30
69
|
const id = uuidv4();
|
|
70
|
+
const userCount = db.prepare('SELECT COUNT(*) as count FROM users').get();
|
|
71
|
+
const role = userCount.count === 0 ? 'admin' : 'member';
|
|
31
72
|
db.prepare(`
|
|
32
73
|
INSERT INTO users (id, name, email, password_hash, role)
|
|
33
|
-
VALUES (?, ?, ?, ?,
|
|
34
|
-
`).run(id, name
|
|
74
|
+
VALUES (?, ?, ?, ?, ?)
|
|
75
|
+
`).run(id, name, normalizedEmail, passwordHash, role);
|
|
35
76
|
return getUserById(id);
|
|
36
77
|
}
|
|
37
78
|
/**
|
|
@@ -79,14 +120,12 @@ export function toPublicUser(user) {
|
|
|
79
120
|
id: user.id,
|
|
80
121
|
name: user.name,
|
|
81
122
|
email: user.email,
|
|
82
|
-
api_key: user.api_key,
|
|
83
123
|
role: user.role,
|
|
84
|
-
is_first_login: user.is_first_login,
|
|
85
124
|
created_at: user.created_at,
|
|
86
125
|
updated_at: user.updated_at
|
|
87
126
|
};
|
|
88
127
|
}
|
|
89
|
-
// ==========
|
|
128
|
+
// ========== 用户管理相关 ==========
|
|
90
129
|
/**
|
|
91
130
|
* 获取所有用户(分页)
|
|
92
131
|
*/
|
|
@@ -99,32 +138,6 @@ export function getAllUsers(page = 1, pageSize = 10) {
|
|
|
99
138
|
const countResult = db.prepare('SELECT COUNT(*) as total FROM users').get();
|
|
100
139
|
return { users, total: countResult.total };
|
|
101
140
|
}
|
|
102
|
-
/**
|
|
103
|
-
* 管理员创建用户(带邮箱和密码)
|
|
104
|
-
*/
|
|
105
|
-
export async function createUserByAdmin(params) {
|
|
106
|
-
const { name, email, password, role = 'member' } = params;
|
|
107
|
-
if (!validateEmail(email)) {
|
|
108
|
-
throw new Error('邮箱格式无效');
|
|
109
|
-
}
|
|
110
|
-
const passwordCheck = validatePasswordStrength(password);
|
|
111
|
-
if (!passwordCheck.valid) {
|
|
112
|
-
throw new Error(passwordCheck.errors.join(', '));
|
|
113
|
-
}
|
|
114
|
-
const normalizedEmail = normalizeEmail(email);
|
|
115
|
-
const db = getDb();
|
|
116
|
-
const existing = db.prepare('SELECT id FROM users WHERE email = ?').get(normalizedEmail);
|
|
117
|
-
if (existing) {
|
|
118
|
-
throw new Error('邮箱已被使用');
|
|
119
|
-
}
|
|
120
|
-
const passwordHash = await hashPassword(password);
|
|
121
|
-
const id = uuidv4();
|
|
122
|
-
db.prepare(`
|
|
123
|
-
INSERT INTO users (id, name, email, password_hash, role, is_first_login)
|
|
124
|
-
VALUES (?, ?, ?, ?, ?, 1)
|
|
125
|
-
`).run(id, name.trim(), normalizedEmail, passwordHash, role);
|
|
126
|
-
return getUserById(id);
|
|
127
|
-
}
|
|
128
141
|
/**
|
|
129
142
|
* 修改密码
|
|
130
143
|
*/
|
|
@@ -145,26 +158,7 @@ export async function changePassword(params) {
|
|
|
145
158
|
}
|
|
146
159
|
const passwordHash = await hashPassword(newPassword);
|
|
147
160
|
db.prepare(`
|
|
148
|
-
UPDATE users SET password_hash = ?,
|
|
149
|
-
`).run(passwordHash, userId);
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* 强制修改密码(首次登录)
|
|
154
|
-
*/
|
|
155
|
-
export async function forceChangePassword(userId, newPassword) {
|
|
156
|
-
const db = getDb();
|
|
157
|
-
const user = getUserById(userId);
|
|
158
|
-
if (!user) {
|
|
159
|
-
throw new Error('用户不存在');
|
|
160
|
-
}
|
|
161
|
-
const passwordCheck = validatePasswordStrength(newPassword);
|
|
162
|
-
if (!passwordCheck.valid) {
|
|
163
|
-
throw new Error(passwordCheck.errors.join(', '));
|
|
164
|
-
}
|
|
165
|
-
const passwordHash = await hashPassword(newPassword);
|
|
166
|
-
db.prepare(`
|
|
167
|
-
UPDATE users SET password_hash = ?, is_first_login = 0, updated_at = CURRENT_TIMESTAMP WHERE id = ?
|
|
161
|
+
UPDATE users SET password_hash = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?
|
|
168
162
|
`).run(passwordHash, userId);
|
|
169
163
|
return true;
|
|
170
164
|
}
|
|
@@ -192,66 +186,25 @@ export async function resetPassword(params) {
|
|
|
192
186
|
const { token, newPassword } = params;
|
|
193
187
|
const db = getDb();
|
|
194
188
|
const user = db.prepare(`
|
|
195
|
-
SELECT * FROM users WHERE reset_token = ?
|
|
189
|
+
SELECT * FROM users WHERE reset_token = ?
|
|
196
190
|
`).get(token);
|
|
197
191
|
if (!user) {
|
|
198
192
|
throw new Error('重置令牌无效或已过期');
|
|
199
193
|
}
|
|
194
|
+
// 检查 token 是否过期(使用 JavaScript Date 比较,避免 SQLite 字符串格式差异)
|
|
195
|
+
if (!user.reset_token_expires || new Date(user.reset_token_expires) <= new Date()) {
|
|
196
|
+
throw new Error('重置令牌无效或已过期');
|
|
197
|
+
}
|
|
200
198
|
const passwordCheck = validatePasswordStrength(newPassword);
|
|
201
199
|
if (!passwordCheck.valid) {
|
|
202
200
|
throw new Error(passwordCheck.errors.join(', '));
|
|
203
201
|
}
|
|
204
202
|
const passwordHash = await hashPassword(newPassword);
|
|
205
203
|
db.prepare(`
|
|
206
|
-
UPDATE users SET password_hash = ?, reset_token = NULL, reset_token_expires = NULL,
|
|
204
|
+
UPDATE users SET password_hash = ?, reset_token = NULL, reset_token_expires = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = ?
|
|
207
205
|
`).run(passwordHash, user.id);
|
|
208
206
|
return true;
|
|
209
207
|
}
|
|
210
|
-
/**
|
|
211
|
-
* 清除首次登录标记
|
|
212
|
-
*/
|
|
213
|
-
export function clearFirstLoginFlag(userId) {
|
|
214
|
-
const db = getDb();
|
|
215
|
-
db.prepare('UPDATE users SET is_first_login = 0 WHERE id = ?').run(userId);
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* 创建用户(仅名字,用于旧 API)
|
|
219
|
-
*/
|
|
220
|
-
export function createUserByName(name, role) {
|
|
221
|
-
const db = getDb();
|
|
222
|
-
const id = uuidv4();
|
|
223
|
-
const apiKey = `omt-${uuidv4()}`;
|
|
224
|
-
db.prepare(`
|
|
225
|
-
INSERT INTO users (id, name, api_key, role)
|
|
226
|
-
VALUES (?, ?, ?, ?)
|
|
227
|
-
`).run(id, name.trim(), apiKey, role || 'member');
|
|
228
|
-
return getUserById(id);
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* 更新用户
|
|
232
|
-
*/
|
|
233
|
-
export function updateUser(id, data) {
|
|
234
|
-
const db = getDb();
|
|
235
|
-
const user = getUserById(id);
|
|
236
|
-
if (!user)
|
|
237
|
-
return null;
|
|
238
|
-
const updates = [];
|
|
239
|
-
const values = [];
|
|
240
|
-
if (data.name !== undefined) {
|
|
241
|
-
updates.push('name = ?');
|
|
242
|
-
values.push(data.name.trim());
|
|
243
|
-
}
|
|
244
|
-
if (data.role !== undefined) {
|
|
245
|
-
updates.push('role = ?');
|
|
246
|
-
values.push(data.role);
|
|
247
|
-
}
|
|
248
|
-
if (updates.length === 0)
|
|
249
|
-
return user;
|
|
250
|
-
updates.push('updated_at = CURRENT_TIMESTAMP');
|
|
251
|
-
values.push(id);
|
|
252
|
-
db.prepare(`UPDATE users SET ${updates.join(', ')} WHERE id = ?`).run(...values);
|
|
253
|
-
return getUserById(id);
|
|
254
|
-
}
|
|
255
208
|
/**
|
|
256
209
|
* 删除用户
|
|
257
210
|
*/
|
|
@@ -260,16 +213,4 @@ export function deleteUser(id) {
|
|
|
260
213
|
const result = db.prepare('DELETE FROM users WHERE id = ?').run(id);
|
|
261
214
|
return result.changes > 0;
|
|
262
215
|
}
|
|
263
|
-
/**
|
|
264
|
-
* 重新生成 API Key
|
|
265
|
-
*/
|
|
266
|
-
export function regenerateApiKey(id) {
|
|
267
|
-
const db = getDb();
|
|
268
|
-
const user = getUserById(id);
|
|
269
|
-
if (!user)
|
|
270
|
-
return null;
|
|
271
|
-
const newApiKey = `omt-${uuidv4()}`;
|
|
272
|
-
db.prepare('UPDATE users SET api_key = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(newApiKey, id);
|
|
273
|
-
return getUserById(id);
|
|
274
|
-
}
|
|
275
216
|
//# sourceMappingURL=user.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAS9C,uCAAuC;AACvC,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+C,CAAC;AAE9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa;IAC/C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;IACpD,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAE/D,MAAM,SAAS,CACb,KAAK,EACL,oBAAoB,EACpB,YAAY,IAAI,wBAAwB,CACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,IAAY;IACzD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,aAAa;AACb,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,IAAY;IAC9D,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAC7F,CAAC;AAkBD,6BAA6B;AAE7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAwB;IACvD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAEnC,OAAO;IACP,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,SAAS;IACT,MAAM,aAAa,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,YAAY;IACZ,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO;IACP,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAElD,aAAa;IACb,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,6BAA6B;IAC7B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAuB,CAAC;IAC/F,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAExD,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAEtD,OAAO,WAAW,CAAC,EAAE,CAAS,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAmB;IACjD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACnC,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,OAAO;IACP,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;GAEvB,CAAC,CAAC,GAAG,CAAC,eAAe,CAAqB,CAAC;IAE5C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;IACP,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACnE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAqB,CAAC;IACxF,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAqB,CAAC;IAC9G,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAU;IACrC,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED,+BAA+B;AAE/B;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,CAAC,EAAE,WAAmB,EAAE;IACjE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;IAErC,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC;;GAExB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAW,CAAC;IAEnC,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAuB,CAAC;IAEjG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA4B;IAC/D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACpD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACtE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,aAAa,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAErD,EAAE,CAAC,OAAO,CAAC;;GAEV,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAE7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAqB,CAAC;IACxG,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAE/D,EAAE,CAAC,OAAO,CAAC;;GAEV,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAEvC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA2B;IAC7D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACtC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;GAEvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAqB,CAAC;IAElC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,yDAAyD;IACzD,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,aAAa,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAErD,EAAE,CAAC,OAAO,CAAC;;GAEV,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAE9B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -38,29 +38,47 @@ export interface UpdateVersionParams {
|
|
|
38
38
|
/**
|
|
39
39
|
* 获取项目的所有版本(验证归属)
|
|
40
40
|
*/
|
|
41
|
-
export declare function listVersions(projectId: string, userId
|
|
41
|
+
export declare function listVersions(projectId: string, userId: string): Version[];
|
|
42
42
|
/**
|
|
43
43
|
* 根据 ID 获取版本(验证归属)
|
|
44
44
|
*/
|
|
45
|
-
export declare function getVersionById(id: string, userId
|
|
45
|
+
export declare function getVersionById(id: string, userId: string): Version | null;
|
|
46
|
+
/**
|
|
47
|
+
* 内部使用:根据 ID 获取版本(不验证归属,仅供已通过权限校验的内部调用)
|
|
48
|
+
*/
|
|
49
|
+
export declare function getVersionByIdInternal(id: string): Version | null;
|
|
50
|
+
/**
|
|
51
|
+
* 内部使用:更新版本字段(不验证归属)
|
|
52
|
+
*/
|
|
53
|
+
export declare function updateVersionInternal(id: string, params: UpdateVersionParams): Version | null;
|
|
46
54
|
/**
|
|
47
55
|
* 创建版本(验证归属)
|
|
48
56
|
*/
|
|
49
|
-
export declare function createVersion(params: CreateVersionParams, userId
|
|
57
|
+
export declare function createVersion(params: CreateVersionParams, userId: string): Version | null;
|
|
50
58
|
/**
|
|
51
59
|
* 更新版本(验证归属)
|
|
52
60
|
*/
|
|
53
|
-
export declare function updateVersion(id: string, params: UpdateVersionParams, userId
|
|
61
|
+
export declare function updateVersion(id: string, params: UpdateVersionParams, userId: string): Version | null;
|
|
54
62
|
/**
|
|
55
63
|
* 删除版本(验证归属)
|
|
56
64
|
*/
|
|
57
|
-
export declare function deleteVersion(id: string, userId
|
|
65
|
+
export declare function deleteVersion(id: string, userId: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* 重新排序版本(验证归属)
|
|
68
|
+
*/
|
|
69
|
+
export declare function reorderVersions(versionIds: string[], userId: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* 开始版本(锁定为活跃状态)
|
|
72
|
+
* 同一项目同一时间只能有一个未归档的活跃版本
|
|
73
|
+
*/
|
|
74
|
+
export declare function startVersion(versionId: string): Version;
|
|
58
75
|
/**
|
|
59
|
-
*
|
|
76
|
+
* 完成版本
|
|
77
|
+
* 所有任务必须完成,空版本不能完成
|
|
60
78
|
*/
|
|
61
|
-
export declare function
|
|
79
|
+
export declare function completeVersion(versionId: string): Version;
|
|
62
80
|
/**
|
|
63
|
-
*
|
|
81
|
+
* 锁定版本(标记规划完成,进入执行阶段)— 内部使用
|
|
64
82
|
*/
|
|
65
83
|
export declare function lockVersion(versionId: string): Version | null;
|
|
66
84
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.service.d.ts","sourceRoot":"","sources":["../../src/services/version.service.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"version.service.d.ts","sourceRoot":"","sources":["../../src/services/version.service.ts"],"names":[],"mappings":"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"}
|