feat: stabilize admin dashboard, refactor group management, implement PWA, and fix routing

This commit is contained in:
2026-05-03 19:51:18 +05:00
parent 622ca04170
commit 0598e07823
36 changed files with 1387 additions and 467 deletions
+22 -11
View File
@@ -7,10 +7,10 @@ export default defineEventHandler(async (event) => {
const { taskId, canvasId, newState } = body
if (!taskId || !canvasId || !newState) {
throw createError({ statusCode: 400, message: 'taskId, canvasId and newState are required' })
throw createError({ statusCode: 400, message: 'Missing parameters' })
}
// 1. Найти холст
// 1. Получаем канвас
const canvas = await prisma.canvas.findUnique({
where: { id: canvasId }
})
@@ -19,7 +19,21 @@ export default defineEventHandler(async (event) => {
throw createError({ statusCode: 404, message: 'Canvas not found' })
}
// 2. Найти и обновить узел в JSON
// 2. Проверяем права на редактирование
const isOwner = canvas.ownerId === user.id
let isMember = false
if (canvas.groupId) {
const membership = await prisma.groupMember.findFirst({
where: { userId: user.id, groupId: canvas.groupId }
})
isMember = !!membership
}
if (!isOwner && !isMember && user.role !== 'admin') {
throw createError({ statusCode: 403, message: 'No permission to update this task' })
}
// 3. Обновляем узел внутри массива nodes
const nodes = (canvas.nodes as any[]) || []
const nodeIdx = nodes.findIndex(n => n.id === taskId)
@@ -29,18 +43,15 @@ export default defineEventHandler(async (event) => {
// Обновляем состояние
nodes[nodeIdx].state = newState
// Также обновляем дату изменения, если нужно
nodes[nodeIdx].updatedAt = new Date().toISOString()
if (nodes[nodeIdx].data) {
nodes[nodeIdx].data.state = newState
}
// 3. Сохранить изменения в БД
// 4. Сохраняем обратно в БД
await prisma.canvas.update({
where: { id: canvasId },
data: { nodes }
})
return {
success: true,
message: `Task ${taskId} moved to ${newState}`
}
return { success: true }
})