Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
ab4a68c
docs(plan): update status board and progress after creating feature b…
jamespheffernan Aug 13, 2025
cd18289
chore(scaffold): add app/server/infra directories, .gitignore, and RE…
jamespheffernan Aug 13, 2025
61943de
docs(plan): mark scaffold complete; set next step to API /shows fixture
jamespheffernan Aug 13, 2025
415d6e5
feat(server): add GET /shows with fixture and tests; align Fastify lo…
jamespheffernan Aug 13, 2025
8943458
test(server): fix Fastify logger usage; add working GET /shows test
jamespheffernan Aug 13, 2025
efa9e92
feat(server): add GET /shows/:id/seatmap with fixture and validation;…
jamespheffernan Aug 13, 2025
9e57c25
feat(server): implement seatmap route and validation; fix corrupted f…
jamespheffernan Aug 13, 2025
2f9200d
feat(app): scaffold Expo RN app and Browse screen wired to /shows fix…
jamespheffernan Aug 13, 2025
ad6750a
feat(app): add Seat Map screen, SeatGrid, and simple navigation; exte…
jamespheffernan Aug 13, 2025
9caac74
feat(server): wire checkout/confirm/orders routes into server
jamespheffernan Aug 13, 2025
560bc4a
feat(app): add checkout and confirmation screens; wire multi-screen f…
jamespheffernan Aug 13, 2025
6d11029
docs(plan): update status board and progress after implementing shows…
jamespheffernan Aug 13, 2025
0a3ffda
chore(infra): add docker-compose for Postgres/Redis; add server .env.…
jamespheffernan Aug 13, 2025
b2a61a5
feat(server): integrate Stripe PaymentIntent in /checkout (test mode)
jamespheffernan Aug 13, 2025
d339b99
feat(server): make Stripe optional (mock clientSecret when no key) so…
jamespheffernan Aug 13, 2025
96e710b
feat(server): add BullMQ purchase queue and worker scaffold
jamespheffernan Aug 13, 2025
b70bdb4
feat(app): add polling on Confirmation screen until order is purchase…
jamespheffernan Aug 13, 2025
425cf23
docs(plan): reflect checkout/worker partial completion and app confir…
jamespheffernan Aug 13, 2025
5f2177f
chore(app): wrap with StripeProvider and keep checkout in server-driv…
jamespheffernan Aug 13, 2025
53d202f
chore: commit lockfiles and config drift; align server checkout route…
jamespheffernan Aug 13, 2025
cbd6163
feat(app): add optional Stripe CardField and clientSecret confirm; fa…
jamespheffernan Aug 13, 2025
59f97ce
feat(server): add shows scraper using fixture HTML for CHAIN_X; add u…
jamespheffernan Aug 13, 2025
84eeef8
feat(server): add seatmap scraper using fixture JSON for CHAIN_X; add…
jamespheffernan Aug 13, 2025
7a57bea
feat(server): add DEMO_MODE short-circuit in /confirm to mark purchas…
jamespheffernan Aug 13, 2025
4178959
ci: add GitHub Actions workflow to run server tests in demo mode
jamespheffernan Aug 13, 2025
fa51b0c
feat(server): add Playwright shows scraper skeleton
jamespheffernan Aug 13, 2025
5c5407c
feat(server): add Playwright seatmap scraper skeleton capturing netwo…
jamespheffernan Aug 13, 2025
dc5ce7d
feat(server): expose /metrics and add counters for shows/seatmap/chec…
jamespheffernan Aug 13, 2025
a3f79aa
feat(server): add simple in-memory cache for /shows (15m) and /seatma…
jamespheffernan Aug 13, 2025
4d478da
chore(server): add x-request-id header on responses for debugging
jamespheffernan Aug 13, 2025
82376bc
feat(server): allow live scraping via ?source=live with Playwright fa…
jamespheffernan Aug 13, 2025
4e69ab9
docs(plan): update board and progress with Playwright, metrics, cachi…
jamespheffernan Aug 13, 2025
ac484ac
chore(server): add Prisma schema and generate client (Show, Order)
jamespheffernan Aug 13, 2025
6bb3068
feat(server): wire optional Prisma persistence for orders when POSTGR…
jamespheffernan Aug 13, 2025
8de20d0
feat(server): best-effort upsert of shows into DB when available
jamespheffernan Aug 13, 2025
b48fc72
chore(app): read API base from env and include x-request-id in error …
jamespheffernan Aug 13, 2025
e9fee93
docs: add app .env.example; document env, demo mode, and live scrapin…
jamespheffernan Aug 13, 2025
dfb0a40
feat(server): add /health, requestId in /confirm; minor queue options…
jamespheffernan Aug 13, 2025
1cb5333
chore(server): load env via dotenv and enable CORS for dev
jamespheffernan Aug 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: CI

on:
push:
branches: [ main, mvp-collaborative-movie-booking ]
pull_request:

jobs:
server-tests:
runs-on: ubuntu-latest
defaults:
run:
working-directory: server
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: server/package-lock.json
- name: Install deps
run: npm ci
- name: Run tests
run: npm test
env:
DEMO_MODE: 'true'
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
node_modules
.DS_Store
.env
.expo
.expo-shared
.dist
build
dist
coverage

50 changes: 50 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# SilverScreen — MVP Collaborative Movie Booking

This repository contains a mobile-first MVP for collaborative movie booking.

- App: React Native (Expo) under `app/`
- Server: Fastify/Node with Prisma, BullMQ, Playwright under `server/`
- Infra: Docker Compose for Postgres + Redis under `infra/`

See `docs/implementation-plan/mvp-collaborative-movie-booking.md` for the current plan and status.

## Running locally

Server:
- cd server
- npm install
- npm run dev

App (Expo):
- cd app
- npm install
- npx expo start

API base URL is http://localhost:3001 by default

## Environment

Server (.env):
- PORT=3001
- LOG_LEVEL=info
- TARGET_CHAIN=CHAIN_X
- TARGET_CITY=NYC
- POSTGRES_URL=postgres://postgres:postgres@localhost:5432/silverscreen
- REDIS_URL=redis://localhost:6379
- SCRAPER_USER_AGENT=SilverScreenBot/0.1
- STRIPE_SECRET_KEY=sk_test_...
- STRIPE_WEBHOOK_SECRET=whsec_...
- DEMO_MODE=true # short-circuit purchase flow in /confirm
- SCRAPE_SOURCE=fixtures|live # default scrape source; can override with ?source=live

App (.env):
- EXPO_PUBLIC_API_BASE_URL=http://localhost:3001
- EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_12345

## Demo Mode & Live Scraping
- Demo Mode: set DEMO_MODE=true; /confirm marks purchased without queue
- Live: append ?source=live to /shows and /shows/:id/seatmap or set SCRAPE_SOURCE=live

## CI
- GitHub Actions runs server tests in demo mode on PRs
(adjust in app/src/api/client.ts).
2 changes: 2 additions & 0 deletions app/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
EXPO_PUBLIC_API_BASE_URL=http://localhost:3001
EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_12345
17 changes: 17 additions & 0 deletions app/app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"expo": {
"name": "SilverScreen",
"slug": "silverscreen",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"ios": { "supportsTablet": true },
"android": { "adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#ffffff" } },
"web": { "bundler": "metro", "favicon": "./assets/favicon.png" }
}
}
3 changes: 3 additions & 0 deletions app/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { registerRootComponent } from 'expo';
import App from './src/App';
registerRootComponent(App);
Loading