CineSeat egy Next.js alapú online mozi jegyfoglaló rendszer. A felhasználó filmeket és vetítési időpontokat böngészhet, kiválaszthatja a kívánt ülőhelyet, majd foglalást rögzíthet. Az alkalmazás SQLite relációs adatbázist használ, a szerveroldali adatkezelés pedig Prisma ORM-en keresztül történik.
bun install
cp .env.example .env
bun run prisma:generate
bun run prisma:push
bun run dev
Az alkalmazás alapértelmezés szerint a http://localhost:3000 címen érhető el.
A Prisma séma alapján az adatbázis a bun run prisma:push paranccsal hozható létre. Az útvonalat a .env fájlban lévő DATABASE_URL adja meg.
DATABASE_URL=file:./.data/cineseat.sqlite
Egyedi adatbázisútvonal a .env fájlban adható meg:
DATABASE_URL=file:/tmp/cineseat.sqlite
A JWT aláíró kulcsot kötelező a JWT_SECRET változóban megadni. Az alapértelmezett admin és demo felhasználók adatait szintén a .env fájlban lévő DEFAULT_* változók határozzák meg.
Redis gyorsítótár használatához állítsd be a REDIS_URL változót. Ha nincs Redis elérhető, állítsd disabled értékre, és az alkalmazás rövid életű memóriacache-t használ:
REDIS_URL=redis://localhost:6379
Az admin felület közvetlenül elérhető:
http://localhost:3000/admin
docker compose up --build
A konténer a 3000 porton fut, az SQLite adatbázist a cineseat-data volume
őrzi meg, a Redis cache pedig külön redis szolgáltatásként indul.
bun run test
bun run lint
bun run build
Az adatbázis létrehozó scriptje:
db/schema.sqlprisma/schema.prismaKezdő adatok:
db/seed.sqlTáblák:
movies: filmekscreenings: vetítési időpontokusers: regisztrált felhasználók és adminokreservations: foglalásokGET /api/moviesVisszaadja a filmeket a hozzájuk tartozó vetítésekkel.
Példa válasz:
{
"movies": [
{
"id": 1,
"title": "Neon Város",
"genre": "sci-fi drama",
"runtimeMinutes": 118,
"rating": "16+",
"screenings": []
}
]
}
GET /api/reservationsVisszaadja az összes foglalást.
GET /api/reservations?mine=1Visszaadja a bejelentkezett felhasználó saját foglalásait. Bejelentkezés nélkül 401 választ ad.
GET /api/reservations?screeningId=1Visszaadja egy vetítés foglalásait és az ülés térképet.
POST /api/reservationsÚj foglalást hoz létre.
Kérés:
{
"customerName": "Teszt Elek",
"email": "teszt@example.com",
"movieId": 1,
"screeningId": 1,
"seatNumber": "A1"
}
Lehetséges státuszkódok:
201: foglalás létrejött400: hibás bemeneti adat404: nem létező film vagy vetítés409: az ülőhely már foglalt500: váratlan szerverhibaPOST /api/auth/registerÚj felhasználót hoz létre, majd JWT cookie-val bejelentkezteti.
{
"name": "Teszt Elek",
"email": "teszt@example.com",
"password": "titkos123"
}
POST /api/auth/loginBejelentkezés e-mail címmel és jelszóval.
{
"email": "demo@example.test",
"password": "a .env fájlban megadott jelszó"
}
POST /api/auth/logoutTörli az aktuális JWT cookie-t.
GET /api/auth/meVisszaadja az aktuális bejelentkezett felhasználót, vagy null értéket.
POST /api/admin/moviesAdmin jogosultsággal új filmet hoz létre.
{
"title": "Új film",
"genre": "drama",
"runtimeMinutes": 110,
"rating": "12+",
"posterTone": "cyan",
"synopsis": "Rövid filmleírás legalább tíz karakterrel."
}
PUT /api/admin/movies/:idAdmin jogosultsággal meglévő film adatait frissíti.
POST /api/admin/screeningsAdmin jogosultsággal új vetítést hoz létre.
{
"movieId": 1,
"startsAt": "2026-05-14T19:00",
"room": "Premier terem",
"ticketPrice": 2490
}
GET /api/movies, GET/POST /api/reservationstest/cinema-core.test.mjsdb/schema.sql