From ec70baa4989d8bb2edec80630a1366139a9b152c Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Sun, 16 Nov 2025 20:16:39 +0000 Subject: [PATCH] fix: add user creation logic to event controller - Add findOrCreateUser helper function to handle Clerk ID to database ID mapping - Update all authenticated endpoints to convert Clerk ID to database user ID - Ensures events can be created and managed by authenticated users - Matches pattern used in reportController --- server/src/controllers/eventController.ts | 74 +++++++++++++++++++---- 1 file changed, 62 insertions(+), 12 deletions(-) diff --git a/server/src/controllers/eventController.ts b/server/src/controllers/eventController.ts index c19dbc2..940a4b2 100644 --- a/server/src/controllers/eventController.ts +++ b/server/src/controllers/eventController.ts @@ -1,6 +1,43 @@ import { Response } from 'express'; import { AuthRequest } from '../middleware/auth'; import { eventService } from '../services/eventService'; +import prisma from '../config/database'; +import { clerkClient } from '@clerk/clerk-sdk-node'; + +// Helper to find or create user from Clerk ID +async function findOrCreateUser(clerkId: string): Promise { + // Check if user exists + let user = await prisma.user.findUnique({ + where: { clerkId }, + select: { id: true }, + }); + + if (user) { + return user.id; + } + + // User doesn't exist, fetch from Clerk and create + try { + const clerkUser = await clerkClient.users.getUser(clerkId); + + user = await prisma.user.create({ + data: { + clerkId, + email: clerkUser.emailAddresses[0]?.emailAddress || `${clerkId}@temp.com`, + username: clerkUser.username || `user_${clerkId.substring(0, 8)}`, + firstName: clerkUser.firstName, + lastName: clerkUser.lastName, + avatarUrl: clerkUser.imageUrl, + }, + select: { id: true }, + }); + + return user.id; + } catch (error) { + console.error('Error creating user from Clerk:', error); + throw new Error('Failed to create user'); + } +} export const eventController = { // Get all events with optional filters @@ -60,8 +97,8 @@ export const eventController = { // Create new event async createEvent(req: AuthRequest, res: Response) { try { - const userId = req.userId; - if (!userId) { + const clerkId = req.userId; + if (!clerkId) { return res.status(401).json({ code: 'UNAUTHORIZED', message: 'User not authenticated', @@ -69,6 +106,9 @@ export const eventController = { }); } + // Find or create user in database + const userId = await findOrCreateUser(clerkId); + const { title, description, latitude, longitude, locationName, scheduledDate, duration } = req.body; // Validation @@ -107,8 +147,8 @@ export const eventController = { // Update event async updateEvent(req: AuthRequest, res: Response) { try { - const userId = req.userId; - if (!userId) { + const clerkId = req.userId; + if (!clerkId) { return res.status(401).json({ code: 'UNAUTHORIZED', message: 'User not authenticated', @@ -116,6 +156,8 @@ export const eventController = { }); } + const userId = await findOrCreateUser(clerkId); + const { id } = req.params; const event = await eventService.getEventById(id); @@ -152,8 +194,8 @@ export const eventController = { // Delete event async deleteEvent(req: AuthRequest, res: Response) { try { - const userId = req.userId; - if (!userId) { + const clerkId = req.userId; + if (!clerkId) { return res.status(401).json({ code: 'UNAUTHORIZED', message: 'User not authenticated', @@ -161,6 +203,8 @@ export const eventController = { }); } + const userId = await findOrCreateUser(clerkId); + const { id } = req.params; const event = await eventService.getEventById(id); @@ -197,8 +241,8 @@ export const eventController = { // Register for event async registerForEvent(req: AuthRequest, res: Response) { try { - const userId = req.userId; - if (!userId) { + const clerkId = req.userId; + if (!clerkId) { return res.status(401).json({ code: 'UNAUTHORIZED', message: 'User not authenticated', @@ -206,6 +250,8 @@ export const eventController = { }); } + const userId = await findOrCreateUser(clerkId); + const { id } = req.params; const registration = await eventService.registerForEvent(id, userId); res.status(201).json(registration); @@ -232,8 +278,8 @@ export const eventController = { // Unregister from event async unregisterFromEvent(req: AuthRequest, res: Response) { try { - const userId = req.userId; - if (!userId) { + const clerkId = req.userId; + if (!clerkId) { return res.status(401).json({ code: 'UNAUTHORIZED', message: 'User not authenticated', @@ -241,6 +287,8 @@ export const eventController = { }); } + const userId = await findOrCreateUser(clerkId); + const { id } = req.params; await eventService.unregisterFromEvent(id, userId); res.status(204).send(); @@ -275,11 +323,13 @@ export const eventController = { // Check registration status async getRegistrationStatus(req: AuthRequest, res: Response) { try { - const userId = req.userId; - if (!userId) { + const clerkId = req.userId; + if (!clerkId) { return res.json({ registered: false }); } + const userId = await findOrCreateUser(clerkId); + const { id } = req.params; const isRegistered = await eventService.isUserRegistered(id, userId); res.json({ registered: isRegistered });