Designing your Blog API
Tags: webdev, node, api, tutorial
Published: 2023-01-10 20:00:00

Having gone through some of the overviews of the project in our previous [article](https://dev.to/jhhornn/introduction-to-building-your-first-rest-api-with-nodejs-2hbf?preview=3c51d582955a6f4b6e048258efcc49a36cfd1b2064c71ce46995e557c94ef08a3aa9b67c0a9cd051f8a4ebd67ec031716413b72c0048c12628132906) such as setting up our node enviroment, .env, .gitignore and installing all required packages for the project. Let's talk about the Blog API!

The Blog API allows you to perform CRUD (Create, Read, Update and Delete) operations. For the Create, Update and Delete operations, you as an authenticated user can create your own blog and have it as either draft (which is the default) or published, update and delete only your own blog. The owner of the blog is also allowed to update the state of the blog from draft to published

For the Read operation, both authenticated and unauthenticated users can read published blogs. Only authenticated users can view their own drafts.

A summary of endpoints based on the decription given above

|HTTP Method |Routes      |Authenticated?     |Description|                 
|------------|------------------------|----------------|--------|
|GET         |/api/v1/home/blog       |No              |Get all published blogs|
|GET         |/api/v1/home/blog/:id   |No              |Get all published blogs by ID|
|GET         |/api/v1/blog            |Yes             |Get all published and drafted blogs created by the user|
|GET         |/api/v1/blog/:id        |Yes             |Get all published and drafted blogs by ID created by the user|
|POST        |/api/v1/blog            |Yes             |Post blog as an authticated user       |
|PUT         |/api/v1/blog/:id        |Yes             |Update blog as an authenticated user   |
|PATCH       |/api/v1/blog/:id        |Yes             |Update blog state as an authenticated user|
|DELETE      |/api/v1/blog/:id        |Yes             |Delete blog as an authticated user     |

Having drafted out the endpoints, let us look at other features that we will be implementing and the packages that will help us achieve them.

### Setting up our Server
The server is the link between our client and the database. It allows us to run logic that helps us in interacting with the database. All of our CRUD operations run on the server.

### Authentication
The type of authentication used in this API is the `Token Based Authentication`. The user creates an account by signing up then uses the credentials to sign in. This then generates a token that the user will use to access protected Routes.
The packages used:
* [passport](https://www.passportjs.org)
* [passport-jwt](https://www.passportjs.org/packages/passport-jwt/)
* [passport-local](https://www.passportjs.org/packages/passport-local/)
* [jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken)

Summary of endpoints required for authentication

|HTTP Method |Routes             |Description        |
|------------|-------------------|-------------------|
|POST        |/api/v1/signup     |signup user        |
|POST        |/api/v1/login      |login user         |


### Input Validation
Even with a proper API documentation, humans are bound to make mistakes while filling in or supplying details to be sent to the database. So, in order to curb this error, we have packages [joi](https://joi.dev/api/?v=17.7.0) and [mongoose](https://mongoosejs.com/docs/queries.html) that help us do this. They allow us to run some validator checks on inputted data to ensure uniformity in the data collected in the database.

### Error Handling
There are several errors generated from the API and they were properly handled using the error handler middleware and the `express-async-errors` package. Some of the errors that were includes:

|Error Type            |Error Status Code  |
|----------------------|-------------------|
|Bad Request Error     |400                |
|Page not Found Error  |404                |
|Unauthenticated Error |401                |
|Unauthorised Error    |403                |

You can read more on HTTP [status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status).

All of these error modules are found in the `error` folder shown in the project folder structure.

### Middlewares

[Middleware](https://www.tutorialspoint.com/expressjs/expressjs_middleware.htm) functions are functions that have access to the request object (req), the response object (res), and the next middleware function in the application’s request-response cycle. These functions are used to modify req and res objects for tasks like parsing request bodies, adding response headers.
In this project we used middleware functions to handle certain tasks like:
* Input validation
* Authentication
* Filtering blog by query parameters
* Pagination
* Error handling

### Rate Limiting
The rate limiting middleware limits the number of requests that come from a specific user, IP address or location within a given window (period of time). This can be achieved using a package called [express-rate-limit](https://www.npmjs.com/package/express-rate-limit) as middleware

### Cross Origin Resource Sharing (CORS)
This allows us to be able to set sites that can have access to making direct request to our API. These sites that are allowed are whitelisted.This can be achieved using a package called [cors](https://www.npmjs.com/package/cors) as middleware. You can [read more](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) on it

We have learnt the major features we'd be implementing in this project. Let's get into the full implementation of some of these features in our API with codes. BRACE UP! for you're about to enter the world of codes!