重构: ARC-05 project.ts 上帝 store 拆分(4 子 store+barrel 兼容零改动)
拆 stores/project/{state,projects,tasks,ideas,workflow}.ts 四领域子 store(共享 state 单例 reactive 引用一致);越层 invoke approve_human_approval/cancel_workflow_node 下沉 src/api/workflow.ts;project.ts 改 barrel 组合器(实例化四子 store+re-export 所有成员,useProjectStore 单例+ProjectStore 类型保留)。所有 view(App/Dashboard/Ideas/ProjectDetail/Projects/Tasks/ToolCard)import '../stores/project' 零改动。行为零变化(含 CR-11⑪ approveHumanApproval 签名+B-34 snake_case)。批6,vue-tsc 0
This commit is contained in:
107
src/stores/project/projects.ts
Normal file
107
src/stores/project/projects.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
import { projectApi } from '../../api'
|
||||
import type { ImportProjectInput } from '../../api/project'
|
||||
import { state, clearError } from './state'
|
||||
|
||||
/** 项目 CRUD 子 store(共享全局 state) */
|
||||
export function createProjectsStore() {
|
||||
async function loadProjects() {
|
||||
state.loading = true
|
||||
state.error = null
|
||||
try {
|
||||
state.projects = await projectApi.list()
|
||||
} catch (e: any) {
|
||||
state.error = e?.toString() ?? '加载项目失败'
|
||||
} finally {
|
||||
state.loading = false
|
||||
}
|
||||
}
|
||||
|
||||
async function createProject(name: string, description = '', ideaId?: string, path?: string, stack?: string) {
|
||||
try {
|
||||
const record = await projectApi.create({ name, description, idea_id: ideaId, path, stack })
|
||||
state.projects.push(record)
|
||||
return record
|
||||
} catch (e: any) {
|
||||
state.error = e?.toString() ?? '创建项目失败'
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
/** 导入历史项目(选已存在目录,后端创建+绑定+探测栈+读 README 首段一步完成) */
|
||||
async function importProject(input: ImportProjectInput) {
|
||||
try {
|
||||
const record = await projectApi.importProject(input)
|
||||
await loadProjects() // 刷新列表(后端已 insert,统一走 load 避免本地数组与后端不一致)
|
||||
return record
|
||||
} catch (e: any) {
|
||||
state.error = e?.toString() ?? '导入项目失败'
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
async function updateProject(id: string, field: string, value: string) {
|
||||
await projectApi.update(id, field, value)
|
||||
const idx = state.projects.findIndex(p => p.id === id)
|
||||
if (idx >= 0) {
|
||||
(state.projects[idx] as any)[field] = value
|
||||
}
|
||||
}
|
||||
|
||||
/** 重定位项目目录(后端重探测 stack,返回最新记录并更新本地状态) */
|
||||
async function relocateProjectPath(id: string, newPath: string) {
|
||||
const record = await projectApi.relocatePath(id, newPath)
|
||||
const idx = state.projects.findIndex(p => p.id === id)
|
||||
if (idx >= 0) state.projects[idx] = record
|
||||
return record
|
||||
}
|
||||
|
||||
async function deleteProject(id: string) {
|
||||
try {
|
||||
await projectApi.delete(id) // 软删 → 回收站(可恢复)
|
||||
state.projects = state.projects.filter(p => p.id !== id)
|
||||
} catch (e: any) {
|
||||
state.error = e?.toString() ?? '删除项目失败'
|
||||
}
|
||||
}
|
||||
|
||||
async function loadDeletedProjects() {
|
||||
try {
|
||||
state.deletedProjects = await projectApi.listDeleted()
|
||||
} catch (e: any) {
|
||||
state.error = e?.toString() ?? '加载回收站失败'
|
||||
}
|
||||
}
|
||||
|
||||
async function restoreProject(id: string) {
|
||||
try {
|
||||
await projectApi.restore(id)
|
||||
state.deletedProjects = state.deletedProjects.filter(p => p.id !== id)
|
||||
await loadProjects() // 恢复后刷新活跃列表
|
||||
} catch (e: any) {
|
||||
state.error = e?.toString() ?? '恢复项目失败'
|
||||
}
|
||||
}
|
||||
|
||||
async function purgeProject(id: string) {
|
||||
try {
|
||||
await projectApi.purge(id) // 彻底删(级联物理删,不可恢复)
|
||||
state.deletedProjects = state.deletedProjects.filter(p => p.id !== id)
|
||||
} catch (e: any) {
|
||||
state.error = e?.toString() ?? '彻底删除失败'
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
loadProjects,
|
||||
createProject,
|
||||
importProject,
|
||||
updateProject,
|
||||
deleteProject,
|
||||
relocateProjectPath,
|
||||
loadDeletedProjects,
|
||||
restoreProject,
|
||||
purgeProject,
|
||||
// clearError 来自 state(供 barrel re-export)
|
||||
clearError,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user