Skip to main content

Architecture & Platform

Technical architecture of the Lancaster Archery Academy event management system.

Technology Stack

Core Platform

  • Framework: Laravel 8.40+
  • Admin Panel: Laravel Nova 4.0+
  • PHP: 8.2+
  • Frontend: Inertia.js 0.4.1 + Vue 3.2.0
  • Database: MySQL 8.0+ / MariaDB 10.3+
  • Build Tool: Laravel Mix 6.0.6
  • CSS: Tailwind CSS 2.0.3 with @tailwindcss/forms
  • Routing: Ziggy 1.0 (route generation for Vue)

Payment Processing

Authorize.Net Customer Information Manager (CIM):

  • Package: authorizenet/authorizenet: ^2.0
  • Features:
    • Secure payment method storage (tokenization)
    • Recurring subscription billing
    • One-time payments
    • AVS and CVV validation
    • Transaction management (void, refund)

Configuration:

AUTHNET_LOGIN_ID=your_api_login_id
AUTHNET_TRANSACTION_KEY=your_transaction_key
AUTHNET_CLIENT_KEY=your_public_client_key
AUTHNET_MODE=sandbox # or production

Digital Waivers

Smartwaiver Integration:

  • Package: Custom fork in lib/smartwaiver-php-sdk
  • Features:
    • Electronic waiver generation
    • Pre-filled participant data
    • Guardian signatures for minors
    • Webhook notifications
    • Waiver tracking per account

Configuration:

SMARTWAIVER_API_KEY=your_api_key
SMARTWAIVER_TEMPLATE_ID=your_template_id

Laravel Nova Extensions

Content Management:

  • classic-o/nova-media-library - Media uploads and galleries
  • whitecube/nova-flexible-content - Flexible content blocks
  • murdercode/nova4-tinymce-editor - Rich text editing
  • optimistdigital/nova-menu-builder - Navigation management
  • optimistdigital/nova-settings - Site-wide settings

UI Enhancements:

  • codenco-dev/nova-grid-system - Responsive layouts
  • dillingham/nova-attach-many - Many-to-many attachments
  • formfeed-uk/nova-theming-classes - UI customization

Custom Suma Nova Components (in nova-components/):

  1. event-tools - Event management utilities and quick actions
  2. event-insights - Dashboard metrics and visualizations
  3. reports - Custom reporting tools for revenue and analytics
  4. reservation-refund-grid - Advanced refund management interface
  5. volume-discount - Volume-based pricing calculator
  6. generate-sessions - Automated session generation from patterns
  7. theme-assets - Theme customization and asset management
  8. account-preview - Quick account overview modal

Additional Key Packages

Audit Trail:

  • owen-it/laravel-auditing: ^13.7 - Comprehensive activity logging

SEO & Metadata:

  • butschster/meta-tags: ^2.0 - Meta tag management
  • spatie/schema-org: ^3.9 - Structured data markup

Export:

  • maatwebsite/excel: ^3.1 - Excel/CSV export functionality
  • spatie/simple-excel: ^3.2 - Simple spreadsheet operations

Search:

  • titasgailius/search-relations: ^2.0 - Related model searching in Nova

Application Architecture

Frontend Architecture (Inertia.js + Vue 3)

Lancaster Archery uses Inertia.js to build a modern SPA without building an API.

Key Benefits:

  • Server-side routing with Laravel
  • Vue 3 components for UI
  • No API required
  • Shared data between requests
  • Automatic progress bar
  • Asset versioning

Page Structure (resources/js/Pages/):

Pages/
├── Events/
│ ├── List.vue # Event category browsing
│ ├── Detail.vue # Event registration page
│ └── Registrations.vue # Public tournament roster
├── Account/
│ ├── Dashboard.vue # User dashboard
│ ├── Profile.vue # Account management
│ ├── Billing.vue # Payment methods
│ ├── Booking.vue # Reservations & subscriptions
│ ├── Members.vue # Family members
│ ├── Security.vue # Password/email changes
│ └── Transactions.vue # Subscription invoice history
├── Cart/
│ ├── index.vue # Shopping cart
│ └── Charge.vue # Payment processing
├── Checkout/
│ └── Show.vue # Checkout & waiver flow
├── Merchandise/
│ └── Show.vue # Practice passes & merchandise
└── Calendar.vue # Public event calendar

Shared Layout (resources/js/Layouts/Layout.vue):

  • Persistent navigation
  • Authentication state
  • Flash messages
  • Impersonation notice banner
  • Shopping cart indicator
  • Mobile responsive menu

Route Integration with Ziggy:

// In Vue components
route('events.detail', { category: 'leagues', slug: 'weekly-target' })
route('account.dashboard')
route('checkout.show')

// In templates
<Link :href="route('events.detail', { category, slug })">
View Event
</Link>

Backend Architecture

Models (app/Models/):

  • User Management: User, Account, AccountNote
  • Events: Event, Session, EventType, EventCategory, EventLevel
  • Reservations: Reservation, Order, Transaction
  • Subscriptions: Subscription, SubscriptionInvoice, SubscriptionTransaction
  • Tournaments: Division, Team, TeamInvite
  • Content: Merchandise, Coupon, Credit, Waitlist, Waiver
  • CMS: Page, Blog, Location
  • Auditing: Audit (via owen-it/laravel-auditing)

Repositories (app/Models/*/):

  • AccountRepository - Account management logic
  • EventRepository - Event queries and transformations
  • SubscriptionRepository - Subscription billing and generation
  • ReservationRepository - Reservation creation and validation
  • OrderRepository - Order processing and expiration

Services/Managers:

  • WaiverManager (app/Models/WaiverManager.php) - Smartwaiver integration
  • AuthNetGateway (app/Models/Gateways/AuthNetGateway.php) - Payment processing

Database Architecture

40+ Tables organized into logical groups:

Core Entities:

  • users - Staff/admin accounts with role-based access
  • accounts - Customer accounts (multiple per user, family members)
  • events - Classes, tournaments, parties, subscriptions
  • sessions - Individual time slots for events
  • reservations - Bookings linking accounts to sessions

Financial:

  • orders - Purchase records with expiration
  • transactions - Payment processing records (Authorize.Net)
  • subscriptions - Recurring enrollments
  • subscription_invoices - Monthly billing records
  • subscription_transactions - Subscription payment attempts

Supporting:

  • waitlists - Waiting lists for full sessions
  • credits - Account credits from refunds
  • coupons - Discount codes with usage tracking
  • merchandise - Products and practice passes
  • waivers - Digital waiver templates and signatures
  • divisions - Tournament divisions with age/gender rules
  • teams - Team registrations for mixed events
  • timeslots - Recurring time preferences for subscriptions
  • audits - Comprehensive audit trail

Authentication & Authorization

Multi-Account System:

  • Single User (login credentials)
  • Multiple Accounts (family members)
  • Primary account for billing
  • Individual accounts for participants

Role-Based Access (Nova):

  • Super Admin - Full system access
  • Admin - Event and user management
  • Manager - Limited administrative tasks
  • Staff - View-only access

Location-Based Permissions:

  • location_assignments table
  • Users assigned to specific locations
  • Filter events and sessions by location access

Session Management

Cart Expiration:

  • 15-minute cart timeout
  • Countdown timer on cart page
  • Automatic seat release on expiration
  • Database cleanup via scheduled command

Session State:

  • Uses database session driver
  • Stores cart contents
  • Maintains authentication
  • Preserves incomplete orders

Queue System

Background Jobs:

  • Subscription reservation generation
  • Subscription billing charges
  • Email sending (queued)
  • IANSEO export generation
  • Audit cleanup

Configuration:

QUEUE_CONNECTION=redis  # Production
QUEUE_CONNECTION=sync # Development/testing

Development Environment

Requirements

  • PHP 8.2+
  • Composer 2.x
  • Node.js 20.x
  • MySQL 8.0+ or MariaDB 10.3+
  • Redis (for queues and caching in production)

Local Setup Options

Option 1: Laravel Herd (Recommended)

  • Native PHP 8.2+ on macOS/Windows
  • Automatic .test domain resolution
  • Database management included

Option 2: Laravel Sail (Docker)

  • Containerized development environment
  • All services included (MySQL, Redis, Mailhog)
  • Cross-platform compatibility

Option 3: Traditional XAMPP/MAMP

  • Manual PHP/MySQL setup
  • Requires separate Redis installation

Build Tools

Laravel Mix Configuration (webpack.mix.js):

mix.js('resources/js/app.js', 'public/js')
.vue()
.postCss('resources/css/app.css', 'public/css', [
require('tailwindcss'),
])
.version();

NPM Scripts:

npm run dev        # Development build
npm run watch # Watch mode with auto-reload
npm run hot # Hot module replacement
npm run production # Minified production build

Testing Architecture

Test Suite:

  • Feature tests for user flows (registration, checkout, etc.)
  • Unit tests for models and services
  • Browser tests for critical paths (optional, Puppeteer in puppeteer/)

Database:

  • Uses separate test database
  • RefreshDatabase trait for clean state
  • Model factories for test data

Performance Considerations

Caching:

  • Query result caching for events and sessions
  • Route caching in production
  • Config caching in production
  • View caching in production

Eager Loading:

  • Relationships loaded efficiently
  • N+1 query prevention via Debugbar in development

Asset Optimization:

  • Mix versioning for cache busting
  • CSS/JS minification in production
  • Image optimization via Nova Media Library

Security Features

Payment Security:

  • PCI compliance via Authorize.Net CIM
  • No card data stored locally
  • Accept.js tokenization
  • Encrypted billing profile storage

Data Protection:

  • Password hashing (bcrypt)
  • CSRF protection on all forms
  • SQL injection prevention (Eloquent ORM)
  • XSS prevention (Blade auto-escaping)

Audit Trail:

  • All model changes tracked
  • User actions logged
  • IP address and user agent captured
  • Restorable deleted records

Deployment Architecture

Production Environment:

  • VPS or shared hosting with PHP 8.2+
  • MySQL 8.0+ database
  • Redis for caching and queues
  • SSL/TLS certificates (Let's Encrypt)
  • Scheduled cron jobs for billing and cleanup

Deployment Process:

  1. Git pull latest code
  2. composer install --optimize-autoloader --no-dev
  3. npm ci && npm run production
  4. php artisan migrate --force
  5. php artisan config:cache
  6. php artisan route:cache
  7. php artisan view:cache
  8. php artisan queue:restart

Environment Configuration:

APP_ENV=production
APP_DEBUG=false
APP_URL=https://lancasterarcheryacademy.com

LOG_CHANNEL=daily
LOG_LEVEL=warning

SESSION_DRIVER=redis
CACHE_STORE=redis
QUEUE_CONNECTION=redis

Future Architecture Considerations

Potential Enhancements:

  • Mobile app integration (API layer with Laravel Sanctum)
  • Real-time notifications (Laravel Echo + WebSockets)
  • Advanced analytics dashboard (Chart.js integration)
  • Multi-location franchise support
  • Instructor portal with schedule management
  • Equipment rental inventory system
  • Point-of-sale integration for in-person purchases