fix: enforce sub-notebook parentId, validate existingId, use getChatProvider, add move logging
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 1m27s

This commit is contained in:
Antigravity
2026-05-10 18:58:40 +00:00
parent c8b1e2d3ed
commit 085a2246f6

View File

@@ -187,7 +187,7 @@ Format de réponse JSON attendu:
/** /**
* Execute an approved organization plan: * Execute an approved organization plan:
* - Creates missing sub-notebooks * - Creates missing sub-notebooks (always as children of plan.notebookId)
* - Moves notes to the correct sub-notebook * - Moves notes to the correct sub-notebook
*/ */
export async function executeNotebookOrganization(plan: OrganizationPlan): Promise<ExecuteResult> { export async function executeNotebookOrganization(plan: OrganizationPlan): Promise<ExecuteResult> {
@@ -202,17 +202,38 @@ export async function executeNotebookOrganization(plan: OrganizationPlan): Promi
}) })
if (!notebook) return { success: false, created: 0, moved: 0, error: 'Carnet introuvable' } if (!notebook) return { success: false, created: 0, moved: 0, error: 'Carnet introuvable' }
console.log('[organize-notebook] Executing plan:', JSON.stringify({
notebookId: plan.notebookId,
groups: plan.groups.map(g => ({ name: g.name, isNew: g.isNew, existingId: g.existingId, noteCount: g.notes.length }))
}))
let created = 0 let created = 0
let moved = 0 let moved = 0
for (const group of plan.groups) { for (const group of plan.groups) {
let targetNotebookId: string let targetNotebookId: string
if (!group.isNew && group.existingId) { // Validate existingId: must be a real sub-notebook of plan.notebookId (not the parent itself)
// Use existing sub-notebook const validExistingId = group.existingId && group.existingId !== plan.notebookId
targetNotebookId = group.existingId ? group.existingId
} else { : undefined
// Create new sub-notebook
if (!group.isNew && validExistingId) {
// Verify it's actually a child of plan.notebookId
const verifiedSub = await prisma.notebook.findFirst({
where: { id: validExistingId, parentId: plan.notebookId, userId: session.user.id, trashedAt: null },
select: { id: true },
})
if (verifiedSub) {
targetNotebookId = verifiedSub.id
} else {
// Fall through to create a new sub-notebook
group.isNew = true
}
}
if (group.isNew || !targetNotebookId!) {
// Create new sub-notebook — always as a child of plan.notebookId
const highestOrder = await prisma.notebook.findFirst({ const highestOrder = await prisma.notebook.findFirst({
where: { parentId: plan.notebookId, userId: session.user.id }, where: { parentId: plan.notebookId, userId: session.user.id },
orderBy: { order: 'desc' }, orderBy: { order: 'desc' },
@@ -226,25 +247,27 @@ export async function executeNotebookOrganization(plan: OrganizationPlan): Promi
icon: '📁', icon: '📁',
color: '#75B2D6', color: '#75B2D6',
order: nextOrder, order: nextOrder,
parentId: plan.notebookId, parentId: plan.notebookId, // always a sub-notebook
userId: session.user.id, userId: session.user.id,
}, },
}) })
console.log(`[organize-notebook] Created sub-notebook "${newSub.name}" (id: ${newSub.id}) under ${plan.notebookId}`)
targetNotebookId = newSub.id targetNotebookId = newSub.id
created++ created++
} }
// Move notes // Move notes — update notebookId to the target sub-notebook
const noteIds = group.notes.map(n => n.id) const noteIds = group.notes.map(n => n.id)
if (noteIds.length > 0) { if (noteIds.length > 0) {
await prisma.note.updateMany({ const result = await prisma.note.updateMany({
where: { where: {
id: { in: noteIds }, id: { in: noteIds },
userId: session.user.id, userId: session.user.id,
}, },
data: { notebookId: targetNotebookId }, data: { notebookId: targetNotebookId },
}) })
moved += noteIds.length console.log(`[organize-notebook] Moved ${result.count} notes to "${group.name}"`)
moved += result.count
} }
} }