import { NextRequest, NextResponse } from 'next/server'; import { db } from '@/lib/db'; import { users, bookings } from '@/lib/db/schema'; import { eq, desc, max, sql, and } from 'drizzle-orm'; import { getSession } from '@/lib/session'; import bcrypt from 'bcryptjs'; export async function GET(request: NextRequest) { try { const session = await getSession(); if (!session || session.role !== 'admin') { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } // Get all users with their last booking date using LEFT JOIN and GROUP BY const allUsers = await db .select({ id: users.id, name: users.name, surname: users.surname, email: users.email, role: users.role, createdAt: users.createdAt, lastBookingDate: max(bookings.date), }) .from(users) .leftJoin(bookings, and(eq(bookings.userId, users.id), eq(bookings.status, 'active'))) .groupBy(users.id, users.name, users.surname, users.email, users.role, users.createdAt); return NextResponse.json({ users: allUsers }); } catch (error) { console.error('Error fetching users:', error); return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); } } export async function POST(request: NextRequest) { try { const session = await getSession(); if (!session || session.role !== 'admin') { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } const { name, surname, email, password, role } = await request.json(); if (!name || !surname || !email || !password) { return NextResponse.json({ error: 'Missing required fields' }, { status: 400 }); } // Check if user already exists const existingUser = await db.select().from(users).where(eq(users.email, email)).limit(1); if (existingUser.length > 0) { return NextResponse.json({ error: 'User with this email already exists' }, { status: 400 }); } // Hash password const hashedPassword = await bcrypt.hash(password, 12); // Create user const [newUser] = await db .insert(users) .values({ id: crypto.randomUUID(), name, surname, email, password: hashedPassword, role: role || 'user', createdAt: new Date(), updatedAt: new Date(), }) .returning({ id: users.id, name: users.name, surname: users.surname, email: users.email, role: users.role, createdAt: users.createdAt, }); return NextResponse.json({ user: newUser, message: 'User created successfully' }); } catch (error) { console.error('Error creating user:', error); return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); } }