@@ -3,8 +3,6 @@ import crypto from "crypto";
33import supabase from "@/lib/supabase" ;
44import { rateLimit } from "@/lib/rate-limiter" ;
55
6-
7-
86interface Badge {
97 id : string ;
108 name : string ;
@@ -13,8 +11,6 @@ interface Badge {
1311 points : number ;
1412}
1513
16-
17-
1814// Input validation helpers
1915const 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
563558export async function POST ( request : Request ) {
564559 const { searchParams } = new URL ( request . url ) ;
0 commit comments