Skip to content

Commit 1d53627

Browse files
authored
Merge branch 'main' into shreyanshi_zod
2 parents cd2e708 + 7d6829c commit 1d53627

File tree

11 files changed

+637
-103
lines changed

11 files changed

+637
-103
lines changed

backend/package-lock.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
"main": "index.js",
66
"scripts": {
77
"test": "echo \"Error: no test specified\" && exit 1",
8-
"build": "tsc",
9-
"dev": "node server.js",
10-
"dev-ts": "node --loader ts-node/esm src/server.ts"
8+
"dev": "tsc -b && nodemon dist/server.js"
119
},
1210
"keywords": [],
1311
"author": "",
@@ -35,4 +33,4 @@
3533
"ts-node-dev": "^2.0.0",
3634
"typescript": "^5.9.3"
3735
}
38-
}
36+
}

backend/server.js

Lines changed: 0 additions & 68 deletions
This file was deleted.

backend/src/app.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import dotenv from "dotenv";
33
import authRoutes from "./routes/authRoutes.js";
44
import healthRoutes from "./routes/healthRoutes.js";
55
import { errorHandler } from "./middleware/errorHandler.js";
6+
import roomRoutes from "./routes/roomRoutes.js";
67

78
dotenv.config();
89
const app = express();
@@ -12,6 +13,7 @@ app.use(express.json());
1213
// Routes
1314
app.use("/api/auth", authRoutes);
1415
app.use("/api/health", healthRoutes);
16+
app.use("/api/rooms", roomRoutes);
1517

1618
// Error Handler
1719
app.use(errorHandler);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import type { Request, Response } from "express";
2+
import Room from "../models/roomModel.js";
3+
import type { IRoom } from "../models/roomModel.js";
4+
import * as express from "express";
5+
import mongoose from "mongoose";
6+
7+
declare global {
8+
namespace Express {
9+
interface Request {
10+
userId?: string; // or number, depending on your ID type
11+
}
12+
}
13+
}
14+
15+
// Create a new room
16+
export const createRoom = async (req: Request, res: Response) => {
17+
try {
18+
const { name } = req.body;
19+
if (!name) return res.status(400).json({ message: "Room name is required" });
20+
21+
const existingRoom = await Room.findOne({ name });
22+
if (existingRoom) return res.status(400).json({ message: "Room already exists" });
23+
24+
const room: IRoom = new Room({ name, members: [req.userId] });
25+
await room.save();
26+
res.status(201).json(room);
27+
} catch (error) {
28+
res.status(500).json({ message: "Server error", error });
29+
}
30+
};
31+
32+
// List all rooms
33+
export const listRooms = async (_req: Request, res: Response) => {
34+
try {
35+
const rooms = await Room.find().populate("members", "username email");
36+
res.json(rooms);
37+
} catch (error) {
38+
res.status(500).json({ message: "Server error", error });
39+
}
40+
};
41+
42+
// Join a room
43+
export const joinRoom = async (req: Request, res: Response) => {
44+
try {
45+
const { roomId } = req.params;
46+
const room = await Room.findById(roomId);
47+
if (!room) return res.status(404).json({ message: "Room not found" });
48+
const userId = new mongoose.Types.ObjectId(req.userId!);
49+
if (!room.members.includes(userId)) {
50+
room.members.push(userId);
51+
await room.save();
52+
}
53+
54+
res.json(room);
55+
} catch (error) {
56+
res.status(500).json({ message: "Server error", error });
57+
}
58+
};
59+
60+
// Leave a room
61+
export const leaveRoom = async (req: Request, res: Response) => {
62+
try {
63+
const { roomId } = req.params;
64+
const room = await Room.findById(roomId);
65+
if (!room) return res.status(404).json({ message: "Room not found" });
66+
67+
room.members = room.members.filter(member => member.toString() !== req.userId);
68+
await room.save();
69+
70+
res.json({ message: "Left room successfully", room });
71+
} catch (error) {
72+
res.status(500).json({ message: "Server error", error });
73+
}
74+
};

backend/src/middleware/authMiddleware.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
import type { Request, Response, NextFunction } from "express";
22
import jwt from "jsonwebtoken";
33

4-
export const protect = (req: Request, res: Response, next: NextFunction) => {
4+
interface AuthRequest extends Request {
5+
userId?: string;
6+
}
7+
8+
export const protect = (req: AuthRequest, res: Response, next: NextFunction) => {
59
let token = req.headers.authorization?.split(" ")[1];
610

711
if (!token)
812
return res.status(401).json({ success: false, message: "Not authorized, token missing" });
913

1014
try {
1115
const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as { id: string };
12-
(req as any).userId = decoded.id;
16+
req.userId = decoded.id;
1317
next();
1418
} catch {
1519
res.status(401).json({ success: false, message: "Invalid token" });

backend/src/models/roomModel.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import mongoose, { Schema, Document } from "mongoose";
2+
3+
export interface IRoom extends Document {
4+
name: string;
5+
members: mongoose.Types.ObjectId[];
6+
createdAt: Date;
7+
}
8+
9+
const roomSchema: Schema = new Schema({
10+
name: { type: String, required: true, unique: true },
11+
members: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
12+
createdAt: { type: Date, default: Date.now },
13+
});
14+
15+
export default mongoose.model<IRoom>("Room", roomSchema);

backend/src/routes/roomRoutes.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Router } from "express";
2+
import { createRoom, listRooms, joinRoom, leaveRoom } from "../controllers/roomController.js";
3+
import { protect } from "../middleware/authMiddleware.js";
4+
5+
const router = Router();
6+
7+
// All routes require authentication
8+
router.use(protect);
9+
10+
router.post("/createRoom", createRoom); // Create room
11+
router.get("/listRooms", listRooms); // List all rooms
12+
router.post("/:roomId/join", joinRoom); // Join a room
13+
router.post("/:roomId/leave", leaveRoom); // Leave a room
14+
15+
export default router;

0 commit comments

Comments
 (0)