initial version of the app

This commit is contained in:
mikicvi
2025-09-21 17:11:02 +01:00
commit c8062cf96b
101 changed files with 23061 additions and 0 deletions
@@ -0,0 +1,55 @@
import { NextRequest, NextResponse } from 'next/server';
import { verifySession } from '@/lib/session';
import { db } from '@/lib/db';
import { bookings, users, courts } from '@/lib/db/schema';
import { eq, and, desc, gte } from 'drizzle-orm';
export async function GET(request: NextRequest) {
try {
const session = await verifySession();
if (!session.isAuth || !session.userId) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const today = new Date();
const todayStr = today.toISOString().split('T')[0];
// Get recent bookings for the current user with court and user details
const recentBookings = await db
.select({
id: bookings.id,
date: bookings.date,
startTime: bookings.startTime,
endTime: bookings.endTime,
status: bookings.status,
notes: bookings.notes,
createdAt: bookings.createdAt,
court: {
id: courts.id,
name: courts.name,
},
user: {
id: users.id,
name: users.name,
surname: users.surname,
email: users.email,
},
})
.from(bookings)
.innerJoin(courts, eq(bookings.courtId, courts.id))
.innerJoin(users, eq(bookings.userId, users.id))
.where(
and(eq(bookings.userId, session.userId), eq(bookings.status, 'active'), gte(bookings.date, todayStr))
)
.orderBy(desc(bookings.createdAt))
.limit(5);
return NextResponse.json({
success: true,
bookings: recentBookings,
});
} catch (error) {
console.error('Error fetching recent bookings:', error);
return NextResponse.json({ error: 'Failed to fetch recent bookings' }, { status: 500 });
}
}
+57
View File
@@ -0,0 +1,57 @@
import { NextRequest, NextResponse } from 'next/server';
import { db } from '@/lib/db';
import { users, bookings, courts } from '@/lib/db/schema';
import { eq, count, and, gte } from 'drizzle-orm';
import { getSession } from '@/lib/session';
export async function GET(request: NextRequest) {
try {
const session = await getSession();
if (!session) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
// Get current date
const today = new Date();
const todayStr = today.toISOString().split('T')[0];
// Get total users count
const [totalUsersResult] = await db.select({ count: count() }).from(users);
// Get today's bookings count
const [todayBookingsResult] = await db
.select({ count: count() })
.from(bookings)
.where(and(eq(bookings.date, todayStr), eq(bookings.status, 'active')));
// Get active courts count
const [activeCourtsResult] = await db.select({ count: count() }).from(courts).where(eq(courts.isActive, true));
// Get user's total bookings
const [userBookingsResult] = await db
.select({ count: count() })
.from(bookings)
.where(and(eq(bookings.userId, session.userId), eq(bookings.status, 'active')));
// Get user's upcoming bookings (today and future)
const [upcomingBookingsResult] = await db
.select({ count: count() })
.from(bookings)
.where(
and(eq(bookings.userId, session.userId), gte(bookings.date, todayStr), eq(bookings.status, 'active'))
);
return NextResponse.json({
stats: {
totalUsers: totalUsersResult.count,
todayBookings: todayBookingsResult.count,
activeCourts: activeCourtsResult.count,
userBookings: userBookingsResult.count,
upcomingBookings: upcomingBookingsResult.count,
},
});
} catch (error) {
console.error('Error fetching dashboard stats:', error);
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
}
}