0.0.1 • Published 1 year ago

@serverless_api/router v0.0.1

Weekly downloads
-
License
-
Repository
-
Last release
1 year ago

Serverless Api Router

This package is part of Serverless Api.


The router implements its routing based on the concept of a radix tree (trie).

Contents

Installation

npm install @serverless_api/router

Creating routes

import { Router, Request, Response } from '@serverless_api/router';

const router = new Router();

router.get('/api/users', (req: Request, res: Response) => {
    res.sendStauts(200);
});

router.post('/api/users/:id', (req: Request, res: Response) => {
    res.status(200).json({
        id: req.params.id,
    });
});

router.put('/api/users/:id', (req: Request, res: Response) => {
    res.status(200).json({
        id: req.params.id,
    });
});

router.patch('/api/users/:id', (req: Request, res: Response) => {
    res.status(200).json({
        id: req.params.id,
    });
});

router.delete('/api/users/:id', (req: Request, res: Response) => {
    res.status(200).json({
        id: req.params.id,
    });
});

const route = router.lookup('GET', '/api/users/1');

if (route) route.handle(req, res);

Groups

import { Router, Request, Response } from '@serverless_api/router';

const router = new Router();

router.group('/api', (api) => {
    api.group('blog', (blog) => {
        blog.get('', (req: Request, res: Response) => {
            res.status(200).json([]);
        });

        blog.get(':slug', (req: Request, res: Response) => {
            res.status(200).json({
                slug: req.params.slug,
            });
        });
    });

    api.group('admin', (admin) => {
        admin.group('blog', (blogAdmin) => {
            blogAdmin.get('', (req: Request, res: Response) => {
                res.status(200).json([]);
            });

            blogAdmin.get(':id', (req: Request, res: Response) => {
                res.status(200).json({
                    id: req.params.id,
                });
            });
        });
    });
});

Middlewares

function authMiddleware(req: Request, res: Response) {
    // Returning false breaks the chain of middlewares
    if (!req.hasHeader('token')) {
        res.sendStatus(401);
        return false;
    }
}

function userMiddleware(req: Request, res: Response) {
    const token = req.getHeader('token');

    // token validation
    // ....
    const id = 'foo';

    if (id) {
        req.setHeader('user', id);
    }
}

// For a single route
router.get('/api/users/:id', (req: Request, res: Response) => {
    res.status(200).json({
        id: req.params.id,
    });
}, authMiddleware, userMiddleware);

// For groups
router.group('/api', (api) => {
    api.group('admin', (admin) => {
        admin.group('blog', (blogAdmin) => {
            blogAdmin.get('', (req: Request, res: Response) => {
                res.status(200).json([]);
            });

            blogAdmin.get(':id', (req: Request, res: Response) => {
                res.status(200).json({
                    id: req.params.id,
                });
            });
        });
    }, authMiddleware, userMiddleware);
});