- User registration and login (JWT auth)
- Protected seat booking (only logged-in users)
- Transactional booking prevents duplicates/overbooking
- Neo-brutalism UI
- PostgreSQL backend
Connect to localhost:5433, user postgres, password postgres, DB sql_class_2_db.
Run schema.sql:
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name='seats' AND column_name='user_id'
) THEN
ALTER TABLE seats ADD COLUMN user_id INTEGER REFERENCES users(id);
END IF;
END $$;
DELETE FROM seats;
INSERT INTO seats (isbooked, name, user_id)
SELECT 0, NULL, NULL FROM generate_series(1, 20);cd book-my-ticket
npm installnpm startOr dev: npm run dev
GET /- FrontendGET /seats- List seats (public?)POST /register- {username, password}POST /login- {username, password} → JWTPUT /:id- Book seat (auth header: Bearer )
- Register/Login → get JWT
- Frontend stores token, sends in bookings
- Booking checks seat available & not booked by you
- Associated with user_id
Bold high-contrast design: black/red/white, sharp edges, pixel fonts optional.
- Register new user
- Login, book seat → succeeds
- Try book same seat → fails
- Logout/login other user → can't book taken seats