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
This commit is contained in:
2025-11-16 20:16:39 +00:00
parent 88117567ab
commit ec70baa498

View File

@@ -1,6 +1,43 @@
import { Response } from 'express'; import { Response } from 'express';
import { AuthRequest } from '../middleware/auth'; import { AuthRequest } from '../middleware/auth';
import { eventService } from '../services/eventService'; 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<string> {
// 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 = { export const eventController = {
// Get all events with optional filters // Get all events with optional filters
@@ -60,8 +97,8 @@ export const eventController = {
// Create new event // Create new event
async createEvent(req: AuthRequest, res: Response) { async createEvent(req: AuthRequest, res: Response) {
try { try {
const userId = req.userId; const clerkId = req.userId;
if (!userId) { if (!clerkId) {
return res.status(401).json({ return res.status(401).json({
code: 'UNAUTHORIZED', code: 'UNAUTHORIZED',
message: 'User not authenticated', 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; const { title, description, latitude, longitude, locationName, scheduledDate, duration } = req.body;
// Validation // Validation
@@ -107,8 +147,8 @@ export const eventController = {
// Update event // Update event
async updateEvent(req: AuthRequest, res: Response) { async updateEvent(req: AuthRequest, res: Response) {
try { try {
const userId = req.userId; const clerkId = req.userId;
if (!userId) { if (!clerkId) {
return res.status(401).json({ return res.status(401).json({
code: 'UNAUTHORIZED', code: 'UNAUTHORIZED',
message: 'User not authenticated', message: 'User not authenticated',
@@ -116,6 +156,8 @@ export const eventController = {
}); });
} }
const userId = await findOrCreateUser(clerkId);
const { id } = req.params; const { id } = req.params;
const event = await eventService.getEventById(id); const event = await eventService.getEventById(id);
@@ -152,8 +194,8 @@ export const eventController = {
// Delete event // Delete event
async deleteEvent(req: AuthRequest, res: Response) { async deleteEvent(req: AuthRequest, res: Response) {
try { try {
const userId = req.userId; const clerkId = req.userId;
if (!userId) { if (!clerkId) {
return res.status(401).json({ return res.status(401).json({
code: 'UNAUTHORIZED', code: 'UNAUTHORIZED',
message: 'User not authenticated', message: 'User not authenticated',
@@ -161,6 +203,8 @@ export const eventController = {
}); });
} }
const userId = await findOrCreateUser(clerkId);
const { id } = req.params; const { id } = req.params;
const event = await eventService.getEventById(id); const event = await eventService.getEventById(id);
@@ -197,8 +241,8 @@ export const eventController = {
// Register for event // Register for event
async registerForEvent(req: AuthRequest, res: Response) { async registerForEvent(req: AuthRequest, res: Response) {
try { try {
const userId = req.userId; const clerkId = req.userId;
if (!userId) { if (!clerkId) {
return res.status(401).json({ return res.status(401).json({
code: 'UNAUTHORIZED', code: 'UNAUTHORIZED',
message: 'User not authenticated', message: 'User not authenticated',
@@ -206,6 +250,8 @@ export const eventController = {
}); });
} }
const userId = await findOrCreateUser(clerkId);
const { id } = req.params; const { id } = req.params;
const registration = await eventService.registerForEvent(id, userId); const registration = await eventService.registerForEvent(id, userId);
res.status(201).json(registration); res.status(201).json(registration);
@@ -232,8 +278,8 @@ export const eventController = {
// Unregister from event // Unregister from event
async unregisterFromEvent(req: AuthRequest, res: Response) { async unregisterFromEvent(req: AuthRequest, res: Response) {
try { try {
const userId = req.userId; const clerkId = req.userId;
if (!userId) { if (!clerkId) {
return res.status(401).json({ return res.status(401).json({
code: 'UNAUTHORIZED', code: 'UNAUTHORIZED',
message: 'User not authenticated', message: 'User not authenticated',
@@ -241,6 +287,8 @@ export const eventController = {
}); });
} }
const userId = await findOrCreateUser(clerkId);
const { id } = req.params; const { id } = req.params;
await eventService.unregisterFromEvent(id, userId); await eventService.unregisterFromEvent(id, userId);
res.status(204).send(); res.status(204).send();
@@ -275,11 +323,13 @@ export const eventController = {
// Check registration status // Check registration status
async getRegistrationStatus(req: AuthRequest, res: Response) { async getRegistrationStatus(req: AuthRequest, res: Response) {
try { try {
const userId = req.userId; const clerkId = req.userId;
if (!userId) { if (!clerkId) {
return res.json({ registered: false }); return res.json({ registered: false });
} }
const userId = await findOrCreateUser(clerkId);
const { id } = req.params; const { id } = req.params;
const isRegistered = await eventService.isUserRegistered(id, userId); const isRegistered = await eventService.isUserRegistered(id, userId);
res.json({ registered: isRegistered }); res.json({ registered: isRegistered });