Skip to content

Commit dc0783c

Browse files
committed
separate routes for hosted events and invited events
1 parent 7856c93 commit dc0783c

File tree

2 files changed

+196
-11
lines changed

2 files changed

+196
-11
lines changed

src/routes/eventRoutes.ts

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,31 +14,45 @@ import {
1414
addCorporateDetails,
1515
addCollegeDetails,
1616
addOtherDetails,
17-
getAllUserEvents
17+
getAllUserEvents,
18+
getHostedEvents,
19+
getInvitedEvents
1820
} from '../services/eventService';
1921
import { verifyIdToken } from '../middleware/verifyIdToken';
2022
import { parseMultipartForm, uploadFilesToSupabase } from '../lib/fileUpload';
2123

2224
const router = express.Router();
2325

24-
router.get('/:eventId', verifyIdToken, async (req: Request, res: Response) => {
26+
// Get events where user is host or co-host
27+
router.get('/hosted', verifyIdToken, async (req: Request, res: Response) => {
2528
try {
26-
const { eventId } = req.params;
27-
const event = await getEvent(eventId);
29+
const userId = req.userId;
30+
if (!userId) {
31+
res.status(401).json({ message: 'Unauthorized' });
32+
return;
33+
}
2834

29-
if (!event) {
30-
res.status(404).json({ message: 'Event not found' });
35+
const user = await getUser(userId);
36+
if (!user) {
37+
res.status(404).json({ message: 'User not found' });
3138
return;
3239
}
3340

34-
res.status(200).json(event);
41+
const { success, events, error } = await getHostedEvents(userId);
42+
43+
if (success) {
44+
res.status(200).json({ events });
45+
} else {
46+
res.status(500).json({ message: error ?? 'Internal Server Error' });
47+
}
3548
} catch (error) {
3649
console.error(error);
3750
res.status(500).json({ message: 'Internal Server Error' });
3851
}
3952
});
4053

41-
router.get('/', verifyIdToken, async (req: Request, res: Response) => {
54+
// Get events where user is only an invitee (not host or co-host)
55+
router.get('/invited', verifyIdToken, async (req: Request, res: Response) => {
4256
try {
4357
const userId = req.userId;
4458
if (!userId) {
@@ -52,7 +66,7 @@ router.get('/', verifyIdToken, async (req: Request, res: Response) => {
5266
return;
5367
}
5468

55-
const { success, events, error } = await getAllUserEvents(userId);
69+
const { success, events, error } = await getInvitedEvents(userId);
5670

5771
if (success) {
5872
res.status(200).json({ events });
@@ -65,6 +79,23 @@ router.get('/', verifyIdToken, async (req: Request, res: Response) => {
6579
}
6680
});
6781

82+
router.get('/:eventId', verifyIdToken, async (req: Request, res: Response) => {
83+
try {
84+
const { eventId } = req.params;
85+
const event = await getEvent(eventId);
86+
87+
if (!event) {
88+
res.status(404).json({ message: 'Event not found' });
89+
return;
90+
}
91+
92+
res.status(200).json(event);
93+
} catch (error) {
94+
console.error(error);
95+
res.status(500).json({ message: 'Internal Server Error' });
96+
}
97+
});
98+
6899

69100
// Create Event
70101
router.post('/create', verifyIdToken, async (req: Request, res: Response) => {

src/services/eventService.ts

Lines changed: 156 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ export const updateEvent = async (eventId: string, data: {
200200
}
201201
};
202202

203-
export const getAllUserEvents = async (userId: string) => {
203+
export const getAllUserEvents = async (userId: string, filter?: 'hosted' | 'invited') => {
204204
try {
205205
// Get events where user is host
206206
const hostedEvents = await prisma.event.findMany({
@@ -283,6 +283,103 @@ export const getAllUserEvents = async (userId: string) => {
283283
return acc;
284284
}, [] as (typeof eventsWithRoles)[0][]);
285285

286+
// Filter based on parameter if provided
287+
let filteredEvents = uniqueEvents;
288+
if (filter === 'hosted') {
289+
filteredEvents = uniqueEvents.filter(event =>
290+
event.userRole === 'host' || event.userRole === 'cohost'
291+
);
292+
} else if (filter === 'invited') {
293+
filteredEvents = uniqueEvents.filter(event =>
294+
event.userRole === 'guest'
295+
);
296+
}
297+
298+
// Sort by creation date (newest first)
299+
filteredEvents.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
300+
301+
return {
302+
success: true,
303+
events: filteredEvents
304+
};
305+
} catch (error: unknown) {
306+
if (error instanceof Error) {
307+
return {
308+
success: false,
309+
error: error.message,
310+
};
311+
} else {
312+
return {
313+
success: false,
314+
error: "Failed to fetch events",
315+
};
316+
}
317+
}
318+
};
319+
320+
// Get events where user is host or co-host
321+
export const getHostedEvents = async (userId: string) => {
322+
try {
323+
// Get events where user is host
324+
const hostedEvents = await prisma.event.findMany({
325+
where: { hostId: userId },
326+
include: {
327+
host: true,
328+
co_hosts: true,
329+
weddingDetails: true,
330+
birthdayDetails: true,
331+
housePartyDetails: true,
332+
travelDetails: true,
333+
corporateDetails: true,
334+
collegeDetails: true,
335+
otherDetails: true,
336+
}
337+
});
338+
339+
// Get events where user is co-host
340+
const coHostedEvents = await prisma.event.findMany({
341+
where: {
342+
co_hosts: {
343+
some: { id: userId }
344+
}
345+
},
346+
include: {
347+
host: true,
348+
co_hosts: true,
349+
weddingDetails: true,
350+
birthdayDetails: true,
351+
housePartyDetails: true,
352+
travelDetails: true,
353+
corporateDetails: true,
354+
collegeDetails: true,
355+
otherDetails: true,
356+
}
357+
});
358+
359+
// Format events with roles
360+
const eventsWithRoles = [
361+
...hostedEvents.map(event => ({ ...event, userRole: 'host' as const })),
362+
...coHostedEvents.map(event => ({ ...event, userRole: 'cohost' as const }))
363+
];
364+
365+
// Remove duplicates (in case user is both host and cohost)
366+
const uniqueEvents = eventsWithRoles.reduce((acc, current) => {
367+
const existingEvent = acc.find(event => event.id === current.id);
368+
369+
if (!existingEvent) {
370+
acc.push(current);
371+
} else {
372+
// If event exists, prioritize role hierarchy: host > cohost
373+
const rolePriority = { host: 2, cohost: 1 };
374+
if (rolePriority[current.userRole] > rolePriority[existingEvent.userRole]) {
375+
const index = acc.findIndex(event => event.id === current.id);
376+
acc[index] = current;
377+
}
378+
}
379+
380+
return acc;
381+
}, [] as (typeof eventsWithRoles)[0][]);
382+
286383
// Sort by creation date (newest first)
287384
uniqueEvents.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
288385

@@ -299,7 +396,64 @@ export const getAllUserEvents = async (userId: string) => {
299396
} else {
300397
return {
301398
success: false,
302-
error: "Failed to fetch events",
399+
error: "Failed to fetch hosted events",
400+
};
401+
}
402+
}
403+
};
404+
405+
// Get events where user is only an invitee (not host or co-host)
406+
export const getInvitedEvents = async (userId: string) => {
407+
try {
408+
// Get events where user is a guest but NOT host or co-host
409+
const guestEvents = await prisma.event.findMany({
410+
where: {
411+
guests: {
412+
some: { user_id: userId }
413+
},
414+
// Exclude events where user is host
415+
hostId: { not: userId },
416+
// Exclude events where user is co-host
417+
co_hosts: {
418+
none: { id: userId }
419+
}
420+
},
421+
include: {
422+
host: true,
423+
co_hosts: true,
424+
weddingDetails: true,
425+
birthdayDetails: true,
426+
housePartyDetails: true,
427+
travelDetails: true,
428+
corporateDetails: true,
429+
collegeDetails: true,
430+
otherDetails: true,
431+
}
432+
});
433+
434+
// Format events with guest role
435+
const eventsWithRoles = guestEvents.map(event => ({
436+
...event,
437+
userRole: 'guest' as const
438+
}));
439+
440+
// Sort by creation date (newest first)
441+
eventsWithRoles.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
442+
443+
return {
444+
success: true,
445+
events: eventsWithRoles
446+
};
447+
} catch (error: unknown) {
448+
if (error instanceof Error) {
449+
return {
450+
success: false,
451+
error: error.message,
452+
};
453+
} else {
454+
return {
455+
success: false,
456+
error: "Failed to fetch invited events",
303457
};
304458
}
305459
}

0 commit comments

Comments
 (0)