@qq33357486/oh-my-task 1.4.0 → 1.4.1
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 +379 -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 +270 -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 +65 -14
- 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 +40 -118
- 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 +0 -32
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +13 -110
- 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/package.json +4 -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
package/dist/types/index.d.ts
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
export type UserRole = 'admin' | 'member';
|
|
2
2
|
export type TaskStatus = 'planned' | 'in_progress' | 'done';
|
|
3
|
-
export type TaskAction = 'created' | 'updated' | 'status_changed' | '
|
|
3
|
+
export type TaskAction = 'created' | 'updated' | 'status_changed' | 'noted';
|
|
4
4
|
export interface User {
|
|
5
5
|
id: string;
|
|
6
6
|
name: string;
|
|
7
|
-
email: string
|
|
8
|
-
password_hash: string
|
|
9
|
-
api_key: string | null;
|
|
7
|
+
email: string;
|
|
8
|
+
password_hash: string;
|
|
10
9
|
role: UserRole;
|
|
11
|
-
is_first_login: number;
|
|
12
10
|
reset_token: string | null;
|
|
13
11
|
reset_token_expires: string | null;
|
|
14
12
|
created_at: string;
|
|
@@ -22,24 +20,17 @@ export interface UserToken {
|
|
|
22
20
|
last_used_at: string | null;
|
|
23
21
|
created_at: string;
|
|
24
22
|
}
|
|
25
|
-
export interface
|
|
23
|
+
export interface UserActivity {
|
|
26
24
|
id: string;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
owner_id: string | null;
|
|
25
|
+
user_id: string;
|
|
26
|
+
action: string;
|
|
30
27
|
created_at: string;
|
|
31
|
-
updated_at: string;
|
|
32
28
|
}
|
|
33
|
-
export interface
|
|
29
|
+
export interface Project {
|
|
34
30
|
id: string;
|
|
35
|
-
project_id: string;
|
|
36
31
|
name: string;
|
|
37
32
|
description: string | null;
|
|
38
|
-
|
|
39
|
-
workflow: string;
|
|
40
|
-
required: string;
|
|
41
|
-
forbidden: string;
|
|
42
|
-
experience: string;
|
|
33
|
+
owner_id: string;
|
|
43
34
|
created_at: string;
|
|
44
35
|
updated_at: string;
|
|
45
36
|
}
|
|
@@ -51,6 +42,7 @@ export interface Version {
|
|
|
51
42
|
start_date: string | null;
|
|
52
43
|
due_date: string | null;
|
|
53
44
|
locked_at: string | null;
|
|
45
|
+
completed_at: string | null;
|
|
54
46
|
archived_at: string | null;
|
|
55
47
|
sort_order: number;
|
|
56
48
|
created_at: string;
|
|
@@ -74,27 +66,21 @@ export interface Task {
|
|
|
74
66
|
parent_id: string | null;
|
|
75
67
|
title: string;
|
|
76
68
|
description: string | null;
|
|
69
|
+
notes: string | null;
|
|
77
70
|
status: TaskStatus;
|
|
78
|
-
|
|
79
|
-
estimated_days: number | null;
|
|
71
|
+
estimated_days: number;
|
|
80
72
|
start_date: string | null;
|
|
81
73
|
due_date: string | null;
|
|
82
74
|
actual_start: string | null;
|
|
83
75
|
actual_end: string | null;
|
|
84
76
|
sort_order: number;
|
|
85
|
-
|
|
86
|
-
sop_id: string | null;
|
|
77
|
+
inserted: number;
|
|
87
78
|
deleted_at: string | null;
|
|
88
|
-
requirement_doc: string | null;
|
|
89
|
-
design_doc: string | null;
|
|
90
|
-
current_status: string | null;
|
|
91
79
|
created_at: string;
|
|
92
80
|
updated_at: string;
|
|
93
81
|
}
|
|
94
82
|
export interface TaskWithChildren extends Task {
|
|
95
83
|
children: TaskWithChildren[];
|
|
96
|
-
assignee?: User | null;
|
|
97
|
-
sop?: SOP | null;
|
|
98
84
|
}
|
|
99
85
|
export interface TaskHistory {
|
|
100
86
|
id: string;
|
|
@@ -107,37 +93,6 @@ export interface TaskHistory {
|
|
|
107
93
|
changed_by: string | null;
|
|
108
94
|
changed_at: string;
|
|
109
95
|
}
|
|
110
|
-
export interface TaskContext {
|
|
111
|
-
id: string;
|
|
112
|
-
title: string;
|
|
113
|
-
status: TaskStatus;
|
|
114
|
-
assignee: User | null;
|
|
115
|
-
start_date: string | null;
|
|
116
|
-
due_date: string | null;
|
|
117
|
-
estimated_days: number | null;
|
|
118
|
-
actual_start: string | null;
|
|
119
|
-
actual_end: string | null;
|
|
120
|
-
requirement_doc: string | null;
|
|
121
|
-
design_doc: string | null;
|
|
122
|
-
current_status: string | null;
|
|
123
|
-
recent_history: TaskHistory[];
|
|
124
|
-
children_summary: {
|
|
125
|
-
total: number;
|
|
126
|
-
done: number;
|
|
127
|
-
in_progress: number;
|
|
128
|
-
children: Array<{
|
|
129
|
-
id: string;
|
|
130
|
-
title: string;
|
|
131
|
-
status: TaskStatus;
|
|
132
|
-
}>;
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
export type DocType = 'requirement' | 'design' | 'status';
|
|
136
|
-
export interface UpdateTaskDocParams {
|
|
137
|
-
doc_type: DocType;
|
|
138
|
-
content: string;
|
|
139
|
-
append?: boolean;
|
|
140
|
-
}
|
|
141
96
|
export interface Holiday {
|
|
142
97
|
date: string;
|
|
143
98
|
year: number;
|
|
@@ -156,7 +111,7 @@ export interface CreateTaskParams {
|
|
|
156
111
|
parent_id?: string;
|
|
157
112
|
title: string;
|
|
158
113
|
description?: string;
|
|
159
|
-
|
|
114
|
+
notes?: string;
|
|
160
115
|
estimated_days?: number;
|
|
161
116
|
start_date?: string;
|
|
162
117
|
due_date?: string;
|
|
@@ -164,8 +119,8 @@ export interface CreateTaskParams {
|
|
|
164
119
|
export interface UpdateTaskParams {
|
|
165
120
|
title?: string;
|
|
166
121
|
description?: string;
|
|
122
|
+
notes?: string;
|
|
167
123
|
status?: TaskStatus;
|
|
168
|
-
assignee_id?: string;
|
|
169
124
|
estimated_days?: number;
|
|
170
125
|
start_date?: string;
|
|
171
126
|
due_date?: string;
|
|
@@ -177,7 +132,6 @@ export interface ListTasksParams {
|
|
|
177
132
|
version_id?: string | null;
|
|
178
133
|
parent_id?: string | null;
|
|
179
134
|
status?: TaskStatus;
|
|
180
|
-
assignee_id?: string;
|
|
181
135
|
}
|
|
182
136
|
export interface ProjectConfig {
|
|
183
137
|
project_id?: string;
|
|
@@ -203,5 +157,8 @@ export interface SystemConfigMap {
|
|
|
203
157
|
smtp_user: string;
|
|
204
158
|
smtp_pass: string;
|
|
205
159
|
smtp_from: string;
|
|
160
|
+
registration_enabled: string;
|
|
161
|
+
hcaptcha_site_key: string;
|
|
162
|
+
hcaptcha_secret_key: string;
|
|
206
163
|
}
|
|
207
164
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAG1C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;AAG5D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qq33357486/oh-my-task",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "文档驱动的 AI 编程协作系统 - 通过 MCP 工具管理任务",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,15 +20,7 @@
|
|
|
20
20
|
"build": "tsc",
|
|
21
21
|
"start": "node dist/index.js",
|
|
22
22
|
"mcp": "tsx src/mcp/server.ts",
|
|
23
|
-
"db:init": "tsx src/db/init.ts"
|
|
24
|
-
"db:clean": "tsx scripts/clean-db.ts",
|
|
25
|
-
"db:migrate-auth": "tsx scripts/migrate-auth.ts",
|
|
26
|
-
"test": "vitest run",
|
|
27
|
-
"test:watch": "vitest",
|
|
28
|
-
"test:coverage": "vitest run --coverage",
|
|
29
|
-
"test:e2e": "playwright test",
|
|
30
|
-
"test:e2e:ui": "playwright test --ui",
|
|
31
|
-
"test:e2e:report": "playwright show-report"
|
|
23
|
+
"db:init": "tsx src/db/init.ts"
|
|
32
24
|
},
|
|
33
25
|
"keywords": [
|
|
34
26
|
"task-management",
|
|
@@ -48,18 +40,17 @@
|
|
|
48
40
|
"uuid": "^9.0.0"
|
|
49
41
|
},
|
|
50
42
|
"devDependencies": {
|
|
51
|
-
"@playwright/test": "^1.40.0",
|
|
52
43
|
"@types/bcrypt": "^6.0.0",
|
|
53
44
|
"@types/better-sqlite3": "^7.6.8",
|
|
54
45
|
"@types/cors": "^2.8.17",
|
|
55
46
|
"@types/express": "^4.17.21",
|
|
56
47
|
"@types/express-session": "^1.18.2",
|
|
57
48
|
"@types/node": "^20.10.0",
|
|
58
|
-
"@types/supertest": "^
|
|
49
|
+
"@types/supertest": "^7.2.0",
|
|
59
50
|
"@types/uuid": "^9.0.7",
|
|
60
51
|
"supertest": "^7.2.2",
|
|
61
52
|
"tsx": "^4.7.0",
|
|
62
53
|
"typescript": "^5.3.0",
|
|
63
|
-
"vitest": "^
|
|
54
|
+
"vitest": "^4.1.4"
|
|
64
55
|
}
|
|
65
56
|
}
|
package/src/db/schema.sql
CHANGED
|
@@ -1,44 +1,62 @@
|
|
|
1
|
-
-- oh-my-task Database Schema
|
|
2
|
-
--
|
|
1
|
+
-- oh-my-task Database Schema (v2)
|
|
2
|
+
-- 从零重写:移除 SOP、assignee、阶段性文档等旧功能
|
|
3
|
+
-- 新增 user_activity、sessions、inserted/notes 等字段
|
|
3
4
|
|
|
5
|
+
-- ============================================
|
|
4
6
|
-- 用户表
|
|
7
|
+
-- ============================================
|
|
5
8
|
CREATE TABLE IF NOT EXISTS users (
|
|
6
9
|
id TEXT PRIMARY KEY,
|
|
7
10
|
name TEXT NOT NULL,
|
|
8
|
-
email TEXT UNIQUE,
|
|
9
|
-
password_hash TEXT,
|
|
10
|
-
api_key TEXT UNIQUE, -- API Key(可选,兼容旧配置)
|
|
11
|
+
email TEXT NOT NULL UNIQUE,
|
|
12
|
+
password_hash TEXT NOT NULL,
|
|
11
13
|
role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('admin', 'member')),
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
14
|
+
reset_token TEXT,
|
|
15
|
+
reset_token_expires DATETIME,
|
|
16
|
+
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
17
|
+
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
17
18
|
);
|
|
18
19
|
|
|
19
|
-
--
|
|
20
|
+
-- ============================================
|
|
21
|
+
-- 用户 Token 表(用于 MCP/API 认证)
|
|
22
|
+
-- ============================================
|
|
20
23
|
CREATE TABLE IF NOT EXISTS user_tokens (
|
|
21
24
|
id TEXT PRIMARY KEY,
|
|
22
25
|
user_id TEXT NOT NULL,
|
|
23
|
-
name TEXT NOT NULL,
|
|
24
|
-
token TEXT NOT NULL UNIQUE,
|
|
25
|
-
last_used_at DATETIME,
|
|
26
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
26
|
+
name TEXT NOT NULL,
|
|
27
|
+
token TEXT NOT NULL UNIQUE,
|
|
28
|
+
last_used_at DATETIME,
|
|
29
|
+
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
27
30
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
28
31
|
);
|
|
29
32
|
|
|
33
|
+
-- ============================================
|
|
34
|
+
-- 用户活动表(用于 DAU/留存统计)
|
|
35
|
+
-- ============================================
|
|
36
|
+
CREATE TABLE IF NOT EXISTS user_activity (
|
|
37
|
+
id TEXT PRIMARY KEY,
|
|
38
|
+
user_id TEXT NOT NULL,
|
|
39
|
+
action TEXT NOT NULL,
|
|
40
|
+
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
41
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
-- ============================================
|
|
30
45
|
-- 项目表
|
|
46
|
+
-- ============================================
|
|
31
47
|
CREATE TABLE IF NOT EXISTS projects (
|
|
32
48
|
id TEXT PRIMARY KEY,
|
|
33
49
|
name TEXT NOT NULL,
|
|
34
50
|
description TEXT,
|
|
35
|
-
owner_id TEXT,
|
|
36
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
37
|
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
38
|
-
FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE
|
|
51
|
+
owner_id TEXT NOT NULL,
|
|
52
|
+
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
53
|
+
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
54
|
+
FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE
|
|
39
55
|
);
|
|
40
56
|
|
|
57
|
+
-- ============================================
|
|
41
58
|
-- 版本表
|
|
59
|
+
-- ============================================
|
|
42
60
|
CREATE TABLE IF NOT EXISTS versions (
|
|
43
61
|
id TEXT PRIMARY KEY,
|
|
44
62
|
project_id TEXT NOT NULL,
|
|
@@ -47,30 +65,17 @@ CREATE TABLE IF NOT EXISTS versions (
|
|
|
47
65
|
start_date DATE,
|
|
48
66
|
due_date DATE,
|
|
49
67
|
locked_at DATETIME DEFAULT NULL,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
-- SOP(技能/智能体)表
|
|
58
|
-
CREATE TABLE IF NOT EXISTS sops (
|
|
59
|
-
id TEXT PRIMARY KEY,
|
|
60
|
-
project_id TEXT NOT NULL,
|
|
61
|
-
name TEXT NOT NULL,
|
|
62
|
-
description TEXT,
|
|
63
|
-
rules TEXT DEFAULT '',
|
|
64
|
-
workflow TEXT DEFAULT '',
|
|
65
|
-
required TEXT DEFAULT '',
|
|
66
|
-
forbidden TEXT DEFAULT '',
|
|
67
|
-
experience TEXT DEFAULT '',
|
|
68
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
69
|
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
68
|
+
completed_at DATETIME DEFAULT NULL,
|
|
69
|
+
archived_at DATETIME DEFAULT NULL,
|
|
70
|
+
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
71
|
+
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
72
|
+
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
70
73
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
|
71
74
|
);
|
|
72
75
|
|
|
76
|
+
-- ============================================
|
|
73
77
|
-- 任务表
|
|
78
|
+
-- ============================================
|
|
74
79
|
CREATE TABLE IF NOT EXISTS tasks (
|
|
75
80
|
id TEXT PRIMARY KEY,
|
|
76
81
|
project_id TEXT NOT NULL,
|
|
@@ -78,46 +83,43 @@ CREATE TABLE IF NOT EXISTS tasks (
|
|
|
78
83
|
parent_id TEXT,
|
|
79
84
|
title TEXT NOT NULL,
|
|
80
85
|
description TEXT,
|
|
86
|
+
notes TEXT,
|
|
81
87
|
status TEXT NOT NULL DEFAULT 'planned' CHECK (status IN ('planned', 'in_progress', 'done')),
|
|
82
|
-
|
|
83
|
-
estimated_days REAL DEFAULT 1,
|
|
88
|
+
estimated_days INTEGER DEFAULT 1,
|
|
84
89
|
start_date DATE,
|
|
85
90
|
due_date DATE,
|
|
86
91
|
actual_start DATETIME,
|
|
87
92
|
actual_end DATETIME,
|
|
88
|
-
sort_order INTEGER DEFAULT 0,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
requirement_doc TEXT, -- 需求文档:这个任务要做什么
|
|
94
|
-
design_doc TEXT, -- 设计文档:怎么做,技术方案
|
|
95
|
-
current_status TEXT, -- 当前情况:做到哪了,遇到什么问题
|
|
96
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
97
|
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
93
|
+
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
94
|
+
inserted INTEGER NOT NULL DEFAULT 0 CHECK (inserted IN (0, 1)),
|
|
95
|
+
deleted_at DATETIME DEFAULT NULL,
|
|
96
|
+
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
97
|
+
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
98
98
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
99
99
|
FOREIGN KEY (version_id) REFERENCES versions(id) ON DELETE SET NULL,
|
|
100
|
-
FOREIGN KEY (parent_id) REFERENCES tasks(id) ON DELETE CASCADE
|
|
101
|
-
FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
102
|
-
FOREIGN KEY (sop_id) REFERENCES sops(id) ON DELETE SET NULL
|
|
100
|
+
FOREIGN KEY (parent_id) REFERENCES tasks(id) ON DELETE CASCADE
|
|
103
101
|
);
|
|
104
102
|
|
|
103
|
+
-- ============================================
|
|
105
104
|
-- 任务历史表
|
|
105
|
+
-- ============================================
|
|
106
106
|
CREATE TABLE IF NOT EXISTS task_history (
|
|
107
107
|
id TEXT PRIMARY KEY,
|
|
108
108
|
task_id TEXT NOT NULL,
|
|
109
|
-
action TEXT NOT NULL CHECK (action IN ('created', 'updated', 'status_changed', '
|
|
109
|
+
action TEXT NOT NULL CHECK (action IN ('created', 'updated', 'status_changed', 'noted')),
|
|
110
110
|
field TEXT,
|
|
111
111
|
old_value TEXT,
|
|
112
112
|
new_value TEXT,
|
|
113
113
|
reason TEXT,
|
|
114
114
|
changed_by TEXT,
|
|
115
|
-
changed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
115
|
+
changed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
116
116
|
FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
|
|
117
117
|
FOREIGN KEY (changed_by) REFERENCES users(id) ON DELETE SET NULL
|
|
118
118
|
);
|
|
119
119
|
|
|
120
|
+
-- ============================================
|
|
120
121
|
-- 节假日表
|
|
122
|
+
-- ============================================
|
|
121
123
|
CREATE TABLE IF NOT EXISTS holidays (
|
|
122
124
|
date DATE PRIMARY KEY,
|
|
123
125
|
year INTEGER NOT NULL,
|
|
@@ -125,38 +127,79 @@ CREATE TABLE IF NOT EXISTS holidays (
|
|
|
125
127
|
name TEXT
|
|
126
128
|
);
|
|
127
129
|
|
|
130
|
+
-- ============================================
|
|
128
131
|
-- 系统配置表
|
|
132
|
+
-- ============================================
|
|
129
133
|
CREATE TABLE IF NOT EXISTS system_config (
|
|
130
134
|
key TEXT PRIMARY KEY,
|
|
131
|
-
value TEXT NOT NULL,
|
|
135
|
+
value TEXT NOT NULL DEFAULT '',
|
|
132
136
|
description TEXT,
|
|
133
|
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
137
|
+
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
134
138
|
);
|
|
135
139
|
|
|
140
|
+
-- ============================================
|
|
141
|
+
-- Sessions 表(express-session SQLite store)
|
|
142
|
+
-- better-sqlite3-session-store 需要 sid, sess, expire 列
|
|
143
|
+
-- ============================================
|
|
144
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
145
|
+
sid TEXT NOT NULL PRIMARY KEY,
|
|
146
|
+
sess TEXT NOT NULL,
|
|
147
|
+
expire TEXT NOT NULL DEFAULT ''
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
-- 迁移:如果旧 sessions 表缺少 expire 列或有过时的 expired 列,进行修复
|
|
151
|
+
-- SQLite 不支持 DROP COLUMN,需要重建表
|
|
152
|
+
-- 注意:这里只在必要时执行,不影响已有 session 数据
|
|
153
|
+
-- better-sqlite3-session-store 会在构造时自动执行自己的 CREATE TABLE IF NOT EXISTS
|
|
154
|
+
|
|
155
|
+
-- ============================================
|
|
136
156
|
-- 初始系统配置
|
|
157
|
+
-- ============================================
|
|
137
158
|
INSERT OR IGNORE INTO system_config (key, value, description) VALUES
|
|
138
159
|
('server_url', 'http://localhost:3000', '服务器 URL'),
|
|
139
160
|
('smtp_host', '', 'SMTP 服务器地址'),
|
|
140
161
|
('smtp_port', '587', 'SMTP 端口'),
|
|
141
162
|
('smtp_user', '', 'SMTP 用户名'),
|
|
142
163
|
('smtp_pass', '', 'SMTP 密码'),
|
|
143
|
-
('smtp_from', '', '发件人邮箱')
|
|
164
|
+
('smtp_from', '', '发件人邮箱'),
|
|
165
|
+
('registration_enabled', '1', '是否开放注册'),
|
|
166
|
+
('hcaptcha_site_key', '', 'hCaptcha Site Key'),
|
|
167
|
+
('hcaptcha_secret_key', '', 'hCaptcha Secret Key');
|
|
144
168
|
|
|
169
|
+
-- ============================================
|
|
145
170
|
-- 索引
|
|
171
|
+
-- ============================================
|
|
172
|
+
|
|
173
|
+
-- users 索引
|
|
174
|
+
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
|
175
|
+
CREATE INDEX IF NOT EXISTS idx_users_reset_token ON users(reset_token);
|
|
176
|
+
|
|
177
|
+
-- user_tokens 索引
|
|
178
|
+
CREATE INDEX IF NOT EXISTS idx_user_tokens_user_id ON user_tokens(user_id);
|
|
179
|
+
CREATE INDEX IF NOT EXISTS idx_user_tokens_token ON user_tokens(token);
|
|
180
|
+
|
|
181
|
+
-- user_activity 索引
|
|
182
|
+
CREATE INDEX IF NOT EXISTS idx_user_activity_user_id ON user_activity(user_id);
|
|
183
|
+
CREATE INDEX IF NOT EXISTS idx_user_activity_action ON user_activity(action);
|
|
184
|
+
CREATE INDEX IF NOT EXISTS idx_user_activity_created_at ON user_activity(created_at);
|
|
185
|
+
|
|
186
|
+
-- projects 索引
|
|
187
|
+
CREATE INDEX IF NOT EXISTS idx_projects_owner_id ON projects(owner_id);
|
|
188
|
+
|
|
189
|
+
-- versions 索引
|
|
190
|
+
CREATE INDEX IF NOT EXISTS idx_versions_project_id ON versions(project_id);
|
|
191
|
+
CREATE INDEX IF NOT EXISTS idx_versions_locked_at ON versions(locked_at);
|
|
192
|
+
CREATE INDEX IF NOT EXISTS idx_versions_archived_at ON versions(archived_at);
|
|
193
|
+
|
|
194
|
+
-- tasks 索引
|
|
146
195
|
CREATE INDEX IF NOT EXISTS idx_tasks_project_id ON tasks(project_id);
|
|
147
196
|
CREATE INDEX IF NOT EXISTS idx_tasks_parent_id ON tasks(parent_id);
|
|
148
|
-
CREATE INDEX IF NOT EXISTS idx_tasks_assignee_id ON tasks(assignee_id);
|
|
149
197
|
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
150
198
|
CREATE INDEX IF NOT EXISTS idx_tasks_deleted_at ON tasks(deleted_at);
|
|
199
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_version_id ON tasks(version_id);
|
|
200
|
+
|
|
201
|
+
-- task_history 索引
|
|
151
202
|
CREATE INDEX IF NOT EXISTS idx_task_history_task_id ON task_history(task_id);
|
|
152
|
-
CREATE INDEX IF NOT EXISTS idx_holidays_year ON holidays(year);
|
|
153
|
-
CREATE INDEX IF NOT EXISTS idx_sops_project_id ON sops(project_id);
|
|
154
|
-
CREATE INDEX IF NOT EXISTS idx_versions_archived_at ON versions(archived_at);
|
|
155
|
-
CREATE INDEX IF NOT EXISTS idx_user_tokens_user_id ON user_tokens(user_id);
|
|
156
|
-
CREATE INDEX IF NOT EXISTS idx_user_tokens_token ON user_tokens(token);
|
|
157
|
-
CREATE INDEX IF NOT EXISTS idx_projects_owner_id ON projects(owner_id);
|
|
158
203
|
|
|
159
|
-
--
|
|
160
|
-
|
|
161
|
-
INSERT OR IGNORE INTO users (id, name, role)
|
|
162
|
-
VALUES ('admin-001', 'admin', 'admin');
|
|
204
|
+
-- holidays 索引
|
|
205
|
+
CREATE INDEX IF NOT EXISTS idx_holidays_year ON holidays(year);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sops.d.ts","sourceRoot":"","sources":["../../../src/api/routes/sops.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA6KxB,eAAe,MAAM,CAAC"}
|
package/dist/api/routes/sops.js
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { Router } from 'express';
|
|
2
|
-
import * as sopService from '../../services/sop.service.js';
|
|
3
|
-
import * as projectService from '../../services/project.service.js';
|
|
4
|
-
const router = Router();
|
|
5
|
-
// 获取项目的路径(从请求体、查询参数或请求头)
|
|
6
|
-
function getProjectPath(req) {
|
|
7
|
-
// 从请求体获取
|
|
8
|
-
if (req.body.project_path) {
|
|
9
|
-
return req.body.project_path;
|
|
10
|
-
}
|
|
11
|
-
// 从查询参数获取
|
|
12
|
-
if (req.query.project_path) {
|
|
13
|
-
return req.query.project_path;
|
|
14
|
-
}
|
|
15
|
-
// 从请求头获取
|
|
16
|
-
if (req.headers['x-project-path']) {
|
|
17
|
-
return req.headers['x-project-path'];
|
|
18
|
-
}
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
// GET /api/sops - 获取 SOP 列表
|
|
22
|
-
router.get('/', (req, res) => {
|
|
23
|
-
const projectId = req.query.project_id;
|
|
24
|
-
const projectPath = getProjectPath(req);
|
|
25
|
-
const userId = req.auth?.user?.id;
|
|
26
|
-
const isAdmin = req.auth?.user?.role === 'admin';
|
|
27
|
-
if (!projectId) {
|
|
28
|
-
res.status(400).json({ success: false, error: 'project_id 不能为空' });
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
if (!projectPath) {
|
|
32
|
-
res.status(400).json({ success: false, error: 'project_path 不能为空(可通过 body、query 或 x-project-path header)' });
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
// 验证项目归属
|
|
36
|
-
if (!isAdmin) {
|
|
37
|
-
const hasAccess = projectService.checkProjectOwnership(projectId, userId);
|
|
38
|
-
if (!hasAccess) {
|
|
39
|
-
res.status(404).json({ success: false, error: '项目不存在' });
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
const sops = sopService.listSOPs(projectId, projectPath, isAdmin ? undefined : userId);
|
|
44
|
-
res.json({ success: true, data: sops });
|
|
45
|
-
});
|
|
46
|
-
// GET /api/sops/:id - 获取 SOP 详情
|
|
47
|
-
router.get('/:id', (req, res) => {
|
|
48
|
-
const projectPath = getProjectPath(req);
|
|
49
|
-
const userId = req.auth?.user?.id;
|
|
50
|
-
const isAdmin = req.auth?.user?.role === 'admin';
|
|
51
|
-
if (!projectPath) {
|
|
52
|
-
res.status(400).json({ success: false, error: 'project_path 不能为空' });
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const sop = sopService.getSOPById(req.params.id, projectPath, isAdmin ? undefined : userId);
|
|
56
|
-
if (!sop) {
|
|
57
|
-
res.status(404).json({ success: false, error: 'SOP 不存在' });
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
res.json({ success: true, data: sop });
|
|
61
|
-
});
|
|
62
|
-
// POST /api/sops - 创建 SOP
|
|
63
|
-
router.post('/', (req, res) => {
|
|
64
|
-
const { project_id, project_path, name, description, rules, workflow, required, forbidden, experience } = req.body;
|
|
65
|
-
const userId = req.auth.user.id;
|
|
66
|
-
const isAdmin = req.auth.user.role === 'admin';
|
|
67
|
-
if (!project_id) {
|
|
68
|
-
res.status(400).json({ success: false, error: 'project_id 不能为空' });
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (!project_path) {
|
|
72
|
-
res.status(400).json({ success: false, error: 'project_path 不能为空' });
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
if (!name) {
|
|
76
|
-
res.status(400).json({ success: false, error: 'name 不能为空' });
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
// 验证项目归属
|
|
80
|
-
if (!isAdmin) {
|
|
81
|
-
const hasAccess = projectService.checkProjectOwnership(project_id, userId);
|
|
82
|
-
if (!hasAccess) {
|
|
83
|
-
res.status(404).json({ success: false, error: '项目不存在' });
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
const params = {
|
|
88
|
-
project_id,
|
|
89
|
-
project_path,
|
|
90
|
-
name,
|
|
91
|
-
description,
|
|
92
|
-
rules,
|
|
93
|
-
workflow,
|
|
94
|
-
required,
|
|
95
|
-
forbidden,
|
|
96
|
-
experience,
|
|
97
|
-
};
|
|
98
|
-
const sop = sopService.createSOP(params);
|
|
99
|
-
res.status(201).json({ success: true, data: sop });
|
|
100
|
-
});
|
|
101
|
-
// PUT /api/sops/:id - 更新 SOP
|
|
102
|
-
router.put('/:id', (req, res) => {
|
|
103
|
-
const { name, description, rules, workflow, required, forbidden, experience, append_experience, project_path } = req.body;
|
|
104
|
-
const userId = req.auth.user.id;
|
|
105
|
-
const isAdmin = req.auth.user.role === 'admin';
|
|
106
|
-
if (!project_path) {
|
|
107
|
-
res.status(400).json({ success: false, error: 'project_path 不能为空' });
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
const params = {
|
|
111
|
-
name,
|
|
112
|
-
description,
|
|
113
|
-
rules,
|
|
114
|
-
workflow,
|
|
115
|
-
required,
|
|
116
|
-
forbidden,
|
|
117
|
-
experience,
|
|
118
|
-
append_experience,
|
|
119
|
-
};
|
|
120
|
-
const sop = sopService.updateSOP(req.params.id, params, project_path);
|
|
121
|
-
if (!sop) {
|
|
122
|
-
res.status(404).json({ success: false, error: 'SOP 不存在' });
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
res.json({ success: true, data: sop });
|
|
126
|
-
});
|
|
127
|
-
// DELETE /api/sops/:id - 删除 SOP
|
|
128
|
-
router.delete('/:id', (req, res) => {
|
|
129
|
-
const projectPath = req.query.project_path || req.body.project_path;
|
|
130
|
-
const userId = req.auth.user.id;
|
|
131
|
-
const isAdmin = req.auth.user.role === 'admin';
|
|
132
|
-
if (!projectPath) {
|
|
133
|
-
res.status(400).json({ success: false, error: 'project_path 不能为空' });
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
// 验证归属
|
|
137
|
-
const sop = sopService.getSOPById(req.params.id, projectPath, isAdmin ? undefined : userId);
|
|
138
|
-
if (!sop) {
|
|
139
|
-
res.status(404).json({ success: false, error: 'SOP 不存在' });
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
const success = sopService.deleteSOP(req.params.id, projectPath);
|
|
143
|
-
if (!success) {
|
|
144
|
-
res.status(404).json({ success: false, error: 'SOP 不存在' });
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
res.json({ success: true, message: 'SOP 已删除' });
|
|
148
|
-
});
|
|
149
|
-
// GET /api/sops/:id/usage - 获取 SOP 使用统计
|
|
150
|
-
router.get('/:id/usage', (req, res) => {
|
|
151
|
-
const count = sopService.getSOPUsageCount(req.params.id);
|
|
152
|
-
res.json({ success: true, data: { usage_count: count } });
|
|
153
|
-
});
|
|
154
|
-
export default router;
|
|
155
|
-
//# sourceMappingURL=sops.js.map
|