Welcome to OurMovieList, a dynamic and interactive web application designed to enhance how friends and groups discover, manage, and share their favorite movies. This platform offers a seamless experience for tracking trending films, creating and managing private groups, and building shared watchlists, fostering a collaborative movie-watching journey.
- ๐ฌ Trending Movies Display: Browse a curated list of trending movies fetched from the TMDB API, presented in an appealing, responsive grid.
- ๐ฅ Group Management: Create and manage private groups, inviting friends to join for shared movie lists.
- ๐ค Group Watchlists: Collaborate with group members to build and track shared movie watchlists. Movies can be easily added to a group's watchlist directly from the trending section.
- ๐ Robust Authentication: Secure user authentication powered by Supabase, ensuring private data and group access are protected.
- ๐ Next.js Server Actions: Leverages the power of Next.js Server Actions for secure and efficient server-side data mutations and API calls, optimizing performance and reducing client-side logic.
- ๐ Seamless Navigation: Intuitive user interface for effortless navigation between trending movies, group lists, and individual group pages.
- Next.js
- Prisma ORM
- PostgreSQL
- Supabase
- Tailwind CSS
- The Movie Database (TMDB) API
Represents a user in the system.
id
: Unique identifier for the user (UUID).email
: User's email address (unique).displayName
: Optional display name for the user.groupsCreated
: A list ofGroup
s that this user has created (one-to-many relationship withGroup
).groupMembers
: A list ofGroupMember
entries, indicating which groups the user belongs to (one-to-many relationship withGroupMember
).watchlistItems
: A list ofGroupWatchlist
items that this user has added to various group watchlists (one-to-many relationship withGroupWatchlist
).
Represents a group created by a user.
id
: Unique identifier for the group (UUID).name
: The name of the group.createdBy
: TheUser
who created this group (many-to-one relationship withUser
).createdById
: The ID of the user who created the group.members
: A list ofGroupMember
entries, indicating who belongs to this group (one-to-many relationship withGroupMember
).watchlistItems
: A list ofGroupWatchlist
items associated with this group (one-to-many relationship withGroupWatchlist
).createdAt
: Timestamp when the group was created.
Represents a many-to-many relationship between User
and Group
, indicating a user's membership in a specific group.
id
: Unique identifier for the group membership entry (UUID).group
: TheGroup
that the user is a member of (many-to-one relationship withGroup
).groupId
: The ID of the group.user
: TheUser
who is a member of the group (many-to-one relationship withUser
).userId
: The ID of the user.hasAcceptedInvite
: A boolean indicating whether the user has accepted the group invitation.joinedAt
: Timestamp when the user joined the group (or accepted the invite).
Represents a movie added to a group's shared watchlist.
id
: Unique identifier for the watchlist item (UUID).group
: TheGroup
to which this watchlist item belongs (many-to-one relationship withGroup
).groupId
: The ID of the group.addedBy
: TheUser
who added this movie to the watchlist (many-to-one relationship withUser
).addedById
: The ID of the user who added the movie.movieId
: The ID of the movie (e.g., TMDB ID).watched
: A boolean indicating whether the movie has been watched by the group.addedAt
: Timestamp when the movie was added to the watchlist.
- User to Group (Creator): One user can create many groups. (
User.groupsCreated
->Group.createdBy
) - User to Group (Member): One user can be a member of many groups, and one group can have many members. This is managed by the
GroupMember
join table. (User.groupMembers
<->GroupMember
<->Group.members
) - Group to GroupWatchlist: One group can have many movies on its watchlist. (
Group.watchlistItems
->GroupWatchlist.group
) - User to GroupWatchlist (Added By): One user can add many movies to various group watchlists. (
User.watchlistItems
->GroupWatchlist.addedBy
)