Upcase Team App Project
App Setup
- Share the code in a public GitHub repo (this allows for free tools)
- Use a Trello board w/ features (roughly follow
Playbook for software design and development - By thoughtbot) - Enable hound for PR style reviews
- Enable CircleCI for testing PRs
- Deploy to Heroku
- Work via PRs w/ code review
App Features
The app you’ll be building is inspired by GoodReads, a social network
centered around books. You’ll be building out a subset of the functionality
on the site using normal Rails techniques. The domain lends itself well to
Rails, with a number of relationships and various ways to display the data
stored in the system.
This app is mainly about the books. Books have titles, descriptions,
cover images (no need to allow file uploads, just store the URL as a string).
Books also have one author and one (or none) genre. They can be grouped into
lists, like “Best Sci-Fi” or “Books that were made into movies”. A book can be
on multiple lists.
The app should comprise of the following pages (also see the attached
wireframes for a bit more detail)
Books Page
- View a list of all books
- List is paginated (20 per page)
- Filter books by Genre
- Sortable by date
Book page
- View a single book, seeing detail like the summary which is not on the
books list. - Users who are signed in and have not already written a review can write a
text review of the book. - The book page should list all reviews (with the review user’s name).
Lists Page
- Shows all of the lists of books, like “Best Sci-Fi”, “Romance”, etc
- Displays the list title, and 5-10 book cover images for each list
List Page
- View an individual list
- Displays each of the books, similar to how they are displayed on the Books
page
Authors Page
- List all the authors
- For each author, show name and sample covers of up to 5 of their books
Author Page
- List author name, bio, etc
- List author books, similar to display on List Page
Advanced Features
If you’re team gets through all of these challenges, then these are a few
more advanced features to try:
URL Slugs
Rather than the normal ID based urls, for instance /books/10
, use “slugs”
based on the book title, for instance /books/the-martian
.
Note The above example is likely insufficient as book titles are not
necessarily unique. Check out GoodReads for a pointer.
Allow Users to edit their reviews
1-5 Star Ratings w/ Review
In addition to the text review, allow users to give a book 1-5 stars. (feel
free to make this a drop down rather than fancy star widget in the form)
Display avg rating
Whenever books are displayed, show the average rating for the book based on
all the reviews
All sorting by average rating
In addition to the sort by date on the books page, allow sorting by avg
rating.
Judging Criteria
@ben and I will judge the apps based on a number of criteria, largely viewing
it as we would any client app. The thoughtbot guides are a good resource
if you are unsure how to move forward.
Some specific criteria we will be focussing on are:
- Git history
- Avoid merge commits
- Have clear commit messages (reference 5 Rules for Good Commit Messages)
- Tests
- Good feature coverage
- Minimal duplication
- Data model / architecture.
- Clean separation of responsibilities for each model. DRY.
- Clean, RESTful routing
- On the books page, the URL should fully capture the pagination, sort, and
filter state
- On the books page, the URL should fully capture the pagination, sort, and
- Clean code
- Minimal duplication
- Expressive well named methods
- small methods
Additional Guidelines
-
No JS - You should need little to no JavaScript to build this app. Even the
pagination, sorting, and filtering should be done using plain HTTP
requests and page reloads. -
Link Everything - Everywhere you display a resource (a book, a list, an
author, etc), make it a link to that resources page. -
No Admin - No need to build admin functionality, instead just use the
console to populate sample data. -
Minimal Design - For this challenge we want to focus on the
functionality and code, not the design. In general try to align to the
layouts in the wireframes, but no need to sweat over fancy styling. -
Gems are Fine - No need to rewrite the world, feel free to use gems as
makes sense
Questions
Feel free to post any questions here and I’ll do my best to answer them and
clarify.