Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .env
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
CILOGON_CLIENT_IDENTIFIER=cilogon:/client_id/3797793e01ddfd2ebf80aebebbdd4626
# Created by Vercel CLI
NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InFhcmpobGF3cnVvaXpnc3dnbnRnIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDM2Mjg1NDAsImV4cCI6MjA1OTIwNDU0MH0.HZHTUP6Fd3s3mdS0OzChT-40t9QSs1YI-8MxmcJmji0"
NEXT_PUBLIC_SUPABASE_URL="https://qarjhlawruoizgswgntg.supabase.co"
PRIVATE_EVENTS_MANAGE_KEY="cs124hfa25A"
VERCEL_OIDC_TOKEN="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Im1yay00MzAyZWMxYjY3MGY0OGE5OGFkNjFkYWRlNGEyM2JlNyJ9.eyJpc3MiOiJodHRwczovL29pZGMudmVyY2VsLmNvbS9jczEyNGhvbm9ycy1jb2RlcnMtcHJvamVjdHMiLCJzdWIiOiJvd25lcjpjczEyNGhvbm9ycy1jb2RlcnMtcHJvamVjdHM6cHJvamVjdDpjczEyNGgtc2l0ZTplbnZpcm9ubWVudDpkZXZlbG9wbWVudCIsInNjb3BlIjoib3duZXI6Y3MxMjRob25vcnMtY29kZXJzLXByb2plY3RzOnByb2plY3Q6Y3MxMjRoLXNpdGU6ZW52aXJvbm1lbnQ6ZGV2ZWxvcG1lbnQiLCJhdWQiOiJodHRwczovL3ZlcmNlbC5jb20vY3MxMjRob25vcnMtY29kZXJzLXByb2plY3RzIiwib3duZXIiOiJjczEyNGhvbm9ycy1jb2RlcnMtcHJvamVjdHMiLCJvd25lcl9pZCI6InRlYW1fMVNNUjU5QlRSNkJPTWoxbW9xbnQzQ0kwIiwicHJvamVjdCI6ImNzMTI0aC1zaXRlIiwicHJvamVjdF9pZCI6InByal9XVHMwU2VFWWpQRDhnVnFrN291WHE5elFCSGw2IiwiZW52aXJvbm1lbnQiOiJkZXZlbG9wbWVudCIsInBsYW4iOiJob2JieSIsInVzZXJfaWQiOiJ4VFY2b2ltSW8xc1pvWlRRcjZUcnpQZEsiLCJuYmYiOjE3NjM0MTcxMTUsImlhdCI6MTc2MzQxNzExNSwiZXhwIjoxNzYzNDYwMzE1fQ.fEEZSsoMmJACSNMTuMTWHSa7fXb1pmd9JWdgyg6H2sAtGx2KGAfkb_aPBcQWUZ4vlDL1lDZN3Yd1DbhV__3ifDOCRozkXv7yv15Bc3UfAEnPzlOXabhnSg16ZKOtb0AGbjQYM3hGddMb7w4ZhtfRywOvi7e5zPqGt0s8qtV0pcHvDGeAFzBaYXoijyob4nQFX4KkcfdG2zUQhAQapJeGhtRkRdVYk-uy5b7jJ3QE_hfA_oZSRlsjHsqdE8NUPD0oTdkevJFxd7VUr4Q8cQwaPnZb7eps_3V7xp0Ik3j903NSybfww3MWAvslkuo0G_960dKQMZBGvwsJCGGEHvA1rQ"
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ pnpm-debug.log*
.DS_Store
.idea/
.vscode/
.vercel
.env*.local
48 changes: 48 additions & 0 deletions app/api/auth/admin/route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { NextResponse } from 'next/server';

/**
* POST /api/auth/admin
* Validates admin code
* Body: { admin_code }
*/
export async function POST(request) {
try {
const body = await request.json();
const { admin_code } = body;

// Get admin code from environment variable
const ADMIN_CODE = process.env.PRIVATE_EVENTS_MANAGE_KEY;

if (!admin_code) {
return NextResponse.json(
{ error: 'Admin code is required' },
{ status: 400 }
);
}

if (admin_code === ADMIN_CODE) {
// Generate a simple session token (in production, use JWT or proper session management)
const sessionToken = Buffer.from(`${admin_code}_${Date.now()}`).toString('base64');

return NextResponse.json(
{
success: true,
message: 'Admin authentication successful',
token: sessionToken
},
{ status: 200 }
);
} else {
return NextResponse.json(
{ error: 'Invalid admin code' },
{ status: 401 }
);
}
} catch (error) {
console.error('Admin auth error:', error);
return NextResponse.json(
{ error: 'Internal server error', details: error.message },
{ status: 500 }
);
}
}
138 changes: 138 additions & 0 deletions app/api/events/[id]/route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
import { NextResponse } from 'next/server';
import { supabase } from '../../../../lib/supbaseClient';

/**
* GET /api/events/[id]
* Get a single event by ID
*/
export async function GET(request, { params }) {
try {
const { id } = await params;

const { data: event, error } = await supabase
.from('events')
.select('*')
.eq('id', id)
.single();

if (error || !event) {
return NextResponse.json(
{ error: 'Event not found' },
{ status: 404 }
);
}

return NextResponse.json({ event }, { status: 200 });
} catch (error) {
console.error('Error fetching event:', error);
return NextResponse.json(
{ error: 'Internal server error', details: error.message },
{ status: 500 }
);
}
}

/**
* PUT /api/events/[id]
* Update an event
* Body: { title, description, location, presenter, start_time, end_time, point_value, qr_code_secret, join_link }
*/
export async function PUT(request, { params }) {
try {
const { id } = await params;
const body = await request.json();
const {
title,
description,
location,
presenter,
start_time,
end_time,
point_value,
qr_code_secret,
join_link,
is_active
} = body;

// Validate required fields
if (!title || !start_time || !end_time) {
return NextResponse.json(
{ error: 'Missing required fields: title, start_time, end_time' },
{ status: 400 }
);
}

const updateData = {
title,
description,
location,
presenter,
start_time,
end_time,
point_value,
qr_code_secret,
join_link
};

if (is_active !== undefined) {
updateData.is_active = is_active;
}

const { data: event, error } = await supabase
.from('events')
.update(updateData)
.eq('id', id)
.select()
.single();

if (error) {
console.error('Error updating event:', error);
return NextResponse.json(
{ error: 'Failed to update event', details: error.message },
{ status: 500 }
);
}

return NextResponse.json({ event }, { status: 200 });
} catch (error) {
console.error('Unexpected error:', error);
return NextResponse.json(
{ error: 'Internal server error', details: error.message },
{ status: 500 }
);
}
}

/**
* DELETE /api/events/[id]
* Delete an event
*/
export async function DELETE(request, { params }) {
try {
const { id } = await params;

const { error } = await supabase
.from('events')
.delete()
.eq('id', id);

if (error) {
console.error('Error deleting event:', error);
return NextResponse.json(
{ error: 'Failed to delete event', details: error.message },
{ status: 500 }
);
}

return NextResponse.json(
{ success: true, message: 'Event deleted successfully' },
{ status: 200 }
);
} catch (error) {
console.error('Unexpected error:', error);
return NextResponse.json(
{ error: 'Internal server error', details: error.message },
{ status: 500 }
);
}
}
Loading