https://github.com/blevs/node-api-iii
https://github.com/blevs/node-api-iii
Last synced: 16 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/blevs/node-api-iii
- Owner: Blevs
- License: other
- Created: 2019-09-05T02:42:28.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2023-01-11T01:39:12.000Z (over 3 years ago)
- Last Synced: 2025-10-29T02:56:46.516Z (9 months ago)
- Language: JavaScript
- Size: 640 KB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Building an API using a Node.js and Express Middleware
In this challenge, you build an API and write custom middleware that satisfies the requirements listed under the `Minimum Viable Product` section.
## Instructions
**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 PM and Instructor.
## Project Set Up
- [ ] Create a forked copy of this project.
- [ ] Add your project manager as collaborator on Github.
- [ ] Clone your OWN version of the repository.
- [ ] Create a new branch: git checkout -b ``.
- [ ] Implement the project on your newly created `` branch, committing changes regularly.
- [ ] Push commits: git push origin ``.
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 project manager as a reviewer on the pull-request
- [ ] Your project manager will count the project as complete by merging the branch back into master.
- [ ] Do your magic!
## Minimum Viable Product
1. Write and implement four custom `middleware` functions, detailed below.
1. Build an API to let clients perform CRUD operations on `users`.
1. Add endpoints to retrieve the list of `posts` for a `user` and to store a new `post` for a `user`.
#### Custom Middleware Requirements
- `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 made 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 as `req.user`
- if the `id` parameter does not match any user id in the database, cancel the request and respond with status `400` and `{ message: "invalid user id" }`
- `validateUser()`
- `validateUser` validates the `body` on a request to create a new user
- if the request `body` is missing, cancel the request and respond with status `400` and `{ message: "missing user data" }`
- if the request `body` is missing the required `name` field, cancel the request and respond with status `400` and `{ message: "missing required name field" }`
- `validatePost()`
- `validatePost` validates the `body` on a request to create a new post
- if the request `body` is missing, cancel the request and respond with status `400` and `{ message: "missing post data" }`
- if the request `body` is missing the required `text` field, cancel the request and respond with status `400` and `{ message: "missing required text field" }`
### Database Persistence Helpers
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 find returns a promise that resolves to an array of all the `resources` contained in the database.
- `getById()`: takes an `id` as the argument and returns a promise that resolves to the `resource` with that id if found.
- `insert()`: calling insert passing it a `resource` object will add it to the database and return the new `resource`.
- `update()`: accepts two arguments, the first is the `id` of the `resource` to update and the second is an object with the `changes` 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 an `id` as it's first parameter and, upon successfully deleting the `resource` 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.**
#### Database Schemas
The _Database Schemas_ for the `users` and `posts` resources are:
##### Users
| field | data type | metadata |
| ----- | ---------------- | --------------------------------------------------- |
| id | unsigned integer | primary key, auto-increments, generated by database |
| name | string | required, unique |
##### Posts
| 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.
## Stretch Goals
- Add the Post Router
- Implement all endpoints and middleware within `posts/postRouter.js`
- Create a React App
- Use `create-react-app` to create an application inside the root folder, name it `client`.
- 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!