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:
@@ -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<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 = {
|
||||
// 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 });
|
||||
|
||||
Reference in New Issue
Block a user