Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions backend/src/controllers/event.controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { PrismaClient } from "@prisma/client";
import { Request, Response } from "express";
import { EventService } from "../services/event.service";
import { IPoll } from "../interface";

export class EventController {

Expand Down
118 changes: 84 additions & 34 deletions backend/src/controllers/poll.controller.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@

import { IPoll } from "../interface";
import { PollService } from "../services/poll.service";

import { Request, Response, NextFunction } from "express";

export class PollController {


constructor(private pollService: PollService) {
this.getPoll = this.getPoll.bind(this);
this.getPolls = this.getPolls.bind(this);
this.myPolls = this.myPolls.bind(this);
this.publicPolls = this.publicPolls.bind(this);
this.myVotedPolls = this.myVotedPolls.bind(this);
this.createPollByEventId = this.createPollByEventId.bind(this);
}

/**
Expand All @@ -22,9 +21,12 @@ export class PollController {
* @returns - JSON
*/

public async getPolls(req: Request, res: Response, next: NextFunction): Promise<any> {
public async getPolls(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {

const page = Number(req.query.page) || 1;
const pageSize = Number(req.query.pageSize) || 10;
const search = req.query.search as string;
Expand All @@ -45,37 +47,39 @@ export class PollController {
pageSize: pageSize,
totalPages: Math.ceil(polls.totalCount / pageSize) || 1,
totalCount: polls.totalCount,
search
}
search,
},
});

} catch (error) {
return res.status(500).json({
success: false,
message: "Failed to fetch polls",
error: error
error: error,
});
}
}


/**
* Get all polls user has participated in
* @param req - Request
* @param res - Response
* @param next - NextFunction
* @returns - JSON
*/
public async myPolls(req: Request, res: Response, next: NextFunction): Promise<any> {
public async myPolls(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {
const user = req.user
const user = req.user;

// Check if user exists
if (!user) {
return res.status(400).json({
success: false,
message: "User not found",
error: "User not found"
error: "User not found",
});
}

Expand All @@ -84,14 +88,13 @@ export class PollController {

res.status(200).json({
message: "Polls fetched successfully",
data: polls
data: polls,
});

} catch (error) {
return res.status(500).json({
success: false,
message: "Failed to fetch polls",
error: error
error: error,
});
}
}
Expand All @@ -104,16 +107,20 @@ export class PollController {
* @returns - JSON
*/

public async myVotedPolls(req: Request, res: Response, next: NextFunction): Promise<any> {
public async myVotedPolls(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {
const user = req.user
const user = req.user;

// Check if user exists
if (!user) {
return res.status(400).json({
success: false,
message: "User not found",
error: "User not found"
error: "User not found",
});
}

Expand All @@ -122,21 +129,23 @@ export class PollController {

res.status(200).json({
message: "Polls fetched successfully",
data: polls
data: polls,
});

} catch (error) {
return res.status(500).json({
success: false,
message: "Failed to fetch polls",
error: error
error: error,
});
}
}

public async publicPolls(req: Request, res: Response, next: NextFunction): Promise<any> {
public async publicPolls(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {

const page = Number(req.query.page) || 1;
const pageSize = Number(req.query.pageSize) || 10;
const search = req.query.search as string;
Expand All @@ -151,48 +160,55 @@ export class PollController {

res.status(200).json({
message: "Polls fetched successfully",
data: { polls }
data: { polls },
});
} catch (error) {
return res.status(500).json({
success: false,
message: "Failed to fetch polls",
error: error
error: error,
});
}
}

/**
* Get a poll by ID
* Get a poll by ID
* @param req - Request
* @param res - Response
* @param next - NextFunction
* @returns - JSON
*/

public getPoll = async (req: Request, res: Response, next: NextFunction): Promise<any> => {
public getPoll = async (
req: Request,
res: Response,
next: NextFunction
): Promise<any> => {
try {

const { pollId } = req.params;
const user = req.user;

if (!user) {
return res.status(400).json({
success: false,
message: "User not found",
error: "User not found"
error: "User not found",
});
}

// Check if user or guest can vote on poll
const canGetPoll = await this.pollService.userCanVote(pollId, user.id, user.guest);
const canGetPoll = await this.pollService.userCanVote(
pollId,
user.id,
user.guest
);

// If user cannot vote on poll
if (!canGetPoll) {
return res.status(403).json({
success: false,
message: "You cannot vote on this poll",
error: "You cannot vote on this poll"
error: "You cannot vote on this poll",
});
}

Expand All @@ -202,7 +218,7 @@ export class PollController {
return res.status(404).json({
success: false,
message: "Failed to fetch polls",
error: "Polls not found"
error: "Polls not found",
});
}

Expand All @@ -222,6 +238,40 @@ export class PollController {
} catch (error) {
next(error);
}
};

public async createPollByEventId(req: Request, res: Response): Promise<any> {
try {
const eventId = req.params.eventId;

const user = req.user;

const { polls } = req.body;

// Check if user is authenticated
if (!user) {
return res.status(401).json({
success: false,
message: "Unauthorized",
});
}

const createdPolls = await this.pollService.createPollByEventId(polls, eventId , user.id);

return res.status(200).json({
success: true,
message: "Event fetched successfully",
data: createdPolls,
});


} catch (error) {
console.error("[ERROR] getEvents:", error);
return res.status(500).json({
message: "Something went wrong",
error: error || error,
});
}
}

// public getPoll = async (req: Request, res: Response, next: NextFunction) => {
Expand Down Expand Up @@ -276,4 +326,4 @@ export class PollController {
// next(error);
// }
// }
}
}
1 change: 1 addition & 0 deletions backend/src/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export interface IUser {
createdAt: Date;
updatedAt: Date;
deletedAt?: Date | null;
canEdit?: boolean;

}

Expand Down
2 changes: 2 additions & 0 deletions backend/src/middlewares/auth.middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ class AuthMiddleware {
/** Extract Token */
private extractToken(req: Request): string | null {
const authHeader = req.headers?.authorization;
console.log(authHeader);

return authHeader?.startsWith("Bearer ")
? authHeader.split(" ")[1]
: req.cookies?.accessToken || null;
Expand Down
5 changes: 5 additions & 0 deletions backend/src/routes/event.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { UserService } from '../services/user.service';
import { AuthService } from '../services/auth.service';
import { CryptoService } from '../services/crypto.service';
import AuthMiddleware from '../middlewares/auth.middleware';
import { PollService } from '../services/poll.service';

const router = Router();

Expand All @@ -18,6 +19,7 @@ const eventService = new EventService(
prisma
);

const pollService = new PollService(prisma);

const userService = new UserService(
prisma
Expand All @@ -33,12 +35,15 @@ const authMiddleware = new AuthMiddleware(
)

const eventController = new EventController(eventService);
const pollController = new PollController(pollService);


router.get('/', getAllEventValidator(), authMiddleware.validateMulti, validateRequest, eventController.getEvents);

router.get('/:eventId', getEventByIdValidator(), authMiddleware.validateMulti, validateRequest, eventController.getEvent);

router.post('/:eventId/polls/create', getEventByIdValidator(), authMiddleware.validateUserOnly, validateRequest, pollController.createPollByEventId);

router.post('/create', createEventValidator(), authMiddleware.validateUserOnly, validateRequest, eventController.createEvent);

export {
Expand Down
Loading