Architecture
This document provides comprehensive architecture information for the Earthquake Catalogue Platform.
Overview
The Earthquake Catalogue Platform is a Next.js 13+ application built with a modern, serverless architecture. It follows a three-tier architecture pattern:
Presentation Layer: React components with Next.js App Router
Application Layer: Next.js API Routes (serverless functions)
Data Layer: MongoDB with optimized schema and indexes
System Architecture
High-Level Components
flowchart TB
subgraph Client["🖥️ Client Browser"]
UI["React UI Components"]
State["React State Management"]
Maps["Leaflet Map Visualizations"]
end
subgraph NextJS["⚡ Next.js 13+ Application"]
subgraph Frontend["Frontend (App Router)"]
Pages["Pages & Layouts"]
Components["React Components"]
Hooks["Custom Hooks"]
end
subgraph Backend["Backend (API Routes)"]
UploadAPI["/api/upload"]
CataloguesAPI["/api/catalogues"]
EventsAPI["/api/events"]
MergeAPI["/api/merge"]
ImportAPI["/api/import"]
end
subgraph Libraries["Core Libraries"]
Parsers["lib/parsers.ts<br/>CSV, JSON, QuakeML"]
EqUtils["lib/earthquake-utils.ts<br/>Validation & Normalization"]
QualityCheck["lib/data-quality-checker.ts"]
CrossField["lib/cross-field-validation.ts"]
QuakeML["lib/quakeml-parser.ts"]
end
end
subgraph Database["💾 MongoDB Database"]
DB[(earthquake_catalogue)]
Collections[("Collections")]
Indexes[("Indexes")]
end
subgraph External["🌐 External Services"]
GeoNet["GeoNet API<br/>(NZ Earthquakes)"]
end
UI --> Pages
State --> Components
Maps --> Components
Pages --> Backend
Components --> Hooks
Backend --> Libraries
Libraries --> DB
DB --> Collections
Collections --> Indexes
ImportAPI --> External
Key Components:
Frontend: React components with App Router, state management, and Leaflet map visualizations
Backend: Next.js API routes for upload, catalogues, events, merge, and import
Libraries: Parsers (CSV, JSON, QuakeML), validators, quality checkers
Database: MongoDB with connection pooling for scalable read/write performance
External Services: GeoNet API for importing New Zealand earthquake data
Data Flow Architecture
Upload Data Flow
The upload process consists of 7 stages:
- Stage 1: Upload
File selection with drag-and-drop
Progress tracking with ETA calculation
FormData construction
- Stage 2: Parsing
Format detection (CSV, JSON, QuakeML, GeoJSON)
Delimiter detection for CSV/TXT
Date format detection
Timestamp normalization (15+ formats)
- Stage 3: Validation
Event validation (coordinates, magnitude, depth)
Quality checks
Cross-field validation
Validation results display
- Stage 4: Schema Mapping
Map source fields to target schema
Reusable mapping templates
Field name suggestions
- Stage 5: Metadata
Catalogue name and description
Source information
Additional metadata
- Stage 6: Storage
Batch insert to MongoDB
Index updates
Geographic bounds calculation
- Stage 7: Results
Processing report
Event statistics
Data quality report
Auto-navigation to results
Import Data Flow
GeoNet import process:
Configuration: Time range, magnitude, depth, geographic filters
API Query: Query GeoNet FDSN Event Web Service
Parsing: Parse QuakeML response
Duplicate Detection: Match existing events by time, location, magnitude
Storage: Insert new events or update existing
History: Record import metadata and statistics
Merge Data Flow
Catalogue merging process:
Selection: Choose source catalogues
Configuration: Set matching rules and merge strategy
Loading: Load all events from source catalogues
Matching: Detect duplicates using configurable thresholds
Resolution: Apply merge strategy (quality, priority, average, newest, complete)
Storage: Create merged catalogue with source tracking
Reporting: Generate merge statistics
Component Architecture
Frontend Components
Layout Components:
app/layout.tsx- Root layout with providerscomponents/layout/- Navigation, header, footer
Page Components:
app/upload/page.tsx- Upload wizardapp/import/page.tsx- GeoNet importapp/merge/page.tsx- Catalogue mergingapp/catalogues/page.tsx- Catalogue managementapp/analytics/page.tsx- Visualization and analysis
Feature Components:
components/upload/- File upload, schema mapping, validationcomponents/import/- Import form, historycomponents/merge/- Merge configurationcomponents/visualize/- Maps, charts, analyticscomponents/ui/- shadcn/ui component library
Backend API Routes
Catalogues API:
GET /api/catalogues- List cataloguesPOST /api/catalogues- Create catalogueGET /api/catalogues/[id]- Get catalogue detailsPATCH /api/catalogues/[id]- Update catalogueDELETE /api/catalogues/[id]- Delete catalogueGET /api/catalogues/[id]/events- Get events with filtering
Import API:
POST /api/import/geonet- Import from GeoNetGET /api/import/history- Get import history
Upload API:
POST /api/upload- Upload and parse file
Merge API:
POST /api/merge- Merge catalogues
Export API:
GET /api/catalogues/[id]/export?format={csv|json|geojson|kml|quakeml}- Export catalogue
See API Reference for complete API documentation.
Core Libraries
Data Parsing:
lib/parsers.ts- Multi-format file parsers (CSV, JSON, QuakeML, GeoJSON)lib/delimiter-detector.ts- Automated delimiter detectionlib/date-format-detector.ts- Date format detectionlib/quakeml-parser.ts- QuakeML 1.2 parserlib/geojson-parser.ts- GeoJSON parser
Data Validation:
lib/validation.ts- Event validation ruleslib/data-quality-checker.ts- Quality assessmentlib/cross-field-validation.ts- Cross-field validationlib/duplicate-detection.ts- Duplicate event detection
Seismological Analysis:
lib/earthquake-utils.ts- Earthquake calculationslib/quality-scoring.ts- Quality scoring algorithmslib/seismological-analysis.ts- b-value, Mc, temporal analysislib/focal-mechanism-utils.ts- Focal mechanism parsinglib/station-coverage-utils.ts- Station coverage analysislib/uncertainty-utils.ts- Uncertainty calculations
Database:
lib/mongodb.ts- MongoDB client with Atlas optimizationlib/db.ts- Database queries and schema
Utilities:
lib/merge.ts- Catalogue merging logiclib/geonet-client.ts- GeoNet API clientlib/geonet-import-service.ts- Import servicelib/exporters.ts- Data export utilitieslib/quakeml-exporter.ts- QuakeML export
Database Architecture
Collections
merged_catalogues
Stores catalogue metadata:
{
id: "uuid",
name: "string",
created_at: Date,
updated_at: Date,
status: "active" | "archived",
event_count: number,
min_latitude: number,
max_latitude: number,
min_longitude: number,
max_longitude: number,
min_magnitude: number,
max_magnitude: number,
start_time: Date,
end_time: Date,
source_catalogues: Array,
merge_config: Object
}
merged_events
Stores earthquake events with full QuakeML 1.2 support:
{
id: "uuid",
catalogue_id: "uuid",
time: Date,
latitude: number,
longitude: number,
depth: number,
magnitude: number,
magnitude_type: "string",
// Uncertainties
time_uncertainty: number,
latitude_uncertainty: number,
longitude_uncertainty: number,
depth_uncertainty: number,
magnitude_uncertainty: number,
// Quality metrics
azimuthal_gap: number,
used_phase_count: number,
used_station_count: number,
standard_error: number,
magnitude_station_count: number,
// QuakeML fields
event_public_id: "string",
event_type: "string",
evaluation_mode: "manual" | "automatic",
evaluation_status: "preliminary" | "confirmed" | "reviewed" | "final",
// Complex nested data
origins: Array,
magnitudes: Array,
picks: Array,
arrivals: Array,
focal_mechanisms: Array,
// Source tracking
source_id: "string",
source_events: Array,
// Computed fields
quality_score: number,
quality_grade: "A+" | "A" | "B+" | "B" | "C" | "D" | "F"
}
import_history
Tracks GeoNet imports:
{
id: "uuid",
catalogue_id: "uuid",
start_time: Date,
end_time: Date,
total_fetched: number,
new_events: number,
updated_events: number,
skipped_events: number,
errors: Array,
created_at: Date
}
users
User accounts and authentication:
{
id: "uuid",
email: "string",
password_hash: "string",
name: "string",
role: "admin" | "editor" | "viewer" | "guest",
created_at: Date,
updated_at: Date
}
Indexes
Optimized indexes for query performance:
merged_catalogues:
id(unique)name(text search)created_at(sorting)
merged_events:
id(unique)catalogue_id(filtering)time(range queries)latitude, longitude(geospatial queries)magnitude(range queries)quality_grade(filtering)Compound index:
(catalogue_id, time)Compound index:
(catalogue_id, magnitude)Geospatial index:
(latitude, longitude)
import_history:
catalogue_id(filtering)created_at(sorting)
See Database Schema for complete schema documentation.
Security Architecture
Authentication
NextAuth.js v4 for authentication
Credentials provider with bcrypt password hashing
JWT-based sessions managed by NextAuth.js
MongoDB-backed user records for credentials and role data
API Protection
Rate limiting: 120 req/min (read), 60 req/min (write)
Input validation: Zod schemas for all inputs
MongoDB query-safety: validated request bodies and literal query filters to avoid query selector injection
XSS prevention: React automatic escaping
CSRF protection: NextAuth CSRF tokens
See Authentication & Roles for security details.
Performance Architecture
Optimization Strategies
Frontend:
React memoization (useMemo, useCallback)
Virtualized tables for large datasets
Lazy loading of components
Image optimization with Next.js Image
Code splitting with dynamic imports
Backend:
MongoDB connection pooling (up to 50 connections)
Query optimization with indexes
Batch operations for bulk inserts
Streaming parsers for large files
Caching with in-memory cache
Database:
Compound indexes for common queries
Geospatial indexes for location queries
Projection to limit returned fields
Aggregation pipelines for analytics
Scalability
Horizontal scaling: Serverless API routes auto-scale
Database scaling: MongoDB Atlas auto-scaling
CDN: Static assets served via Vercel Edge Network
Caching: Browser caching, API response caching
Deployment Architecture
Production Environment
Platform: Vercel (recommended) or Docker
Database: MongoDB Atlas (cloud) or self-hosted
CDN: Vercel Edge Network
SSL/TLS: Automatic HTTPS with Vercel
Environment: Node.js 18+ runtime
See Deployment & Administration for deployment guides.
Next Steps
Development Setup - Set up development environment
Database Schema - Detailed database schema
API Development - API development guide
Testing - Testing guide