Sessions 5-7a: 955 tests, deployment ready
This commit is contained in:
@@ -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 ?? [] });
|
||||
}
|
||||
@@ -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',
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user