56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
import { requireAuth } from '~/server/utils/auth'
|
|
import { prisma } from '~/server/utils/prisma'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = requireAuth(event)
|
|
|
|
// 1. Получаем группы пользователя
|
|
const userGroups = await prisma.groupMember.findMany({
|
|
where: { userId: user.id },
|
|
select: { groupId: true }
|
|
})
|
|
const groupIds = userGroups.map(g => g.groupId)
|
|
|
|
// 2. Получаем все доступные канвасы
|
|
const canvases = await prisma.canvas.findMany({
|
|
where: {
|
|
OR: [
|
|
{ ownerId: user.id },
|
|
{ groupId: { in: groupIds } },
|
|
{ isPublic: true }
|
|
]
|
|
},
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
nodes: true
|
|
}
|
|
})
|
|
|
|
// 3. Собираем задачи из всех канвасов
|
|
const allTasks: any[] = []
|
|
|
|
for (const canvas of canvases) {
|
|
const nodes = (canvas.nodes as any[]) || []
|
|
const taskNodes = nodes.filter(node => node.type === 'task')
|
|
|
|
taskNodes.forEach(task => {
|
|
allTasks.push({
|
|
...task,
|
|
canvasId: canvas.id,
|
|
canvasName: canvas.name
|
|
})
|
|
})
|
|
}
|
|
|
|
// Сортируем: сначала высокий приоритет, потом дата
|
|
allTasks.sort((a, b) => {
|
|
const pPriority = { high: 3, medium: 2, low: 1 }
|
|
const prioA = pPriority[a.priority || a.data?.priority] || 0
|
|
const prioB = pPriority[b.priority || b.data?.priority] || 0
|
|
return prioB - prioA
|
|
})
|
|
|
|
return { tasks: allTasks }
|
|
})
|