diff --git a/server/src/controllers/chapter.controller.ts b/server/src/controllers/chapter.controller.ts index e69de29b..b190a4f6 100644 --- a/server/src/controllers/chapter.controller.ts +++ b/server/src/controllers/chapter.controller.ts @@ -0,0 +1,48 @@ +/* eslint-disable import/prefer-default-export */ +import express from 'express'; +import ApiError from '../util/apiError.ts'; +import StatusCode from '../util/statusCode.ts'; +import { + toggleRequestByID, + getAllChaptersFromDB, +} from '../services/chapter.service.ts'; + +const getAllChapters = async ( + req: express.Request, + res: express.Response, + next: express.NextFunction, +) => { + return ( + getAllChaptersFromDB() + .then((userList) => { + res.status(StatusCode.OK).send(userList); + }) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + .catch((e) => { + next(ApiError.internal('Unable to retrieve all users')); + }) + ); +}; + +const toggleRequest = async ( + req: express.Request, + res: express.Response, + next: express.NextFunction, +) => { + const { id } = req.params; + if (!id) { + next(ApiError.missingFields(['id'])); + return; + } + + toggleRequestByID(id) + .then(() => { + res.sendStatus(StatusCode.OK); + }) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + .catch((e) => { + next(ApiError.internal('Unable to toggle status.')); + }); +}; + +export { toggleRequest, getAllChapters }; diff --git a/server/src/routes/chapter.route.ts b/server/src/routes/chapter.route.ts index e69de29b..a64c0c2f 100644 --- a/server/src/routes/chapter.route.ts +++ b/server/src/routes/chapter.route.ts @@ -0,0 +1,17 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import express from 'express'; +import { isAdmin } from '../controllers/admin.middleware.ts'; +import { + toggleRequest, + getAllChapters, +} from '../controllers/chapter.controller.ts'; +import { isAuthenticated } from '../controllers/auth.middleware.ts'; +import 'dotenv/config'; + +const router = express.Router(); + +router.put('/toggleRequests/:id', isAuthenticated, isAdmin, toggleRequest); + +router.get('/all', isAuthenticated, isAdmin, getAllChapters); + +export default router; diff --git a/server/src/routes/routers.ts b/server/src/routes/routers.ts index bca0332c..806b9447 100644 --- a/server/src/routes/routers.ts +++ b/server/src/routes/routers.ts @@ -9,6 +9,7 @@ The prefix should be of the form '/api/ROUTERNAME' import { Router } from 'express'; import adminRouter from './admin.route.ts'; import authRouter from './auth.route.ts'; +import chapterRouter from './chapter.route.ts'; const prefixToRouterMap: { prefix: string; router: Router }[] = [ { @@ -19,6 +20,10 @@ const prefixToRouterMap: { prefix: string; router: Router }[] = [ prefix: '/api/admin', router: adminRouter, }, + { + prefix: '/api/chapter', + router: chapterRouter, + }, ]; export default prefixToRouterMap; diff --git a/server/src/services/chapter.service.ts b/server/src/services/chapter.service.ts index e69de29b..f06ab31c 100644 --- a/server/src/services/chapter.service.ts +++ b/server/src/services/chapter.service.ts @@ -0,0 +1,25 @@ +/* eslint-disable import/prefer-default-export */ +import { Chapter } from '../models/chapter.model.ts'; + +const removeSensitiveDataQuery = [ + '-password', + '-verificationToken', + '-resetPasswordToken', + '-resetPasswordTokenExpiryDate', +]; + +const toggleRequestByID = async (id: string) => { + const chapter = await Chapter.findByIdAndUpdate(id, [ + { $set: { isAcceptingRequests: { $not: '$isAcceptingRequests' } } }, + ]).exec(); + return chapter; +}; + +const getAllChaptersFromDB = async () => { + const userList = await Chapter.find({}) + .select(removeSensitiveDataQuery) + .exec(); + return userList; +}; + +export { toggleRequestByID, getAllChaptersFromDB };