In this challenge, you build an API and write custom middleware that satisfies the requirements listed under the Minimum Viable Product
section.
Read these instructions carefully. Understand exactly what is expected before starting.
You are allowed, and encouraged, to collaborate with other peers. Please follow the twenty-minute rule, before seeking support from your TL and Instructor.
- Create a forked copy of this project.
- Add your
Team Lead
as collaborator on Github. - Clone your OWN version of the repository.
- Create a new branch: git checkout -b
<firstName-lastName>
. - Implement the project on your newly created
<firstName-lastName>
branch, committing changes regularly. - Push commits: git push origin
<firstName-lastName>
.
Follow these steps for completing your project.
- Submit a Pull-Request to merge Branch into master (student's Repository). Please don't merge your own pull request
- Add your
Team Lead
as a reviewer on the pull-request - Your
Team Lead
will count the project as complete by merging the branch back into master. - Do your magic!
- Write and implement four custom
middleware
functions, detailed below. - Build an API to let clients perform CRUD operations on
users
. - Add endpoints to retrieve the list of
posts
for auser
and to store a newpost
for auser
.
-
logger()
logger
logs to the console the following information about each request: request method, request url, and a timestamp- this middleware runs on every request magde to the API
-
validateUserId()
validateUserId
validates the user id on every request that expects a user id parameter- if the
id
parameter is valid, store that user object asreq.user
- if the
id
parameter does not match any user id in the database, cancel the request and respond with status400
and{ message: "invalid user id" }
-
validateUser()
validateUser
validates thebody
on a request to create a new user- if the request
body
is missing, cancel the request and respond with status400
and{ message: "missing user data" }
- if the request
body
is missing the requiredname
field, cancel the request and respond with status400
and{ message: "missing required name field" }
-
validatePost()
validatePost
validates thebody
on a request to create a new post- if the request
body
is missing, cancel the request and respond with status400
and{ message: "missing post data" }
- if the request
body
is missing the requiredtext
field, cancel the request and respond with status400
and{ message: "missing required text field" }
There are two helper files that you can use to manage the persistence of users and posts data. These files are users/userDb.js
and posts/postDb.js
. Both files publish the following api:
get()
: calling get returns a promise that resolves to an array of all theresources
contained in the database.getById()
: takes anid
as the argument and returns a promise that resolves to theresource
with that id if found.insert()
: calling insert passing it aresource
object will add it to the database and return the newresource
.update()
: accepts two arguments, the first is theid
of theresource
to update and the second is an object with thechanges
to apply. It returns the count of updated records. If the count is 1 it means the record was updated correctly.remove()
: the remove method accepts anid
as it's first parameter and, upon successfully deleting theresource
from the database, returns the number of records deleted.
The userDb.js
helper includes an extra method called getUserPosts()
that when passed a user's id
, returns a list of all the posts
for the user
.
All helper methods return a promise.
The Database Schemas for the users
and posts
resources are:
field | data type | metadata |
---|---|---|
id | unsigned integer | primary key, auto-increments, generated by database |
name | string | required, unique |
field | data type | metadata |
---|---|---|
id | unsigned integer | primary key, auto-increments, generated by database |
text | text | required |
user_id | unsigned integer | required, must be the id of an existing user |
We have provided test data for the resources.
-
Add the Post Router
- Implement all endpoints and middleware within
posts/postRouter.js
- Implement all endpoints and middleware within
-
Create a React App
- Use
create-react-app
to create an application inside the root folder, name itclient
. - From the React application connect to the
/api/users
endpoint in the API and show the list of users. - Add functionality to show the details of a user, including their posts, when clicking a user name in the list. Use React Router to navigate to a
/users/:id
route to show the user details. - Add styling!
- Use