The data
folder contains a database populated with test posts
.
Database access will be done using the db.js
file included inside the data
folder.
The db.js
publishes the following methods.
find()
: calling find returns a promise that resolves to an array of all theposts
contained in the database.findById()
: this method expects anid
as it's only parameter and returns a promise that resolves to the post corresponding to theid
provided or an empty array if no post with thatid
is found.insert()
: calling insert passing it apost
object will add it to the database and return a promise that resolves to an object with theid
of the inserted post. The object looks like this:{ id: 123 }
.update()
: accepts two arguments, the first is theid
of the post to update and the second is an object with thechanges
to apply. It returns a promise that resolves to the count of updated records. If the count is 1 it means the record was updated correctly.remove()
: the remove method accepts anid
as its first parameter and upon successfully deleting the post from the database it returns a promise that resolves to the number of records deleted.findPostComments()
: the findPostComments accepts apostId
as its first parameter and returns a promise that resolves to an array of all comments on the post associated with the post id.findCommentById()
: accepts anid
and returns a promise that resolves to the comment associated with that id.insertComment()
: calling insertComment while passing it acomment
object will add it to the database and return a promise that resolves to an object with theid
of the inserted comment. The object looks like this:{ id: 123 }
. This method will throw an error if thepost_id
field in thecomment
object does not match a valid post id in the database.
Now that we have a way to add, update, remove and retrieve data from the provided database, it is time to work on the API.
A Blog Post in the database has the following structure:
{
title: "The post title", // String, required
contents: "The post contents", // String, required
created_at: Mon Aug 14 2017 12:50:16 GMT-0700 (PDT) // Date, defaults to current date
updated_at: Mon Aug 14 2017 12:50:16 GMT-0700 (PDT) // Date, defaults to current date
}
A Comment in the database has the following structure:
{
text: "The text of the comment", // String, required
post_id: "The id of the associated post", // Integer, required, must match the id of a post entry in the database
created_at: Mon Aug 14 2017 12:50:16 GMT-0700 (PDT) // Date, defaults to current date
updated_at: Mon Aug 14 2017 12:50:16 GMT-0700 (PDT) // Date, defaults to current date
}
- Add the code necessary to implement the endpoints listed below.
- Separate the endpoints that begin with
/api/posts
into a separateExpress Router
.
Configure the API to handle to the following routes:
Method | Endpoint | Description |
---|
| DELETE | /api/posts/:id | Removes the post with the specified id and returns the deleted post object. You may need to make additional calls to the database in order to satisfy this requirement. |
| PUT | /api/posts/:id | Updates the post with the specified id
using data from the request body
. Returns the modified document, NOT the original. |
When the client makes a POST
request to /api/posts
:
- If the request body is missing the
title
orcontents
property:
- If the information about the post is valid:
- If there's an error while saving the post:
When the client makes a POST
request to /api/posts/:id/comments
:
-
If the post with the specified
id
is not found: -
If the request body is missing the
text
property: -
If the information about the comment is valid:
-
If there's an error while saving the comment:
When the client makes a GET
request to /api/posts
:
- If there's an error in retrieving the posts from the database:
When the client makes a GET
request to /api/posts/:id
:
- If the post with the specified
id
is not found:
- If there's an error in retrieving the post from the database:
When the client makes a GET
request to /api/posts/:id/comments
:
-
If the post with the specified
id
is not found: -
If there's an error in retrieving the comments from the database:
When the client makes a DELETE
request to /api/posts/:id
:
-
If the post with the specified
id
is not found:- return HTTP status code
404
(Not Found). - return the following JSON object:
{ message: "The post with the specified ID does not exist." }
.
- return HTTP status code
-
If there's an error in removing the post from the database:
- cancel the request.
- respond with HTTP status code
500
. - return the following JSON object:
{ error: "The post could not be removed" }
.
When the client makes a PUT
request to /api/posts/:id
:
- If the post with the specified
id
is not found:
-
If the request body is missing the
title
orcontents
property: -
If there's an error when updating the post:
- cancel the request.
- respond with HTTP status code
500
. - return the following JSON object:
{ error: "The post information could not be modified." }
.
-
If the post is found and the new information is valid:
- update the post document in the database using the new information sent in the
request body
. - return HTTP status code
200
(OK). - return the newly updated post.
- update the post document in the database using the new information sent in the
To work on the stretch problems you'll need to enable the cors
middleware. Follow these steps:
- add the
cors
npm module:npm i cors
. - add
server.use(cors())
afterserver.use(express.json())
.
Create a new React application and connect it to your server:
- Use
create-react-app
to create an application inside the root folder, name itclient
. - From the React application connect to the
/api/posts
endpoint in the API and show the list of posts. - Style the list of posts however you see fit.