Skip to content

Soroushsbr/IMDb-clone

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 

Repository files navigation

IMDb Clone

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

Tech Stack

  • Backend: Python, FastAPI, psycopg2, JWT (python-jose), bcrypt/passlib
  • Frontend: React, React Router, Axios, Vite
  • Database: PostgreSQL

Project Structure

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

Database Schema

Schema source: backend/Query.dbn.

Tables

  1. user
  • user_id (PK)
  • username (unique), password, email (unique)
  • first_name, last_name, birth_date, region
  1. editor
  • editor_id (PK)
  • username (unique), password, email (unique)
  • first_name, last_name
  1. movie
  • movie_id (PK)
  • editor_id (FK -> editor.editor_id)
  • title, synopsis, release_year, country, language
  1. 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
  1. genre
  • genre_id (PK)
  • name (unique)
  1. movie_genre
  • Composite PK: (movie_id, genre_id)
  • movie_id (FK -> movie.movie_id)
  • genre_id (FK -> genre.genre_id)
  1. people
  • people_id (PK)
  • editor_id (FK -> editor.editor_id)
  • first_name, last_name, birth_date, bio
  1. cast
  • cast_id (PK)
  • movie_id (FK -> movie.movie_id)
  • people_id (FK -> people.people_id)
  • character_name, role

Relation Summary

  • One editor -> many movie
  • One editor -> many people
  • One movie <-> many genre via movie_genre
  • One movie <-> many people via cast
  • One user <-> many movie reviews, but max one review per movie per user (review composite PK)

Backend API Overview

User Auth/Profile

  • POST /register
  • POST /login
  • GET /me
  • PATCH /me (edit first_name, last_name, birth_date, region)

Movies/People (public app flow with auth)

  • GET /movies?offset=0&limit=15&sort=newest|highest_score
  • GET /movies/search?query=...
  • GET /movies/{movie_id}
  • GET /movies/{movie_id}/reviews
  • PUT /movies/{movie_id}/reviews/me (create/update your review)
  • GET /people/{people_id}

Editor

  • POST /editor/register (requires verify_code)
  • POST /editor/login
  • GET /editor/me
  • GET /editor/dashboard
  • GET /editor/genres
  • GET /editor/people/options
  • POST /editor/people
  • GET /editor/people/{people_id} (owned by current editor)
  • PUT /editor/people/{people_id} (owned by current editor)
  • POST /editor/movies
  • GET /editor/movies/{movie_id} (owned by current editor)
  • PUT /editor/movies/{movie_id} (owned by current editor)

Frontend Pages

  • / home
  • /login, /register (user)
  • /browse movie feed with search and menu sorting
  • /movies/:movieId movie details + cast + reviews + review form
  • /people/:peopleId people details + filmography
  • /profile editable user profile
  • /editor/login, /editor/register
  • /editor/dashboard
  • /editor/movies/new, /editor/movies/:movieId/edit
  • /editor/people/new, /editor/people/:peopleId/edit

How to Run

1. Database

  1. Create PostgreSQL database named IMDb.
  2. Run table creation SQL from backend/Query.dbn.
  3. Optionally run seed inserts from the same file.

2. Backend

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.main

Backend runs at http://127.0.0.1:8000.

3. Frontend

From frontend/:

npm install
npm run dev

Frontend runs at http://localhost:5173.

Configuration Notes

  • 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.py to:
    • http://localhost:5173

For production, move these values to environment variables.

How to Use

User Flow

  1. Register user account.
  2. Login as user.
  3. Browse movies with infinite load (15 at a time).
  4. Open menu for sort methods (newest release or highest score).
  5. Search movies/people.
  6. Open a movie for full details.
  7. Add or edit your review per movie.
  8. Open profile page and edit profile fields.

Editor Flow

  1. Register editor account with verification code (1111 by default).
  2. Login as editor.
  3. Open dashboard to see movies and people created by you.
  4. Add people records (for cast options).
  5. Add movie with metadata, genres, and cast from existing people.
  6. Edit your existing movies/people from dashboard.

Current Limitations

  • No migration framework yet (manual SQL setup from Query.dbn).
  • Secrets and DB config are hardcoded.
  • No automated test suite included.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published