Sessions 5-7a: 955 tests, deployment ready

This commit is contained in:
Kev
2026-06-08 18:35:13 -04:00
parent 06b82624a2
commit 1fa04dc776
371 changed files with 49366 additions and 955 deletions
+55
View File
@@ -0,0 +1,55 @@
import { NextRequest, NextResponse } from 'next/server';
import { getUserFromRequest, jsonError } from '@/lib/auth-helpers';
import { getServiceRoleSupabase } from '@/lib/supabase';
export const dynamic = 'force-dynamic';
export async function GET(req: NextRequest) {
const user = await getUserFromRequest(req);
if (!user) return jsonError(401, 'Not signed in.');
const sb = getServiceRoleSupabase();
if (!sb) return jsonError(500, 'Server is misconfigured.');
const { data, error } = await sb
.from('user_profiles')
.select('id, email, tier, scan_count, scan_reset_date, subscription_status, subscription_end, founder_pricing, cancel_at_period_end')
.eq('id', user.id)
.maybeSingle();
if (error) {
return jsonError(500, error.message);
}
return NextResponse.json(data ?? { id: user.id, email: user.email, tier: 'free' });
}
export async function PUT(req: NextRequest) {
const user = await getUserFromRequest(req);
if (!user) return jsonError(401, 'Not signed in.');
let body: { age_verified?: boolean; cancel_at_period_end?: boolean };
try {
body = await req.json();
} catch {
return jsonError(400, 'Invalid JSON body.');
}
const sb = getServiceRoleSupabase();
if (!sb) return jsonError(500, 'Server is misconfigured.');
const update: Record<string, unknown> = {};
if (typeof body.age_verified === 'boolean') update.age_verified = body.age_verified;
if (typeof body.cancel_at_period_end === 'boolean') update.cancel_at_period_end = body.cancel_at_period_end;
if (Object.keys(update).length === 0) return jsonError(400, 'Nothing to update.');
const { data, error } = await sb
.from('user_profiles')
.update(update)
.eq('id', user.id)
.select()
.single();
if (error) return jsonError(500, error.message);
return NextResponse.json(data);
}
@@ -0,0 +1,23 @@
import { NextRequest, NextResponse } from 'next/server';
import { getUserFromRequest, jsonError } from '@/lib/auth-helpers';
import { getServiceRoleSupabase } from '@/lib/supabase';
export const dynamic = 'force-dynamic';
export async function GET(req: NextRequest) {
const user = await getUserFromRequest(req);
if (!user) return jsonError(401, 'Not signed in.');
const sb = getServiceRoleSupabase();
if (!sb) return NextResponse.json({ scans: [] });
const { data, error } = await sb
.from('scan_history')
.select('id, sport, player_name, stat, line, direction, grade, created_at')
.eq('user_id', user.id)
.order('created_at', { ascending: false })
.limit(10);
if (error) return jsonError(500, error.message);
return NextResponse.json({ scans: data ?? [] });
}
+37
View File
@@ -0,0 +1,37 @@
import { NextRequest, NextResponse } from 'next/server';
import { getUserFromRequest, jsonError } from '@/lib/auth-helpers';
import { getServiceRoleSupabase } from '@/lib/supabase';
export const dynamic = 'force-dynamic';
const FREE_LIMIT = 5; // reads per calendar month
const monthKey = () => new Date().toISOString().slice(0, 7) + '-01';
const isSameMonth = (date: string | null | undefined) =>
!!date && date.slice(0, 7) === new Date().toISOString().slice(0, 7);
export async function GET(req: NextRequest) {
const user = await getUserFromRequest(req);
if (!user) return jsonError(401, 'Not signed in.');
const sb = getServiceRoleSupabase();
if (!sb) return jsonError(500, 'Server is misconfigured.');
const { data: profile } = await sb
.from('user_profiles')
.select('tier, scan_count, scan_reset_date')
.eq('id', user.id)
.maybeSingle();
const tier = (profile?.tier as 'free' | 'analyst' | 'desk') ?? 'free';
const usedThisMonth = isSameMonth(profile?.scan_reset_date) ? (profile?.scan_count ?? 0) : 0;
const remaining = tier === 'free' ? Math.max(0, FREE_LIMIT - usedThisMonth) : null;
return NextResponse.json({
tier,
used_this_month: usedThisMonth,
remaining,
limit: tier === 'free' ? FREE_LIMIT : null,
reset_date: monthKey(),
period: 'monthly',
});
}