A full-stack IMDb-style project with:
- FastAPI + PostgreSQL backend
- React + Vite frontend
- User and Editor roles
- Movie browsing, search, details, cast, reviews
- Editor dashboard for managing movies and people
- Backend: Python, FastAPI, psycopg2, JWT (
python-jose), bcrypt/passlib - Frontend: React, React Router, Axios, Vite
- Database: PostgreSQL
IMDb clone/
├─ backend/
│ ├─ Query.dbn # DB schema + seed SQL notebook file
│ └─ app/
│ ├─ main.py # FastAPI app entrypoint
│ ├─ api/ # Route layer
│ │ ├─ auth_routes.py
│ │ ├─ movie_routes.py
│ │ ├─ people_routes.py
│ │ └─ editor_routes.py
│ ├─ core/ # Infra (DB, JWT, dependencies)
│ │ ├─ database.py
│ │ ├─ security.py
│ │ └─ dependencies.py
│ ├─ queries/ # SQL access layer
│ │ ├─ user_repo.py
│ │ ├─ movie_repo.py
│ │ └─ editor_repo.py
│ ├─ services/ # Business logic
│ │ ├─ user_service.py
│ │ └─ editor_service.py
│ ├─ schemas/ # Request/response models
│ │ ├─ auth.py
│ │ ├─ user.py
│ │ └─ editor.py
│ └─ domain/ # Domain entities (dataclasses)
└─ frontend/
├─ package.json
└─ src/
├─ App.jsx # Client-side routing
├─ api/axios.js # Axios instance + auth header
├─ auth/auth.js # Token and role helpers
├─ pages/ # UI pages
└─ index.css # Dark-mode UI styles
Schema source: backend/Query.dbn.
user
user_id(PK)username(unique),password,email(unique)first_name,last_name,birth_date,region
editor
editor_id(PK)username(unique),password,email(unique)first_name,last_name
movie
movie_id(PK)editor_id(FK ->editor.editor_id)title,synopsis,release_year,country,language
review
- Composite PK: (
user_id,movie_id) user_id(FK ->user.user_id)movie_id(FK ->movie.movie_id)body,score(0..10),created_at
genre
genre_id(PK)name(unique)
movie_genre
- Composite PK: (
movie_id,genre_id) movie_id(FK ->movie.movie_id)genre_id(FK ->genre.genre_id)
people
people_id(PK)editor_id(FK ->editor.editor_id)first_name,last_name,birth_date,bio
cast
cast_id(PK)movie_id(FK ->movie.movie_id)people_id(FK ->people.people_id)character_name,role
- One
editor-> manymovie - One
editor-> manypeople - One
movie<-> manygenreviamovie_genre - One
movie<-> manypeopleviacast - One
user<-> manymoviereviews, but max one review per movie per user (reviewcomposite PK)
POST /registerPOST /loginGET /mePATCH /me(editfirst_name,last_name,birth_date,region)
GET /movies?offset=0&limit=15&sort=newest|highest_scoreGET /movies/search?query=...GET /movies/{movie_id}GET /movies/{movie_id}/reviewsPUT /movies/{movie_id}/reviews/me(create/update your review)GET /people/{people_id}
POST /editor/register(requiresverify_code)POST /editor/loginGET /editor/meGET /editor/dashboardGET /editor/genresGET /editor/people/optionsPOST /editor/peopleGET /editor/people/{people_id}(owned by current editor)PUT /editor/people/{people_id}(owned by current editor)POST /editor/moviesGET /editor/movies/{movie_id}(owned by current editor)PUT /editor/movies/{movie_id}(owned by current editor)
/home/login,/register(user)/browsemovie feed with search and menu sorting/movies/:movieIdmovie details + cast + reviews + review form/people/:peopleIdpeople details + filmography/profileeditable user profile/editor/login,/editor/register/editor/dashboard/editor/movies/new,/editor/movies/:movieId/edit/editor/people/new,/editor/people/:peopleId/edit
- Create PostgreSQL database named
IMDb. - Run table creation SQL from
backend/Query.dbn. - Optionally run seed inserts from the same file.
From backend/:
python -m venv venv
venv\Scripts\activate
pip install fastapi uvicorn psycopg2-binary passlib[bcrypt] bcrypt python-jose email-validator
python -m app.mainBackend runs at http://127.0.0.1:8000.
From frontend/:
npm install
npm run devFrontend runs at http://localhost:5173.
- DB connection is currently hardcoded in
backend/app/core/database.py. (don't forget to change it based on your own database information) - JWT secret is currently hardcoded in
backend/app/core/security.py. - Editor verification code is currently hardcoded in
backend/app/services/editor_service.py:EDITOR_VERIFY_CODE = "1111"
- CORS origin is set in
backend/app/main.pyto:http://localhost:5173
For production, move these values to environment variables.
- Register user account.
- Login as user.
- Browse movies with infinite load (
15at a time). - Open menu for sort methods (newest release or highest score).
- Search movies/people.
- Open a movie for full details.
- Add or edit your review per movie.
- Open profile page and edit profile fields.
- Register editor account with verification code (
1111by default). - Login as editor.
- Open dashboard to see movies and people created by you.
- Add people records (for cast options).
- Add movie with metadata, genres, and cast from existing people.
- Edit your existing movies/people from dashboard.
- No migration framework yet (manual SQL setup from
Query.dbn). - Secrets and DB config are hardcoded.
- No automated test suite included.