Skip to content

Commit

Permalink
Implement User/Course CRUD
Browse files Browse the repository at this point in the history
  • Loading branch information
PluckySquirrel committed Oct 17, 2024
1 parent 1cf8b5b commit bc71322
Show file tree
Hide file tree
Showing 12 changed files with 478 additions and 3 deletions.
101 changes: 100 additions & 1 deletion src/controller/course.controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Request, Response } from 'express';
import asyncHandler from 'express-async-handler';
import { getCoursesWithSectionsAndHours, filterAndSortCourses, getSectionsWithLessons, getCourseById, countEnrolledUsersInCourse, getProfessorByCourse} from '../service/course.service';
import { Course } from '../entity/Course';
import { getCoursesWithSectionsAndHours, filterAndSortCourses, getSectionsWithLessons, getCourseById, countEnrolledUsersInCourse, getProfessorByCourse, getAllCourses, saveCourse, deleteCourse} from '../service/course.service'

export const filterAndSort = asyncHandler(async (req: Request, res: Response) => {
try {
Expand Down Expand Up @@ -76,3 +77,101 @@ export const getCourseDetail = asyncHandler(async (req: Request, res: Response)
t: req.t
});
});

// user admin crud
// List all courses
export const courseList = async (req: Request, res: Response): Promise<void> => {
const courses = await getAllCourses()
res.json(courses); // Alternatively, render a view for admins
};

// Get course details
export const courseDetails = async (req: Request, res: Response): Promise<void> => {
const { id } = req.params;
const course = await getCourseById(parseInt(id))

if (!course) {
res.status(404).json({ message: 'Course not found' });
return;
}

res.json(course); // Alternatively, render a detailed view for admins
};

// Render course creation form (if needed)
export const courseCreateGet = (req: Request, res: Response): void => {
res.render('courseCreateForm'); // Render a view (if needed)
};

// Handle course creation
export const courseCreatePost = async (req: Request, res: Response): Promise<void> => {
const { name, price, description, professor_id } = req.body;

const newCourse = new Course({
name,
price: parseFloat(price),
description,
professor_id: parseInt(professor_id),
average_rating: 0,
});

await saveCourse(newCourse);
res.status(201).json(newCourse); // Alternatively, redirect or render a success page
};

// Render course deletion confirmation form (if needed)
export const courseDeleteGet = async (req: Request, res: Response): Promise<void> => {
const { id } = req.params;
const course = await getCourseById(parseInt(id))

if (!course) {
res.status(404).json({ message: 'Course not found' });
return;
}

res.render('courseDeleteForm', { course }); // Render a view (if needed)
};

// Handle course deletion
export const courseDeletePost = async (req: Request, res: Response): Promise<void> => {
const { id } = req.params;
const course = await getCourseById(parseInt(id))
if (!course) {
res.status(404).json({ message: 'Course not found' });
return;
}

await deleteCourse(course)
res.json({ message: 'Course deleted' }); // Alternatively, redirect or render a success page
};

// Render course update form (if needed)
export const courseUpdateGet = async (req: Request, res: Response): Promise<void> => {
const { id } = req.params;
const course = await getCourseById(parseInt(id))

if (!course) {
res.status(404).json({ message: 'Course not found' });
return;
}

res.render('courseUpdateForm', { course }); // Render a view (if needed)
};

// Handle course update
export const courseUpdatePost = async (req: Request, res: Response): Promise<void> => {
const { id } = req.params;
const { name, price, description } = req.body;
const course = await getCourseById(parseInt(id))
if (!course) {
res.status(404).json({ message: 'Course not found' });
return;
}

course.name = name;
course.price = parseFloat(price);
course.description = description;

await saveCourse(course)
res.json(course); // Alternatively, redirect or render a success page
};
61 changes: 61 additions & 0 deletions src/controller/user.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
userLogin,
decodeJwtToken,
} from "../service/user.service";
import { createUser, deleteUser, getAllUsers, getUserById, saveUser } from "../service/user.service";

// Register a new user
export const register = asyncHandler(async (req: Request, res: Response) => {
Expand Down Expand Up @@ -53,3 +54,63 @@ export const verifyUser = asyncHandler((req: Request, res: Response) => {
.status(401)
.json({ status: 401, message: req.t("login.not-authentication") });
});

// crud
// Get all users
export const userList = async (req: Request, res: Response): Promise<void> => {
const users = await getAllUsers();
res.json(users);
};

// Get a specific user by ID
export const userDetails = async (req: Request, res: Response): Promise<void> => {
const { id } = req.params;
const user = await getUserById(parseInt(id))

if (!user) {
res.status(404).json({ message: 'User not found' });
return;
}

res.json(user);
};

// Create a new user
export const userCreatePost = async (req: Request, res: Response): Promise<void> => {
const { name, email, password, role } = req.body;
const newUser = createUser({ name, email, password, role })
res.status(201).json(newUser);
};

// Update an existing user
export const userUpdatePost = async (req: Request, res: Response): Promise<void> => {
const { id } = req.params;
const { name, email, role } = req.body;
const user = await getUserById(parseInt(id))
if (!user) {
res.status(404).json({ message: 'User not found' });
return;
}

user.name = name;
user.email = email;
user.role = role;

await saveUser(user)

res.json(user);
};

// Delete a user
export const userDeletePost = async (req: Request, res: Response): Promise<void> => {
const { id } = req.params;
const user = await getUserById(parseInt(id))
if (!user) {
res.status(404).json({ message: 'User not found' });
return;
}

await deleteUser(parseInt(id))

res.status(204).json({ message: 'User deleted successfully' });
};
75 changes: 75 additions & 0 deletions src/controllers/course.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { Request, Response } from 'express';
import asyncHandler from 'express-async-handler';
import { getAllCourses,
getCourseById,
createCourse,
deleteCourse,
updateCourse,
} from '../service/course.service';

export const courseList =
asyncHandler(async (req: Request, res: Response) => {
const courses = await getAllCourses();
res.status(200).json(courses);
});

export const courseDetails =
asyncHandler(async (req: Request, res: Response) => {
const courseId = parseInt(req.params.id);
const course = await getCourseById(courseId);

if (course) {
res.status(200).json(course);
} else {
res.status(404).json({ message: 'Course not found' });
}
});

export const createCourseGet =
asyncHandler(async (req: Request, res: Response) => {
res.status(200).json({ message: 'Provide course data to create a course' });
});

export const createCoursePost =
asyncHandler(async (req: Request, res: Response) => {
const courseData = req.body;
const newCourse = await createCourse(courseData);
res.status(201).json(newCourse);
});

export const deleteCourseGet =
asyncHandler(async (req: Request, res: Response) => {
res.status(200).json({ message: 'Confirm course deletion' });
});

export const deleteCoursePost =
asyncHandler(async (req: Request, res: Response) => {
const courseId = parseInt(req.params.id);
const course = await getCourseById(courseId);

if (course) {
await deleteCourse(course);
res.status(200).json({ message: 'Course deleted' });
} else {
res.status(404).json({ message: 'Course not found' });
}
});

export const updateCourseGet =
asyncHandler(async (req: Request, res: Response) => {
res.status(200).json({ message: 'Provide updated course data' });
});

export const updateCoursePost =
asyncHandler(async (req: Request, res: Response) => {
const courseId = parseInt(req.params.id);
const course = await getCourseById(courseId);

if (course) {
const updatedData = req.body;
const updatedCourse = await updateCourse(course, updatedData);
res.status(200).json(updatedCourse);
} else {
res.status(404).json({ message: 'Course not found' });
}
});
85 changes: 85 additions & 0 deletions src/controllers/user.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { getAllUsers,
getUserById,
createUser,
updateUser,
deleteUser
} from '../service/user.service';
import { Request, Response } from 'express';
import asyncHandler from 'express-async-handler';

export const userList =
asyncHandler(async (req: Request, res: Response) => {
const users = await getAllUsers();
res.status(200).json(users);
});

export const userDetails =
asyncHandler(async (req: Request, res: Response) => {
const userId = parseInt(req.params.id);
const user = await getUserById(userId);

if (user) {
res.status(200).json(user);
} else {
res.status(404).json({ message: 'User not found' });
}
});

export const userCreateGet =
asyncHandler(async (req: Request, res: Response) => {
res.status(200).json({ message: 'Display user creation form' });
});

export const userCreatePost =
asyncHandler(async (req: Request, res: Response) => {
const newUserData = req.body;
const newUser = await createUser(newUserData);
res.status(201).json(newUser);
});

export const userDeleteGet =
asyncHandler(async (req: Request, res: Response) => {
const userId = parseInt(req.params.id);
const user = await getUserById(userId);

if (user) {
res.status(200).json({ message: 'Confirm deletion of user', user });
} else {
res.status(404).json({ message: 'User not found' });
}
});

export const userDeletePost =
asyncHandler(async (req: Request, res: Response) => {
const userId = parseInt(req.params.id);
await deleteUser(userId);
res.status(204).send();
});

export const userUpdateGet =
asyncHandler(async (req: Request, res: Response) => {
const userId = parseInt(req.params.id);
const user = await getUserById(userId);

if (user) {
res.status(200).json(user);
} else {
res.status(404).json({ message: 'User not found' });
}
});

export const userUpdatePost =
asyncHandler(async (req: Request, res: Response) => {
const userToUpdate = await getUserById(parseInt(req.params.id));
const updatedUserData = req.body;
if (!userToUpdate) {
throw new Error('User not found');
}
const updatedUser = await updateUser(userToUpdate, updatedUserData);

if (updatedUser) {
res.status(200).json(updatedUser);
} else {
res.status(404).json({ message: 'User not found' });
}
});
17 changes: 17 additions & 0 deletions src/middleware/roleCheckMiddleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Request, Response, NextFunction } from 'express';

export const isAdmin = (req: Request, res: Response, next: NextFunction) => {
if (req.session?.user?.role === 'admin') {
return next();
} else {
res.status(403).json({ message: 'Access forbidden: Admins only' });
}
};

// Middleware to check if the user is a professor or admin
export const isProfessor = (req: Request, res: Response, next: NextFunction) => {
if (req.session?.user?.role === 'professor') {
return next();
}
res.status(403).json({ message: 'Access forbidden: Professors only' });
};
22 changes: 22 additions & 0 deletions src/route/course.routes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Router } from 'express';
import * as courseController from '../controllers/course.controller';

const router: Router = Router();

router.get('/', courseController.courseList);

router.get('/create', courseController.createCourseGet);

router.get('/:id', courseController.courseDetails);

router.post('/create', courseController.createCoursePost);

router.get('/:id/delete', courseController.deleteCourseGet);

router.post('/:id/delete', courseController.deleteCoursePost);

router.get('/:id/update', courseController.updateCourseGet);

router.post('/:id/update', courseController.updateCoursePost);

export default router;
13 changes: 13 additions & 0 deletions src/route/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Router } from 'express'
import userRoutes from './user.routes'
import courseRoutes from './course.routes'

// **** Variables **** //
const router = Router();

/* GET home page. */
router.use('/users', userRoutes)
router.use('/courses', courseRoutes)

// **** Export default **** //
export default router;
Loading

0 comments on commit bc71322

Please sign in to comment.