---
# System prepended metadata

title: 425 REStful planning review

---


# 425 REStful planning review

* One `member` can have many `books`. `Members`:`Books` have a **1:M** relationship. This relationship describes books being checked out of the library. It is possible for a `book` to not have a `member`, if it is not checked out.
* One `book` can have many `genres`, and a `genre` can have many `books`. `Books`:`Genres` have a **N:M** relationship. 
* The table `books_genres` is simply a join table, used to to maintain a **N:M** relationship. It shouldn't be a part of any **URL**.

Your Task is to write a `RESTful` routing chart for the library system's API. Your API will need to serve full CRUD on `members`, `books`, and `genres`. Do not worry about authentication, another team is handling that. 

members:



* [x] see the information about a member -- books checked out -- money owed, member id
* [x] let a member join the library
* [x] remove a member from the library
* [ ] update some information about a member (such as paying back library fees)

* [x] search for a member -- index of all members

You can use this markdown chart:

| HTTP METHOD (_Verb_) | URL (_Nouns_)                       | CRUD    | Response                               | Notes                |
| -------------------- | ----------------------------------- | ------- | -------------------------------------- | -------------------- |
| members controller   |                                     |         |                                        |                      |
| GET                  | /members                            | READ    | array of members `[ member, member ]`  |                      |
| GET                  | /members/:member_id                 | READ    | a member  `{ member }`                 |                      |
| POST                 | /members                            | CREATE  | redirect to  `GET /members/:member_id` |                      |
| DELETE               | /members/:member_id                 | DESTROY | status `204`                           |                      |
| PUT/PATCH            | /members/:member_id                 | UPDATE  | redirect to  `GET /members/:member_id` |                      |
| books controller     |                                     |         |                                        |                      |
| GET                  | /books                              | READ    | array of books                         |                      |
| GET                  | /books/:book_id                     | READ    | a book                                 |                      |
| POST                 | /books                              | CREATE  | a new book                             |                      |
| PUT                  | /books/:book_id                     | UPDATE  | update the deets of a book             |                      |
| DELETE               | /books/:book_id                     | DESTROY | remove a book                          |                      |
| 1:M members:books    |                                     |         |                                        |                      |
| PATCH                | /members/:member_id/books/:book_id  |         |                                        | checks in/out a book |
| M:M members books    |                                     |         |                                        |                      |
| POST                 | /members/:members_id/books/:book_id |         |                                        | checks out a book    |
| DELETE               | /members/:members_id/books/:book_id |         |                                        | checks in a book     |
| genres controller    |                                     |         |                                        |                      |
| POST                 | /genres                             | CREATE  |                                        |                      |
| POST                 | /books/:book_id/genre/:genre_id     | CREATE  | status `204`                           |                      |
| DELETE               | /books/:book_id/genre/:genre_id     | DESTROY | status `204`                           |                      |
|                      |                                     |         |                                        |                      |

??

#### Things to keep in mind

* A `book` can exist in the database without a member creating it, unlike our blog example. How will this affect the API's endpoints (_URLs_)?
* You will need to create routes that allow `members` to checkout `books` and return `books` to the library. What HTTP methods should you use for these? What _URLs_ would best describe that models that are having actions taken on them _and_ the relationships between the data.
	* **HINT:** if your _URLs_ have the word `checkout` in them, you are falling victim to one of the dreaded **_anti-patterns_**!
* `books` and `genres` are **N:M** and we have the following user stories. Think of the  `HTTP methods` first and then think about the _URLs_. How can you best describe the data relationships in your _URLs_:
	* as a user, I would like to see all the genres a particular book is in.
	* as a user, I would like to see all the books a particular genre has is in it.
* You will need need routes to handle adding a book to a genre and vice-versa


| HTTP METHOD | URL                           | Query Strings | CRUD    | Response                                                        |
| ----------- | ----------------------------- | ------------- | ------- | --------------------------------------------------------------- |
| Pages       |                               |               |         |                                                                 |
| GET         | /                             |               | READ    | render home page                                                |
| GET         | /additional_resources         |               | READ    | render page with recommendations for study materials            |
| GET         | /unsubscribe                  |               | READ    | render page to request an unsubscription link                   |
| Questions   |                               |               |         |                                                                 |
| GET         | /questions/:questionId        |               | READ    | render question with id of :questionId                          |
| GET         | /questions/:questionId/image  |               | READ    | serve image associated with :questionId                         |
| Study       |                               |               |         |                                                                 |
| GET         | /study                        |               | READ    | render page with all study areas and domains                    |
| GET         | /study/:domain                |               | READ    | render domain of study and all topics                           |
| GET         | /study/:domain/:topic         |               | READ    | render topic to study                                           |
| Users       |                               |               |         |                                                                 |
| GET         | /:userId/unsubscribe          |               | READ    | render page to confirm unsubscription                           |
| DELETE      | /:userId/unsubscribe          |               | DESTROY | deletes user and their info                                     |
| POST        | /subscribe                    |               | CREATE  | create user in db                                               |
| GET         | /:userId/subscription_success |               | READ    | render template welcoming user -- dispatch most recent question |
