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