47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
import { requireAuth } from '~/server/utils/auth'
|
|
import { canvases } from '~/server/utils/db'
|
|
import type { CanvasData } from '~/server/utils/db'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = requireAuth(event)
|
|
const id = getRouterParam(event, 'id')
|
|
|
|
if (!id) {
|
|
throw createError({ statusCode: 400, message: 'Canvas ID is required' })
|
|
}
|
|
|
|
const original = canvases.get(id)
|
|
if (!original) {
|
|
throw createError({ statusCode: 404, message: 'Canvas not found' })
|
|
}
|
|
|
|
// Check permissions
|
|
if (original.ownerId !== user.id && !original.isPublic) {
|
|
throw createError({ statusCode: 403, message: 'Access denied' })
|
|
}
|
|
|
|
const newId = `canvas-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`
|
|
const duplicate: CanvasData = {
|
|
...original,
|
|
id: newId,
|
|
name: `${original.name} (Copy)`,
|
|
ownerId: user.id,
|
|
groupId: undefined, // Duplicates are personal
|
|
isPublic: false,
|
|
createdAt: new Date().toISOString(),
|
|
updatedAt: new Date().toISOString(),
|
|
nodes: original.nodes.map(node => ({
|
|
...node,
|
|
id: `${node.id}-copy-${Date.now()}`
|
|
})),
|
|
edges: original.edges.map(edge => ({
|
|
...edge,
|
|
id: `${edge.id}-copy-${Date.now()}`
|
|
}))
|
|
}
|
|
|
|
canvases.set(newId, duplicate)
|
|
|
|
return { canvas: duplicate }
|
|
})
|