Blog-Link: https://smiling-perch.cyclic.app/
This is an api for a blog api built for exam project
- Users should have a first_name, last_name, email, password
- A user should be able to sign up and sign in into the blog app
- Use JWT as authentication strategy and expire the token after 1 hour
- A blog can be in two states; draft and published
- Logged in and not logged in users should be able to get a list of published blogs created
- Logged in and not logged in users should be able to to get a published blog
- Logged in users should be able to create a blog.
- When a blog is created, it is in draft state.
- The owner of the blog should be able to update the state of the blog to published
- The owner of a blog should be able to edit the blog in draft or published state.
- The owner of the blog should be able to delete the blog in draft or published state.
- The owner of the blog should be able to get a list of their blogs.
- The endpoint should be paginated.
- It should be filterable by state.
- Blogs created should have title, description, tags, author, timestamp, state, read_count, reading_time and body.
- The list of blogs endpoint that can be accessed by both logged in and not logged in users should be paginated:
- default it to 20 blogs per page.
- It should also be searchable by author, title and tags.
- It should also be orderable by read_count, reading_time and timestamp.
- When a single blog is requested, the api should return the user information (the author) with the blog. The read_count of the blog too should be updated by 1.
- Come up with any algorithm for calculating the reading_time of the blog.
- Write tests for all endpoints.
- Install NodeJS, mongodb
- clone this repo
- update env with example.env
- run
npm run start:dev
- somehostsite.com
| field | data_type | constraints |
|---|---|---|
| username | string | required, unique |
| firstname | string | required |
| lastname | string | required |
| string | required | |
| password | string | required, unique |
| articles | ref - Article |
| field | data_type | constraints |
|---|---|---|
| title | string | required, unique |
| description | string | optional |
| author | ref - User | |
| owner | string | |
| state | string | required, default: 'draft', enum: ['draft', 'published'] |
| read_count | Number | default: 0 |
| reading_time | Number | |
| tags | array | optional |
| body | string | required |
- Route: /api/signup
- Method: POST
- Body:
{
"firstName": "Peter",
"lastName": "Drew",
"username": "mightypeter",
"email": "peter@mail.com",
"password": "Prettier0!"
}
- Responses
{ "status": "success", "data": { "firstName": "Peter", "lastName": "Drew", "username": "mightypeter", "email": "peter@mail.com", "articles": [], "_id": "6367c296ba7522yiyfyf45" } }
---
### Login User
- Route: /api/login
- Method: POST
- Body:
{ "username": 'mightypeter", "password": "Prettier0!" }
- Responses
{
"token": "<token>",
"username": "mightypeter",
"name": "Peter"
}
While building this project, I learnt about:
Test Driven Development Testing the backend Database Modelling Database Management Debugging User Authentication User Authorization Documentation
...
- Olawale Mustapha