-
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
npm install
Update .env with example.env
npm run dev
npm run test
field | data_type | constraints |
---|---|---|
firstname | string | optional |
lastname | string | optional |
string | optional | |
password | string | required |
field | data_type | constraints |
---|---|---|
title | string | required |
description | string | optional |
author | ref - User | required |
state | string | required, default: 'draft', enum: ['draft', 'published'] |
read_count | Number | default: 0 |
reading_time | String | |
tags | array | optional |
body | string | required |
- Route: /signup
- Method: POST
- Body:
{
"firstname": "jon",
"lastname": "doe",
"email": "doe@example.com",
"password": "Password1"
}
- Responses
Success
{
status: 'true',
user: {
"_id": "6367c296ba7522bd8561ef56v"
"firstname": "jon",
"lastname": "doe",
"email": "doe@example.com",
"password": "udsafghchjadcb./dk,nksd7dsbndv%$#.v./",
}
}
- Route: /login
- Method: POST
- Body:
{
"password": "Password1",
"username": '"doe@example.com",",
}
- Responses
Success
{
token: 'sjlkafjkldsfjsdhnvmjhvgh'
}
- Route: /blog
- Method: POST
- Header
- Authorization: Bearer {token}
- Body:
{
article: {
title: "The giants",
description: "Fall of the champions",
tags: "Story, fairy",
body: "The story of a Jugu hero"
}
- Responses
Success
{
created_at: Sun Nov 06 2022 08:35:00 GMT+0100,
status: true,
article: {
title: "The giants",
description: "Fall of the champions", tags: ['Story', 'fairy'],
body: "The story of a Jugu hero"},
state: "draft",
read_Count:0, reading_time:1,
author:{
email: "doe@example.com",
"password": "Password1",
"firstname": "jon",
"lastname": "doe",
"username": 'doe@example.com"}
}
}
- Route: /articles
- Method: GET
- Header
- Authorization: Bearer {token}
- Query params:
- page (default: 0)
- skip (default: 20)
- order_by (default: created_at)
- order (options: asc | desc, default: asc)
- created_at
- Responses
Success
{
status: true,
article: [{
title: "The giants",
description: "Fall of the champions", tags: ['Story', 'fairy'],
body: "The story of a Jugu hero"},
state:"published"
read_Count:0, reading_time:1,
author:{
email: "doe@example.com",
"password": "Password1",
"firstname": "jon",
"lastname": "doe",
"username": 'doe@example.com"}
}
}]
}
- Route: /articles/user/:userID
- Method: GET
- Header
- Authorization: Bearer {token}
- Query params:
- page (default: 0)
- skip (default: 20)
- order_by (default: created_at)
- state (default: published)
- Responses
Success
{
status: true,
article: [{
title: "The giants",
description: "Fall of the champions", tags: ['Story', 'fairy'],
body: "The story of a Jugu hero"},
state:"published"
read_Count:0, reading_time:1,
author:{
email: "doe@example.com",
"password": "Password1",
"firstname": "jon",
"lastname": "doe",
"username": 'doe@example.com"}
}
}]
}
- Route: /articles/:articleID
- Method: GET
- Header
- Authorization: Bearer {token}
- Responses
Success
{
status: true,
article: {
title: "The giants",
description: "Fall of the champions", tags: ['Story', 'fairy'],
body: "The story of a Jugu hero"},
state:'published'
read_Count:0,
reading_time:1,
author:{
email: "doe@example.com",
"password": "Password1",
"firstname": "jon",
"lastname": "doe",
"username": 'doe@example.com"}
}
}
}
- Route: /articles/articleID
- Method: PUT
- Header
- Authorization: Bearer {token}
- Body:
{
title: "The updated giants",
}
- Responses
Success
{
created_at: Sun Nov 06 2022 08:35:00 GMT+0100,
status: true,
article: {
title: "The updated giants",
description: "Fall of the champions", tags: ['Story', 'fairy'],
body: "The story of a Jugu hero"},
state: "draft",
read_Count:0, reading_time:1,
author:{
email: "doe@example.com",
"password": "Password1",
"firstname": "jon",
"lastname": "doe",
"username": 'doe@example.com"}
}
}
- Route: /articles/articleID
- Method: PATCH
- Header
- Authorization: Bearer {token}
- Body:
{
state: "published",
}
- Responses
Success
{
created_at: Sun Nov 06 2022 08:35:00 GMT+0100,
status: true,
article: {
title: "The updated giants",
description: "Fall of the champions", tags: ['Story', 'fairy'],
body: "The story of a Jugu hero"},
state: "published",
read_Count:0, reading_time:1,
author:{
email: "doe@example.com",
"password": "Password1",
"firstname": "jon",
"lastname": "doe",
"username": 'doe@example.com"}
}
}
- Route: /articles/:articleID
- Method: GET
- Header
- Authorization: Bearer {token}
- Responses
Success
{
msg: "article deleted successfully",
article: {
title: "The updated giants",
description: "Fall of the champions", tags: ['Story', 'fairy'],
body: "The story of a Jugu hero"},
state: "published",
read_Count:0, reading_time:1,
author:{
email: "doe@example.com",
"password": "Password1",
"firstname": "jon",
"lastname": "doe",
"username": 'doe@example.com"}
}
}