Skip to content

Commit 730e1a3

Browse files
committed
feat: add invite by group link
1 parent 2b41745 commit 730e1a3

File tree

11 files changed

+2220
-149
lines changed

11 files changed

+2220
-149
lines changed

src/routes/eventRoutes.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ router.get('/:eventId', verifyIdToken, async (req: Request, res: Response) => {
4141
router.get('/', verifyIdToken, async (req: Request, res: Response) => {
4242
try {
4343
const userId = req.userId;
44+
if (!userId) {
45+
res.status(401).json({ message: 'Unauthorized' });
46+
return;
47+
}
4448

4549
const user = await getUser(userId);
4650
if (!user) {
@@ -66,6 +70,10 @@ router.get('/', verifyIdToken, async (req: Request, res: Response) => {
6670
router.post('/create', verifyIdToken, async (req: Request, res: Response) => {
6771
try {
6872
const userId = req.userId;
73+
if (!userId) {
74+
res.status(401).json({ message: 'Unauthorized' });
75+
return;
76+
}
6977

7078
const { fields, files } = await parseMultipartForm(req);
7179

@@ -115,6 +123,10 @@ router.post('/create', verifyIdToken, async (req: Request, res: Response) => {
115123
router.patch('/update', verifyIdToken, async (req: Request, res: Response) => {
116124
try {
117125
const userId = req.userId
126+
if (!userId) {
127+
res.status(401).json({ message: 'Unauthorized' });
128+
return;
129+
}
118130

119131
const { eventId, title, type, start_date_time, end_date_time, location, address, message } = req.body
120132
if (!eventId) {
@@ -149,6 +161,10 @@ router.patch('/update', verifyIdToken, async (req: Request, res: Response) => {
149161
router.patch('/cohost/add', verifyIdToken, async (req: Request, res: Response) => {
150162
try {
151163
const userId = req.userId
164+
if (!userId) {
165+
res.status(401).json({ message: 'Unauthorized' });
166+
return;
167+
}
152168
const { eventId, phoneNumber } = req.body
153169

154170
if (!eventId || !phoneNumber) {
@@ -185,6 +201,10 @@ router.patch('/cohost/add', verifyIdToken, async (req: Request, res: Response) =
185201
router.patch('/cohost/remove', verifyIdToken, async (req: Request, res: Response) => {
186202
try {
187203
const userId = req.userId
204+
if (!userId) {
205+
res.status(401).json({ message: 'Unauthorized' });
206+
return;
207+
}
188208
const { eventId, phoneNumber } = req.body
189209

190210
if (!eventId || !phoneNumber) {
@@ -221,6 +241,10 @@ router.patch('/cohost/remove', verifyIdToken, async (req: Request, res: Response
221241
router.post('/add-wedding-details', verifyIdToken, async (req: Request, res: Response) => {
222242
try {
223243
const userId = req.userId;
244+
if (!userId) {
245+
res.status(401).json({ message: 'Unauthorized' });
246+
return;
247+
}
224248

225249
const { fields, files } = await parseMultipartForm(req);
226250

@@ -279,6 +303,10 @@ router.post('/add-wedding-details', verifyIdToken, async (req: Request, res: Res
279303
router.post('/add-birthday-details', verifyIdToken, async (req: Request, res: Response) => {
280304
try {
281305
const userId = req.userId;
306+
if (!userId) {
307+
res.status(401).json({ message: 'Unauthorized' });
308+
return;
309+
}
282310

283311
const { fields, files } = await parseMultipartForm(req);
284312

@@ -322,6 +350,10 @@ router.post('/add-birthday-details', verifyIdToken, async (req: Request, res: Re
322350
router.post('/add-houseparty-details', verifyIdToken, async (req: Request, res: Response) => {
323351
try {
324352
const userId = req.userId;
353+
if (!userId) {
354+
res.status(401).json({ message: 'Unauthorized' });
355+
return;
356+
}
325357
const { eventId, cost, rules, terms, tags } = req.body;
326358

327359
if (!eventId) {
@@ -357,6 +389,10 @@ router.post('/add-houseparty-details', verifyIdToken, async (req: Request, res:
357389
router.post('/add-travel-details', verifyIdToken, async (req: Request, res: Response) => {
358390
try {
359391
const userId = req.userId;
392+
if (!userId) {
393+
res.status(401).json({ message: 'Unauthorized' });
394+
return;
395+
}
360396
const { eventId, cost, terms, itinerary_included, itinerary_excluded, rules, tags } = req.body;
361397

362398
if (!eventId) {
@@ -394,6 +430,10 @@ router.post('/add-travel-details', verifyIdToken, async (req: Request, res: Resp
394430
router.post('/add-corporate-details', verifyIdToken, async (req: Request, res: Response) => {
395431
try {
396432
const userId = req.userId;
433+
if (!userId) {
434+
res.status(401).json({ message: 'Unauthorized' });
435+
return;
436+
}
397437
const { eventId, event_details, terms } = req.body;
398438

399439
if (!eventId) {
@@ -427,6 +467,10 @@ router.post('/add-corporate-details', verifyIdToken, async (req: Request, res: R
427467
router.post('/add-college-details', verifyIdToken, async (req: Request, res: Response) => {
428468
try {
429469
const userId = req.userId;
470+
if (!userId) {
471+
res.status(401).json({ message: 'Unauthorized' });
472+
return;
473+
}
430474
const { eventId, event_details, terms } = req.body;
431475

432476
if (!eventId) {
@@ -460,6 +504,10 @@ router.post('/add-college-details', verifyIdToken, async (req: Request, res: Res
460504
router.post('/add-other-details', verifyIdToken, async (req: Request, res: Response) => {
461505
try {
462506
const userId = req.userId;
507+
if (!userId) {
508+
res.status(401).json({ message: 'Unauthorized' });
509+
return;
510+
}
463511
const { eventId, event_details, terms } = req.body;
464512

465513
if (!eventId) {
@@ -493,6 +541,10 @@ router.post('/add-other-details', verifyIdToken, async (req: Request, res: Respo
493541
router.delete('/:eventId', verifyIdToken, async (req: Request, res: Response) => {
494542
try {
495543
const userId = req.userId;
544+
if (!userId) {
545+
res.status(401).json({ message: 'Unauthorized' });
546+
return;
547+
}
496548
const { eventId } = req.params;
497549

498550
if (!eventId) {

src/routes/guestRoutes.ts

Lines changed: 90 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,42 @@
11
import express, { Request, Response } from 'express';
22
import {
3-
createGuestGroup,
43
getGuestGroups,
54
getGuestGroup,
5+
isEventHostOrCoHost,
6+
addGuestGroupToEvent,
7+
createGuestGroup,
68
updateGuestGroup,
79
deleteGuestGroup,
8-
addMemberToGroup,
9-
removeMemberFromGroup,
10-
isEventHostOrCoHost
10+
addUserToGroup,
11+
removeUserFromGroup,
1112
} from '../services/guestService';
1213
import { verifyIdToken } from '../middleware/verifyIdToken';
1314

1415
const router = express.Router();
1516

16-
// Create a new guest group
17-
router.post('/:eventId/groups', verifyIdToken, async (req: Request, res: Response) => {
17+
// Create a new guest group for an event
18+
router.post('/:eventId/groups', verifyIdToken, async (req: Request, res: Response): Promise<void> => {
1819
try {
1920
const { eventId } = req.params;
2021
const userId = req.userId;
21-
const { name, members } = req.body;
22+
if (!userId) {
23+
res.status(401).json({ message: 'Unauthorized' });
24+
return;
25+
}
26+
const { name } = req.body;
2227

2328
if (!name) {
2429
res.status(400).json({ message: 'Group name is required' });
2530
return;
2631
}
2732

28-
// Check if user is host or co-host
2933
const isAuthorized = await isEventHostOrCoHost(userId, eventId);
3034
if (!isAuthorized) {
3135
res.status(403).json({ message: 'Only event hosts and co-hosts can create guest groups' });
3236
return;
3337
}
3438

35-
const result = await createGuestGroup(eventId, { name, members });
39+
const result = await createGuestGroup({ name, createdBy: userId, eventId });
3640

3741
if (!result.success) {
3842
res.status(400).json({ message: result.error });
@@ -49,11 +53,48 @@ router.post('/:eventId/groups', verifyIdToken, async (req: Request, res: Respons
4953
}
5054
});
5155

52-
// Get all guest groups for an event
56+
// Add an existing guest group to an event
57+
router.post('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, res: Response): Promise<void> => {
58+
try {
59+
const { eventId, groupId } = req.params;
60+
const userId = req.userId;
61+
if (!userId) {
62+
res.status(401).json({ message: 'Unauthorized' });
63+
return;
64+
}
65+
66+
// Check if user is host or co-host
67+
const isAuthorized = await isEventHostOrCoHost(userId, eventId);
68+
if (!isAuthorized) {
69+
res.status(403).json({ message: 'Only event hosts and co-hosts can add guest groups to an event' });
70+
return;
71+
}
72+
73+
const result = await addGuestGroupToEvent(eventId, groupId);
74+
75+
if (!result.success) {
76+
res.status(400).json({ message: result.error });
77+
return;
78+
}
79+
80+
res.status(200).json({
81+
message: 'Guest group added to event successfully',
82+
guests: result.guests
83+
});
84+
} catch (error) {
85+
console.error(error);
86+
res.status(500).json({ message: 'Internal Server Error' });
87+
}
88+
});
89+
5390
router.get('/:eventId/groups', verifyIdToken, async (req: Request, res: Response) => {
5491
try {
5592
const { eventId } = req.params;
5693
const userId = req.userId;
94+
if (!userId) {
95+
res.status(401).json({ message: 'Unauthorized' });
96+
return;
97+
}
5798

5899
// Check if user is host or co-host
59100
const isAuthorized = await isEventHostOrCoHost(userId, eventId);
@@ -83,6 +124,10 @@ router.get('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, res:
83124
try {
84125
const { eventId, groupId } = req.params;
85126
const userId = req.userId;
127+
if (!userId) {
128+
res.status(401).json({ message: 'Unauthorized' });
129+
return;
130+
}
86131

87132
// Check if user is host or co-host
88133
const isAuthorized = await isEventHostOrCoHost(userId, eventId);
@@ -108,20 +153,23 @@ router.get('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, res:
108153
});
109154

110155
// Update a guest group
111-
router.put('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, res: Response) => {
156+
router.put('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, res: Response): Promise<void> => {
112157
try {
113158
const { eventId, groupId } = req.params;
114159
const userId = req.userId;
115-
const { name, members } = req.body;
160+
if (!userId) {
161+
res.status(401).json({ message: 'Unauthorized' });
162+
return;
163+
}
164+
const { name } = req.body;
116165

117-
// Check if user is host or co-host
118166
const isAuthorized = await isEventHostOrCoHost(userId, eventId);
119167
if (!isAuthorized) {
120-
res.status(403).json({ message: 'Only event hosts and co-hosts can update guest groups' });
168+
res.status(403).json({ message: 'You are not authorized to update this guest group' });
121169
return;
122170
}
123171

124-
const result = await updateGuestGroup(groupId, { name, members });
172+
const result = await updateGuestGroup(groupId, { name });
125173

126174
if (!result.success) {
127175
res.status(400).json({ message: result.error });
@@ -138,16 +186,19 @@ router.put('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, res:
138186
}
139187
});
140188

141-
// Delete a guest group
142-
router.delete('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, res: Response) => {
189+
// Delete a guest group from an event (does not delete the group itself)
190+
router.delete('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, res: Response): Promise<void> => {
143191
try {
144192
const { eventId, groupId } = req.params;
145193
const userId = req.userId;
194+
if (!userId) {
195+
res.status(401).json({ message: 'Unauthorized' });
196+
return;
197+
}
146198

147-
// Check if user is host or co-host
148199
const isAuthorized = await isEventHostOrCoHost(userId, eventId);
149200
if (!isAuthorized) {
150-
res.status(403).json({ message: 'Only event hosts and co-hosts can delete guest groups' });
201+
res.status(403).json({ message: 'You are not authorized to delete this guest group' });
151202
return;
152203
}
153204

@@ -167,26 +218,29 @@ router.delete('/:eventId/groups/:groupId', verifyIdToken, async (req: Request, r
167218
}
168219
});
169220

170-
// Add member to guest group by phone number
171-
router.post('/:eventId/groups/:groupId/members', verifyIdToken, async (req: Request, res: Response) => {
221+
// Add user to a guest group by phone number
222+
router.post('/:eventId/groups/:groupId/members', verifyIdToken, async (req: Request, res: Response): Promise<void> => {
172223
try {
173224
const { eventId, groupId } = req.params;
174225
const userId = req.userId;
226+
if (!userId) {
227+
res.status(401).json({ message: 'Unauthorized' });
228+
return;
229+
}
175230
const { phoneNumber } = req.body;
176231

177232
if (!phoneNumber) {
178233
res.status(400).json({ message: 'Phone number is required' });
179234
return;
180235
}
181236

182-
// Check if user is host or co-host
183237
const isAuthorized = await isEventHostOrCoHost(userId, eventId);
184238
if (!isAuthorized) {
185-
res.status(403).json({ message: 'Only event hosts and co-hosts can add members to guest groups' });
239+
res.status(403).json({ message: 'You are not authorized to add members to this guest group' });
186240
return;
187241
}
188242

189-
const result = await addMemberToGroup(groupId, eventId, phoneNumber);
243+
const result = await addUserToGroup(groupId, phoneNumber, userId);
190244

191245
if (!result.success) {
192246
res.status(400).json({ message: result.error });
@@ -195,34 +249,37 @@ router.post('/:eventId/groups/:groupId/members', verifyIdToken, async (req: Requ
195249

196250
res.status(200).json({
197251
message: result.message,
198-
guest: result.guest
252+
member: result.member
199253
});
200254
} catch (error) {
201255
console.error(error);
202256
res.status(500).json({ message: 'Internal Server Error' });
203257
}
204258
});
205259

206-
// Remove member from guest group by phone number
207-
router.delete('/:eventId/groups/:groupId/members', verifyIdToken, async (req: Request, res: Response) => {
260+
// Remove user from a guest group by phone number
261+
router.delete('/:eventId/groups/:groupId/members', verifyIdToken, async (req: Request, res: Response): Promise<void> => {
208262
try {
209263
const { eventId, groupId } = req.params;
210264
const userId = req.userId;
265+
if (!userId) {
266+
res.status(401).json({ message: 'Unauthorized' });
267+
return;
268+
}
211269
const { phoneNumber } = req.body;
212270

213271
if (!phoneNumber) {
214272
res.status(400).json({ message: 'Phone number is required' });
215273
return;
216274
}
217275

218-
// Check if user is host or co-host
219276
const isAuthorized = await isEventHostOrCoHost(userId, eventId);
220277
if (!isAuthorized) {
221-
res.status(403).json({ message: 'Only event hosts and co-hosts can remove members from guest groups' });
278+
res.status(403).json({ message: 'You are not authorized to remove members from this guest group' });
222279
return;
223280
}
224281

225-
const result = await removeMemberFromGroup(groupId, phoneNumber);
282+
const result = await removeUserFromGroup(groupId, phoneNumber);
226283

227284
if (!result.success) {
228285
res.status(400).json({ message: result.error });
@@ -238,4 +295,6 @@ router.delete('/:eventId/groups/:groupId/members', verifyIdToken, async (req: Re
238295
}
239296
});
240297

241-
export default router;
298+
299+
300+
export default router;

0 commit comments

Comments
 (0)