Watchboxd

Jack Roybal

Backend Engineer
Frontend Engineer
Web Developer
JavaScript
Python
React

Watchboxd is a clone of Letterboxd, a movie-based social media site. Watchboxd is providing the moviegoer a space to create custom lists, find friends and discover films.

Check out Watchboxd

Technologies Used

Python
HTML5
JavaScript
CSS3
React
Redux
Flask
PostgreSQL
Amazon AWS

Splash Page

Films

Lists

Getting started

Clone this repository:
https://github.com/ExcuseMeImJack/watchboxd.git
2. Install denpendencies into the Backend by running this command in the terminal:
pipenv install -r requirements.txt
3. Install denpendencies into the Frontend by running these commands in another terminal:
cd react-app
npm install
4. Create a .env file using the .envexample provided
5. Set up your database with information from your .env and then run the following to create your database, migrate, and seed:
pipenv run flask db migrate
pipenv run flask db upgrade
pipenv run flask seed all
6. Start the app for both backend using:
pipenv run flask run
7. Start the app for both frontend using:
npm start
8. Now you can use the Demo User or Create an account

Amazon Web Services S3

For setting up your AWS refer to this guide.

Features

Films

Logged in users can create a Film
Users can read/view Films
Logged in users can update their Film
Logged in users can delete their Film

Lists

Logged in users can create Lists and add Films to the lists
Users can read/view all of the Lists
Logged in users can update their Lists
Logged in users can delete their List

Profile

Users can create a Profile
Logged in users can read/view their Profile
Logged in users can update their Profile
Logged in users can delete their Profile

Likes

Logged in users can like a Film
Logged in users can read/view their Likes
Logged in users can delete/remove their Like from a Film

Watches

Logged in users can add a Watched to a Film
Logged in users can read/view their Watches
Logged in users can delete/remove their Watches from a Film

Watchlist

Logged in users can add a Film to their Watchlist to create the Watchlist
Logged in users can read/view their Watchlist
Logged in users can update their Watchlist

AWS

Logged in users can upload a profile picture to AWS S3
Logged in users can upload a film background image to AWS S3
Logged in users can upload a film tile image to AWS S3

Future Features

Shows

Logged in users can create a Show
Users can read/view Shows
Logged in users can update their Show
Logged in users can delete their Show

Friends

Logged in users can friend other users
Logged in users can read/view their friends
Logged in users can remove another user as a friend

Advanced Details for Films and Shows

Genres will be able to be added by dropdown menu
Cast and Crew will be able to be added to the Film/Show
Episodes will be added to the Shows
Users will be able to view a cast/crew member's detail page

Web Sockets

Logged in users can message other users they friend

API Routes

This web app uses the following API routes to dynamically update the page to create a single-page-app-like feel for the user for specific features.

FILMS

GET /api/films
Purpose: Query for all the films and returns them in a list of film dictionaries
Return: {'films': [{'id': 1, 'title': 'Jurassic Park', . . . }, {'id': 1, . . . }]}
GET /api/films/{film_id}
Purpose: Query for a film by the film id and returns a film in a dictionary
Return: {'id': 1, 'title': 'Jurassic Park', . . . }
POST /api/films
Purpose: Create a film that will assign the current user as it's creator and returns the created film in a dictionary
Return: {'id': 1, 'title': 'Jurassic Park', . . . }
PUT /api/films/{film_id}
Purpose: Update a film by id if the film belongs to the current user and returns the updated film in a dictionary
Return: {'id': 1, 'title': 'Jurassic Park', . . . }
PUT /api/films/{film_id}
DELETE /api/films/{film_id}
Purpose: Delete a film by id
Return: {'message': 'Successfully deleted!'}

LISTS

GET /api/lists
Purpose: Query for all the lists and returns them in a dictionary
Return: {'lists': [{'id': 1, 'list_name': 'My List', . . . }, {'id': 2, 'list_name': 'My List', . . . }]}
GET /api/lists/{list_id}
Purpose: Query for a list by the list id and returns a list in a dictionary
Return: {'id': 1, 'list_name': 'My List', . . . }
POST /api/lists
Purpose: Create a new list
Return: {'id': 1, 'list_name': 'My List', . . . }
PUT /api/lists/{list_id}
Purpose: Update a list by id
Return: {'id': 1, 'list_name': 'My List', . . . }
DELETE /api/lists/{list_id}
Purpose: Delete a list by id
Return: {'message': 'Successfully deleted!'}

LIKES

POST /api/likes/{film_id}
Purpose: Add a like to a film
Return: 'message': 'Film liked'
DELETE /api/likes/{film_id}
Purpose: Remove a like from a film
Return: {'message': 'Film unliked'}

WATCHED

POST /api/watched/{film_id}
Purpose: Add a watched to a film
Return: 'message': 'Film watched'
DELETE /api/watched/{film_id}
Purpose: Remove a watched from a film
Return: {'message': 'Film unwatched'}

WATCHLIST

POST /api/watchlist/{film_id}
Purpose: Add a film to the user's watchlist
Return: {'message': 'Film added to watchlist'}
DELETE /api/watchlist/{film_id}
Purpose: Remove a film from the user's watchlist
Return: {'message': 'Film removed from watchlist'}

USERS

GET /api/users
Purpose: Query for all users and returns them in a list of user dictionaries
Return: {'users': [{'id': 1, 'first_name': 'Tester', . . .}, {'id': 2, 'first_name': 'Tester', . . .}]}
GET /api/users/{user_id}
* Purpose: View a specific user by id
* Return: {'id': 1, 'first_name': 'Tester', . . .}
POST /api/auth/signup
Purpose: Create a new user
Return {'id': 1, 'first_name': 'Tester', . . .}
PUT /api/users
*Purpose: Update the current user
*Return: {'id': 1, 'first_name': 'Tester', . . .}
DELETE /api/users
Purpose: Delete the current user
Return: {'message': 'Successfully deleted!'}
Partner With Jack
View Services

More Projects by Jack