Skip to content

Latest commit

Β 

History

History
311 lines (247 loc) Β· 10.7 KB

File metadata and controls

311 lines (247 loc) Β· 10.7 KB

Local Singles Date Night

Local Singles Date Night Node.js React TypeScript PostgreSQL

Local Singles Date Night is a dating platform that flips the traditional model on its head: instead of paying for memberships or endless boosts, users pre-purchase a 1, 3, 5, or 10-dinner package from participating local restaurants and businesses.

🎯 Value Proposition

For Singles:

  • Curated first-date experiences with local restaurants
  • No endless swiping or chat fatigue
  • Budget clarity with prepaid packages
  • Safety features and verified profiles
  • Real-world meetings with compatible matches

For Restaurants:

  • Predictable prepaid revenue
  • Demand smoothing on lower-traffic nights
  • Turnkey co-marketing opportunities
  • Reduced no-shows with prepaid bookings

πŸš€ Quick Start

Prerequisites

  • Docker and Docker Compose
  • Git

Local Development with Docker (Recommended)

  1. Clone and setup:

    git clone <repository-url>
    cd LSDN
  2. Start all services with Docker Compose:

    docker compose up -d

    This will start:

    • PostgreSQL with PostGIS (port 5432)
    • Redis (port 6379)
    • Backend API (port 3000)
    • Frontend (port 5173)
  3. Seed the database with Santa Cruz demo data:

    docker compose exec backend npm run seed
  4. Access the applications:

  5. Test credentials:

    • Email: sc.tester@example.com
    • Password: Password123!

Viewing Logs

# All services
docker compose logs -f

# Specific service
docker compose logs -f backend
docker compose logs -f frontend

Stopping Services

# Stop all containers
docker compose down

# Stop and remove volumes (fresh start)
docker compose down -v

πŸ—οΈ Architecture

Tech Stack

Backend:

  • Node.js with Express.js
  • TypeScript
  • PostgreSQL with PostGIS
  • Redis for caching
  • Stripe for payments
  • Cloudinary for image processing

Frontend:

  • React 18 with TypeScript
  • Vite for build tooling
  • Tailwind CSS for styling
  • React Query for state management
  • React Hook Form for forms

Infrastructure:

  • Docker for containerization
  • Docker Compose for local development
  • Render.com for easy deployment
  • GitHub Actions for CI/CD

System Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   React App     β”‚    β”‚   Restaurant    β”‚    β”‚   Admin Portal  β”‚
β”‚   (Frontend)    β”‚    β”‚   Partner Portalβ”‚    β”‚   (Management)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                      β”‚                      β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚    Express.js API       β”‚
                    β”‚    (Backend Server)     β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚     PostgreSQL DB       β”‚
                    β”‚    (Primary Storage)    β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚        Redis            β”‚
                    β”‚    (Caching/Session)    β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚            β”‚            β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”  β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”
          β”‚   Stripe   β”‚  β”‚ Cloudinary  β”‚  β”‚ SendGrid β”‚
          β”‚  Payments  β”‚  β”‚  Images     β”‚  β”‚  Email   β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“– Documentation

🎯 Key Features (Implemented)

User Experience

  • βœ… Email/Password Registration - Simple account creation
  • βœ… Profile Completion - Name, age, bio, interests, goals (interests/goals optional)
  • βœ… Preferences Setup - Age range, distance radius, interests
  • βœ… Discover Restaurants - Browse local partner restaurants
  • βœ… Proximity-Based Matching - PostGIS-powered location matching
  • βœ… Real Bookings - Create bookings with voucher codes and QR codes
  • βœ… Voucher System - 8-character unique codes per booking
  • βœ… QR Code Generation - Scannable codes for restaurant validation
  • βœ… State Persistence - Onboarding progress saved to localStorage

Restaurant Partner Experience (Data Seeded)

  • βœ… Restaurant Profiles - Name, description, location, cuisine type
  • βœ… Package Management - Date night packages with pricing
  • βœ… Availability Slots - Time-based booking slots
  • βœ… Capacity Management - Track current bookings vs capacity
  • 🚧 Partner Portal - Planned for future release

Technical Features

  • βœ… JWT Authentication - Secure token-based auth
  • βœ… PostGIS Integration - Geo-spatial queries for proximity matching
  • βœ… Joi Validation - Schema-based input validation
  • βœ… Docker Deployment - Full containerization
  • βœ… TypeScript - Type-safe backend and frontend
  • βœ… Context-Based State - Global auth and onboarding contexts

Features In Progress

  • 🚧 Email Verification - Currently bypassed (auto-verified)
  • 🚧 Stripe Payments - Integration stubbed
  • 🚧 Real-time Messaging - Basic messaging structure in place
  • 🚧 Image Uploads - Currently base64, plan to use Cloudinary

πŸ“š Documentation

πŸ”§ Development

Project Structure

LSDN/
β”œβ”€β”€ backend/              # Node.js + Express API
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ entities/     # TypeORM entities
β”‚   β”‚   β”œβ”€β”€ routes/       # API route handlers
β”‚   β”‚   β”œβ”€β”€ services/     # Business logic
β”‚   β”‚   β”œβ”€β”€ middleware/   # Auth, validation, etc.
β”‚   β”‚   └── scripts/      # Migration and seed scripts
β”‚   └── dist/             # Compiled TypeScript
β”œβ”€β”€ frontend/             # React + Vite frontend
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ components/   # Reusable UI components
β”‚   β”‚   β”œβ”€β”€ contexts/     # React contexts (Auth, Onboarding)
β”‚   β”‚   β”œβ”€β”€ hooks/        # Custom React hooks
β”‚   β”‚   └── pages/        # Page components
β”‚   └── dist/             # Production build
β”œβ”€β”€ docker-compose.yml    # Docker services configuration
└── docs/                 # Additional documentation

Environment Setup

The application uses environment variables for configuration. Key variables:

Backend:

  • DATABASE_URL - PostgreSQL connection string
  • REDIS_URL - Redis connection string
  • JWT_SECRET - JWT signing secret
  • FRONTEND_URL - CORS allowed origin

Frontend:

  • VITE_API_URL - Backend API URL (handled by Vite proxy)

Testing

# Backend tests (when implemented)
cd backend
npm run test

# Manual API testing
curl http://localhost:3000/api/restaurants

πŸ“Š Metrics and Monitoring

Key Performance Indicators

  • Completed first dates per active user per month
  • Restaurant partner NPS
  • GMV and take rate
  • Sign-up to package purchase conversion
  • Ask to accept rate
  • Show rate and no-show rate
  • Slot utilization per venue

Monitoring Setup

  • Application logs
  • Database performance
  • API response times
  • Error tracking
  • User analytics

πŸ›‘οΈ Security

Authentication

  • JWT with refresh tokens
  • Password hashing with bcrypt
  • Email verification required

Authorization

  • Role-based access control
  • API rate limiting
  • Input validation and sanitization

Data Protection

  • HTTPS only
  • Encrypted database connections
  • Secure file uploads
  • Regular security audits

🀝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

Development Setup

  1. Fork the repository
  2. Clone your fork
  3. Create a feature branch
  4. Make your changes
  5. Add tests
  6. Submit a pull request

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ™ Acknowledgments

πŸ“ž Support

For support and questions:

  • Create an issue in this repository
  • Join our community discussions
  • Contact the development team

Local Singles Date Night - Making dating local, meaningful, and community-focused. ❀️