feat(0.2.1): M2 服务端同步接入 —— /api/powersync token+upload 幂等上行, 项目/任务/拷贝链路接入 uuid 与编号分配 (identity 助手)

This commit is contained in:
jif2.zhang
2026-10-25 23:49:09 +08:00
parent 61d3028909
commit a4ab22588c
6 changed files with 547 additions and 45 deletions
+25 -17
View File
@@ -1,6 +1,7 @@
// 任务模块: 跨项目拷贝 (T-CP-*)
// 拷贝而非移动: 新建记录 + 深拷贝子任务, 源任务零改动.
import { prisma } from '../db.js'
import { genUuid, withUuid, withTaskNumber } from './identity.js'
/**
* 拷贝一条任务(含子任务)到目标项目。
@@ -38,6 +39,7 @@ export async function copyTask({ source, targetProject, targetColumns, operatorI
const droppedAssignee = source.assigneeId && !memberSet.has(source.assigneeId) ? source.assignee : null
const baseData = (extra) => ({
uuid: genUuid(),
projectId: targetProject.id,
title: source.title,
description: source.description || '',
@@ -50,33 +52,39 @@ export async function copyTask({ source, targetProject, targetColumns, operatorI
doneAt: source.status === 'done' ? (source.doneAt || new Date()) : null,
sortOrder: source.sortOrder ?? 0,
tags: {
create: (source.tags || []).map((t) => ({ name: t.name })),
create: withUuid((source.tags || []).map((t) => ({ name: t.name }))),
},
})
const newTask = await prisma.task.create({
data: {
...baseData({ columnId: pickColumn(source.columnId) }),
members: {
create: keptMemberIds.map((uid) => ({ userId: uid })),
const { value: newTask } = await withTaskNumber(targetProject.id, (number) =>
prisma.task.create({
data: {
...baseData({ columnId: pickColumn(source.columnId) }),
number,
members: {
create: withUuid(keptMemberIds.map((uid) => ({ userId: uid }))),
},
},
},
})
}),
)
// 子任务: 同法复制, parentId 指向新父任务
for (const child of source.children || []) {
const childMembers = (child.members || [])
.filter((m) => memberSet.has(m.userId))
.map((m) => m.userId)
await prisma.task.create({
data: {
...baseData({
columnId: pickColumn(child.columnId),
parentId: newTask.id,
}),
members: { create: childMembers.map((uid) => ({ userId: uid })) },
},
})
await withTaskNumber(targetProject.id, (number) =>
prisma.task.create({
data: {
...baseData({
columnId: pickColumn(child.columnId),
parentId: newTask.id,
}),
number,
members: { create: withUuid(childMembers.map((uid) => ({ userId: uid }))) },
},
}),
)
}
return {