Skip to content

Commit c70dea3

Browse files
committed
test
1 parent 86c9407 commit c70dea3

File tree

1 file changed

+94
-99
lines changed

1 file changed

+94
-99
lines changed

app/api/users/route.tsx

Lines changed: 94 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import crypto from "crypto";
33
import supabase from "@/lib/supabase";
44
import { rateLimit } from "@/lib/rate-limiter";
55

6-
7-
86
interface Badge {
97
id: string;
108
name: string;
@@ -13,8 +11,6 @@ interface Badge {
1311
points: number;
1412
}
1513

16-
17-
1814
// Input validation helpers
1915
const validateEmail = (email: string): boolean => {
2016
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -51,95 +47,8 @@ const generateSalt = (): string => {
5147
return crypto.randomBytes(32).toString("hex");
5248
};
5349

54-
55-
// GET: Retrieve users (with proper authorization)
56-
export async function GET(request: Request) {
57-
try {
58-
// Apply rate limiting
59-
const rateLimitResult = await rateLimit(request, 'users_get');
60-
if (!rateLimitResult.success) {
61-
return NextResponse.json(
62-
{ error: "Too many requests" },
63-
{ status: 429 }
64-
);
65-
}
66-
67-
const { searchParams } = new URL(request.url);
68-
const userId = searchParams.get("id");
69-
const username = searchParams.get("username");
70-
const leaderboard = searchParams.get("leaderboard");
71-
72-
// Sanitize inputs
73-
const sanitizedUserId = userId ? sanitizeInput(userId) : null;
74-
const sanitizedUsername = username ? sanitizeInput(username) : null;
75-
76-
if (sanitizedUserId) {
77-
const { data: user, error } = await supabase
78-
.from('users')
79-
.select('id, username, display_name, points, level, badges, created_at, avatar_url')
80-
.eq('id', sanitizedUserId)
81-
.single();
82-
83-
if (error || !user) {
84-
return NextResponse.json({ error: "User not found" }, { status: 404 });
85-
}
86-
87-
return NextResponse.json(user);
88-
}
89-
90-
if (sanitizedUsername) {
91-
const { data: user, error } = await supabase
92-
.from('users')
93-
.select('id, username, display_name, points, level, badges, created_at, avatar_url')
94-
.ilike('username', sanitizedUsername)
95-
.single();
96-
97-
if (error || !user) {
98-
return NextResponse.json({ error: "User not found" }, { status: 404 });
99-
}
100-
101-
return NextResponse.json(user);
102-
}
103-
104-
if (leaderboard) {
105-
const { data: users, error } = await supabase
106-
.from('users')
107-
.select('id, username, display_name, points, badges, level, avatar_url')
108-
.order('points', { ascending: false })
109-
.limit(10);
110-
111-
if (error) {
112-
return NextResponse.json({
113-
error: "Failed to get leaderboard"
114-
}, { status: 500 });
115-
}
116-
117-
return NextResponse.json(users || []);
118-
}
119-
120-
// Return limited user info for general requests
121-
const { data: users, error } = await supabase
122-
.from('users')
123-
.select('id, username, display_name, points, level, created_at, avatar_url')
124-
.limit(50); // Limit to prevent large data dumps
125-
126-
if (error) {
127-
return NextResponse.json({
128-
error: "Failed to get users"
129-
}, { status: 500 });
130-
}
131-
132-
return NextResponse.json(users || []);
133-
} catch (error) {
134-
console.error("Error in GET users route:", error);
135-
return NextResponse.json({
136-
error: "Internal server error"
137-
}, { status: 500 });
138-
}
139-
}
140-
141-
// Create user (Registration)
142-
export async function createUser(request: Request) {
50+
// Create user (Registration) - NOT EXPORTED
51+
async function createUser(request: Request) {
14352
try {
14453
// Apply rate limiting
14554
const rateLimitResult = await rateLimit(request, 'users_create');
@@ -277,8 +186,8 @@ export async function createUser(request: Request) {
277186
}
278187
}
279188

280-
// Login
281-
export async function loginUser(request: Request) {
189+
// Login - NOT EXPORTED
190+
async function loginUser(request: Request) {
282191
try {
283192
// Apply rate limiting
284193
const rateLimitResult = await rateLimit(request, 'users_login');
@@ -357,8 +266,8 @@ export async function loginUser(request: Request) {
357266
}
358267
}
359268

360-
// Update user (with proper authorization)
361-
export async function updateUser(request: Request) {
269+
// Update user (with proper authorization) - NOT EXPORTED
270+
async function updateUser(request: Request) {
362271
try {
363272
// Apply rate limiting
364273
const rateLimitResult = await rateLimit(request, 'users_update');
@@ -477,8 +386,8 @@ export async function updateUser(request: Request) {
477386
}
478387
}
479388

480-
// Check badges (with proper authorization)
481-
export async function checkBadges(request: Request) {
389+
// Check badges (with proper authorization) - NOT EXPORTED
390+
async function checkBadges(request: Request) {
482391
try {
483392
const body = await request.json();
484393
const { userId } = body;
@@ -559,6 +468,92 @@ export async function checkBadges(request: Request) {
559468
}
560469
}
561470

471+
// GET: Retrieve users (with proper authorization)
472+
export async function GET(request: Request) {
473+
try {
474+
// Apply rate limiting
475+
const rateLimitResult = await rateLimit(request, 'users_get');
476+
if (!rateLimitResult.success) {
477+
return NextResponse.json(
478+
{ error: "Too many requests" },
479+
{ status: 429 }
480+
);
481+
}
482+
483+
const { searchParams } = new URL(request.url);
484+
const userId = searchParams.get("id");
485+
const username = searchParams.get("username");
486+
const leaderboard = searchParams.get("leaderboard");
487+
488+
// Sanitize inputs
489+
const sanitizedUserId = userId ? sanitizeInput(userId) : null;
490+
const sanitizedUsername = username ? sanitizeInput(username) : null;
491+
492+
if (sanitizedUserId) {
493+
const { data: user, error } = await supabase
494+
.from('users')
495+
.select('id, username, display_name, points, level, badges, created_at, avatar_url')
496+
.eq('id', sanitizedUserId)
497+
.single();
498+
499+
if (error || !user) {
500+
return NextResponse.json({ error: "User not found" }, { status: 404 });
501+
}
502+
503+
return NextResponse.json(user);
504+
}
505+
506+
if (sanitizedUsername) {
507+
const { data: user, error } = await supabase
508+
.from('users')
509+
.select('id, username, display_name, points, level, badges, created_at, avatar_url')
510+
.ilike('username', sanitizedUsername)
511+
.single();
512+
513+
if (error || !user) {
514+
return NextResponse.json({ error: "User not found" }, { status: 404 });
515+
}
516+
517+
return NextResponse.json(user);
518+
}
519+
520+
if (leaderboard) {
521+
const { data: users, error } = await supabase
522+
.from('users')
523+
.select('id, username, display_name, points, badges, level, avatar_url')
524+
.order('points', { ascending: false })
525+
.limit(10);
526+
527+
if (error) {
528+
return NextResponse.json({
529+
error: "Failed to get leaderboard"
530+
}, { status: 500 });
531+
}
532+
533+
return NextResponse.json(users || []);
534+
}
535+
536+
// Return limited user info for general requests
537+
const { data: users, error } = await supabase
538+
.from('users')
539+
.select('id, username, display_name, points, level, created_at, avatar_url')
540+
.limit(50); // Limit to prevent large data dumps
541+
542+
if (error) {
543+
return NextResponse.json({
544+
error: "Failed to get users"
545+
}, { status: 500 });
546+
}
547+
548+
return NextResponse.json(users || []);
549+
} catch (error) {
550+
console.error("Error in GET users route:", error);
551+
return NextResponse.json({
552+
error: "Internal server error"
553+
}, { status: 500 });
554+
}
555+
}
556+
562557
// Single POST handler
563558
export async function POST(request: Request) {
564559
const { searchParams } = new URL(request.url);

0 commit comments

Comments
 (0)