Skip to content
Snippets Groups Projects
Select Git revision
  • 6b2a6d346f1b4ca10ba19b0572d94c4873b54700
  • master default protected
  • radhwan.hassine-master-patch-03421
  • radhwan.hassine-master-patch-79254
4 results

nb1er.c

Blame
  • Forked from algorithmique / cours
    Source project has a limited visibility.
    BaseRoutes.ts 4.78 KiB
    import express         from 'express';
    import { StatusCodes } from 'http-status-codes';
    import DBHandler       from '../database/Database';
    import { User_t, Question_t } from '../database/Database';
    import { Jwt } from 'jsonwebtoken';
    import { userInfo } from 'os';
    
    const ROUTE:string = '/API/v1';
    
    const router: express.Router = express.Router();
    
    const jwt = require('jsonwebtoken');
    
    
    router.get('/', (req: express.Request, res: express.Response) => res.status(StatusCodes.OK).end());
    
    function generateToken(user: User_t) {
        let payload = user;
        delete payload.password;
        
        return jwt.sign(payload, process.env.TOKEN_SECRET);
    }
    
    function isAdmin(token: string): Boolean {
        let adminToken: Boolean;
    
        if (token == null) return false;
        jwt.verify(token, process.env.TOKEN_SECRET, (err:any, user:User_t) => {
            // console.log(err);
            
            if (err) return false;
                adminToken = user.type === "admin"
        });
    
        return adminToken;
    }
    
    function tokenDecode(req: express.Request): User_t {
        let user_data: User_t;
    
    
        const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1]
        jwt.verify(token, process.env.TOKEN_SECRET, (err:any, user:User_t) => {
            // console.log(err);
    
            if (err) user_data = undefined;
            else
                user_data = user;
        });
    
        return user_data;
    }
    
    // USERS CRUD
    
    router.post(ROUTE+'/user', (req: express.Request, res: express.Response) => {
        const a = req.body as User_t;
        
        if (a.username === undefined || 
            a.password === undefined) {
    
            return res.status(StatusCodes.BAD_REQUEST).end();
        }
    
        DBHandler.verifyUsernameExistence(a.username)
        .then(exists => {
            if (exists) {
                res.statusMessage = "Username taken";
                res.status(StatusCodes.CONFLICT).end();
                return;
            }
            DBHandler.postUser(req, res);
    
            const token = generateToken(a);
            res.status(StatusCodes.OK).json({token});
        });
    });
    
    router.get(ROUTE+'/user', (req: express.Request, res: express.Response) => {
        const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1]
    
        if (!isAdmin(token))
            return res.status(StatusCodes.UNAUTHORIZED).end();
    
        DBHandler.getUsers(res);
    });
    
    router.patch(ROUTE+'/user/:id', (req: express.Request, res: express.Response) => {
        const a = req.body as User_t;
    
        // if (a.username === undefined || 
        //     a.password === undefined || 
        //     a.type === undefined) {
    
        //     res.statusMessage = "invalid JSON";
        //     res.status(StatusCodes.BAD_REQUEST).end();
        //     return;
        // }
    
        console.log(a);
    
        if (a.type === "admin")
            if (!isAdmin(req.headers['authorization'] && req.headers['authorization'].split(' ')[1]))
                res.status(StatusCodes.UNAUTHORIZED).end();
        
        const user = tokenDecode(req);
    
        if (a.username != user.username)
            DBHandler.verifyUsernameExistence(a.username)
            .then(exists => {
                if(exists)
                    return res.status(StatusCodes.CONFLICT).end();
            
                DBHandler.updateUser(req, res);
            })
        
    });
    
    router.delete(ROUTE+"/user/:id", (req: express.Request, res: express.Response) => {
        DBHandler.deleteUser(req, res);
    })
    
    // QUESTIONS CRUD
    
    router.post(ROUTE+'/question', (req: express.Request, res: express.Response) => {
        const a = req.body as Question_t;
    
        if (a.question === undefined ||
            a.category === undefined) {
                res.statusCode = 400;
                res.statusMessage = "invalid JSON";
                res.end();
                return;
        }
        
        DBHandler.postQuestion(req, res);
    })
    
    router.get(ROUTE+'/question', (req: express.Request, res: express.Response) => {
        DBHandler.getQuestions(req, res);
    })
    
    router.patch(ROUTE+'/question/:id', (req: express.Request, res: express.Response) => {
        DBHandler.updateQuestion(req, res);
    })
    
    router.delete(ROUTE+'/question/:id', (req: express.Request, res: express.Response) => {
        DBHandler.deleteQuestion(req, res);
    })
    
    // CATEGORIES CRUD
    
    router.post(ROUTE+'/category', (req: express.Request, res: express.Response) => {
        DBHandler.postCategory(req, res);
    })
    
    router.get(ROUTE+'/category', (req: express.Request, res: express.Response) => {
        DBHandler.getCategories(req, res);
    })
    
    router.delete(ROUTE+"/category", (req: express.Request, res: express.Response) => {
        DBHandler.deleteCategory(req, res);
    })
    
    
    // MISC
    
    router.post(ROUTE+"/login", (req: express.Request, res: express.Response) => {
        var user = req.body as User_t;
    
        DBHandler.getLoginJSON(user)
        .then(loginJSON => {
            res.status(StatusCodes.OK).json(generateToken(loginJSON as User_t))})
        .catch(err => {
            console.log(err)
            res.status(StatusCodes.UNAUTHORIZED).json(JSON.parse(err));
        })
    })
    
    export default router;