75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { prisma } from '@/lib/db'
|
|
import { getSession } from '@/lib/auth'
|
|
|
|
export async function GET() {
|
|
try {
|
|
const user = await getSession()
|
|
|
|
// Build icon filter: global icons (tenantId=null) + tenant-specific icons
|
|
const iconFilter: any = { isActive: true }
|
|
if (user?.tenantId) {
|
|
iconFilter.OR = [
|
|
{ tenantId: null },
|
|
{ tenantId: user.tenantId },
|
|
]
|
|
delete iconFilter.isActive
|
|
iconFilter.AND = [{ isActive: true }]
|
|
} else {
|
|
// Server admin or no tenant: show all global icons
|
|
iconFilter.tenantId = null
|
|
}
|
|
|
|
// Filter categories: global (tenantId=null) + tenant-specific
|
|
const categoryWhere: any = user?.tenantId
|
|
? { OR: [{ tenantId: null }, { tenantId: user.tenantId }] }
|
|
: {}
|
|
|
|
const categories = await (prisma as any).iconCategory.findMany({
|
|
where: categoryWhere,
|
|
orderBy: { sortOrder: 'asc' },
|
|
include: {
|
|
icons: {
|
|
where: user?.tenantId
|
|
? { isActive: true, OR: [{ tenantId: null }, { tenantId: user.tenantId }] }
|
|
: { isActive: true },
|
|
orderBy: { name: 'asc' },
|
|
},
|
|
},
|
|
})
|
|
|
|
// Get tenant's hidden icon IDs (legacy) + TenantSymbol overrides
|
|
let hiddenIconIds: string[] = []
|
|
let deactivatedIconIds = new Set<string>()
|
|
if (user?.tenantId) {
|
|
const [tenant, tenantSymbols] = await Promise.all([
|
|
(prisma as any).tenant.findUnique({
|
|
where: { id: user.tenantId },
|
|
select: { hiddenIconIds: true },
|
|
}),
|
|
(prisma as any).tenantSymbol.findMany({
|
|
where: { tenantId: user.tenantId, isActive: false },
|
|
select: { iconId: true },
|
|
}),
|
|
])
|
|
hiddenIconIds = tenant?.hiddenIconIds || []
|
|
deactivatedIconIds = new Set(tenantSymbols.map((ts: any) => ts.iconId))
|
|
}
|
|
|
|
const categoriesWithUrls = categories.map((cat: any) => ({
|
|
...cat,
|
|
icons: cat.icons
|
|
.filter((icon: any) => !hiddenIconIds.includes(icon.id) && !deactivatedIconIds.has(icon.id))
|
|
.map((icon: any) => ({
|
|
...icon,
|
|
url: `/api/icons/${icon.id}/image`,
|
|
})),
|
|
}))
|
|
|
|
return NextResponse.json({ categories: categoriesWithUrls })
|
|
} catch (error) {
|
|
console.error('Error fetching icons:', error)
|
|
return NextResponse.json({ error: 'Serverfehler' }, { status: 500 })
|
|
}
|
|
}
|