# mikilix2006/motogp-paradise architecture

> Architecture diagram of the GitHub repository mikilix2006/motogp-paradise, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/mikilix2006/motogp-paradise
- Repository: https://github.com/mikilix2006/motogp-paradise

## Overview

MotoGP Stats is a Next.js application for browsing historical and current MotoGP statistics. Its main workflow serves cached internal API responses from normalized PostgreSQL data to the web interface; a separate ingestion workflow imports and synchronizes MotoGP data into that database. The README documents broad data coverage, including events, sessions, riders, results, standings, BMW Award and Live Timing. The excerpts show selected repositories, result importing and live-sync orchestration; wiring for unsampled importers and UI components is represented only where documented.

Main entry points: [`src/lib/prisma.ts`](https://github.com/mikilix2006/motogp-paradise/blob/main/src/lib/prisma.ts) (Prisma client), [`src/services/importers/liveSessionSync.ts`](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/liveSessionSync.ts) (Live session sync), [`src/services/db/favoritesRepository.ts`](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/favoritesRepository.ts) (Favorites repository), [`src/components`](https://github.com/mikilix2006/motogp-paradise/tree/main/src/components) (Stats components)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingestion["Data ingestion"]
  node_general_client["General API client<br/>[apiClient.ts]"]
  node_results_client["Results API client<br/>[resultsClient.ts]"]
  node_catalog_importers["Season and event importers"]
  node_session_importer["Session importer<br/>[sessionImporter.ts]"]
  node_details_importer["Event details importer"]
  node_result_importer["Session result importer"]
  node_rider_importers["Rider data importers"]
  node_standing_importers["Standings importers"]
  node_live_sync["Live session sync<br/>[liveSessionSync.ts]"]
end

subgraph group_storage["Normalized data"]
  node_postgres[("PostgreSQL")]
  node_prisma["Prisma client<br/>[prisma.ts]"]
  node_next_gp_repo["Next GP repository"]
  node_favorites_repo["Favorites repository"]
  node_standings_repo["Rider standings repository"]
  node_season_repo["Current season lookup"]
  node_favorites_model["Favorites scoring model<br/>[favoritesModel.ts]"]
end

subgraph group_serving["Application API"]
  node_next_gp_route["Next GP route<br/>[route.ts]"]
  node_favorites_route["Favorites route<br/>[route.ts]"]
  node_standings_route["Standings route<br/>[route.ts]"]
end

subgraph group_experience["Web experience"]
  node_web_page["Stats page<br/>[page.tsx]"]
  node_web_components["Stats components"]
end

node_motogp_general(("MotoGP API"))
node_motogp_results(("Results API"))
node_user(("MotoGP fan"))

node_catalog_importers -->|"fetches data"| node_general_client
node_session_importer -->|"fetches sessions"| node_results_client
node_result_importer -->|"fetches results"| node_results_client
node_rider_importers -->|"fetches data"| node_general_client
node_standing_importers -->|"fetches data"| node_results_client
node_general_client -->|"requests data"| node_motogp_general
node_results_client -->|"requests results"| node_motogp_results
node_catalog_importers -->|"writes normalized data"| node_prisma
node_session_importer -->|"writes sessions"| node_prisma
node_details_importer -->|"updates event data"| node_prisma
node_result_importer -->|"upserts results"| node_prisma
node_result_importer -->|"resolves riders"| node_rider_importers
node_rider_importers -->|"writes rider data"| node_prisma
node_standing_importers -->|"writes standings"| node_prisma
node_live_sync -->|"refreshes sessions"| node_session_importer
node_live_sync -->|"imports results"| node_result_importer
node_live_sync -->|"refreshes events"| node_catalog_importers
node_live_sync -->|"refreshes statistics"| node_rider_importers
node_live_sync -->|"refreshes standings"| node_standing_importers
node_prisma -->|"reads and writes"| node_postgres
node_next_gp_repo -->|"queries"| node_prisma
node_next_gp_repo -->|"gets current season"| node_season_repo
node_favorites_repo -->|"queries"| node_prisma
node_favorites_repo -->|"gets current season"| node_season_repo
node_favorites_repo -->|"finds next event"| node_next_gp_repo
node_favorites_repo -->|"scores riders"| node_favorites_model
node_standings_repo -->|"queries"| node_prisma
node_standings_repo -->|"gets current season"| node_season_repo
node_next_gp_route -->|"loads GP data"| node_next_gp_repo
node_favorites_route -->|"loads favorites"| node_favorites_repo
node_standings_route -->|"loads standings"| node_standings_repo
node_user -->|"browses"| node_web_page
node_web_page -->|"renders"| node_web_components
node_web_components -->|"requests data"| node_next_gp_route
node_web_components -->|"requests data"| node_favorites_route
node_web_components -->|"requests data"| node_standings_route

click node_general_client "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/motogp/apiClient.ts"
click node_results_client "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/motogp/resultsClient.ts"
click node_catalog_importers "https://github.com/mikilix2006/motogp-paradise/tree/main/src/services/importers"
click node_session_importer "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/sessionImporter.ts"
click node_details_importer "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/eventDetailsImporter.ts"
click node_result_importer "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/sessionResultImporter.ts"
click node_rider_importers "https://github.com/mikilix2006/motogp-paradise/tree/main/src/services/importers"
click node_standing_importers "https://github.com/mikilix2006/motogp-paradise/tree/main/src/services/importers"
click node_live_sync "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/liveSessionSync.ts"
click node_prisma "https://github.com/mikilix2006/motogp-paradise/blob/main/src/lib/prisma.ts"
click node_next_gp_repo "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/nextGrandPrixRepository.ts"
click node_favorites_repo "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/favoritesRepository.ts"
click node_standings_repo "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/riderStandingsRepository.ts"
click node_season_repo "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/seasonRepository.ts"
click node_favorites_model "https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/stats/favoritesModel.ts"
click node_next_gp_route "https://github.com/mikilix2006/motogp-paradise/blob/main/src/app/api/next-gp/route.ts"
click node_favorites_route "https://github.com/mikilix2006/motogp-paradise/blob/main/src/app/api/next-gp/favorites/route.ts"
click node_standings_route "https://github.com/mikilix2006/motogp-paradise/blob/main/src/app/api/riders/standings/route.ts"
click node_web_page "https://github.com/mikilix2006/motogp-paradise/blob/main/src/app/page.tsx"
click node_web_components "https://github.com/mikilix2006/motogp-paradise/tree/main/src/components"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_general_client,node_results_client,node_catalog_importers,node_session_importer,node_details_importer,node_result_importer,node_rider_importers,node_standing_importers,node_live_sync toneBlue
class node_postgres,node_prisma,node_next_gp_repo,node_favorites_repo,node_standings_repo,node_season_repo,node_favorites_model toneAmber
class node_next_gp_route,node_favorites_route,node_standings_route,node_motogp_general,node_motogp_results toneMint
class node_web_page,node_web_components toneRose
class node_user toneIndigo
```

## Components

### Data ingestion

- [General API client](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/motogp/apiClient.ts): `src/services/motogp/apiClient.ts`
- [Results API client](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/motogp/resultsClient.ts): `src/services/motogp/resultsClient.ts`
- [Season and event importers](https://github.com/mikilix2006/motogp-paradise/tree/main/src/services/importers): `src/services/importers`
- [Session importer](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/sessionImporter.ts): `src/services/importers/sessionImporter.ts`
- [Event details importer](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/eventDetailsImporter.ts): `src/services/importers/eventDetailsImporter.ts`
- [Session result importer](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/sessionResultImporter.ts): `src/services/importers/sessionResultImporter.ts`
- [Rider data importers](https://github.com/mikilix2006/motogp-paradise/tree/main/src/services/importers): `src/services/importers`
- [Standings importers](https://github.com/mikilix2006/motogp-paradise/tree/main/src/services/importers): `src/services/importers`
- [Live session sync](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/importers/liveSessionSync.ts): `src/services/importers/liveSessionSync.ts`

### Normalized data

- **PostgreSQL**
- [Prisma client](https://github.com/mikilix2006/motogp-paradise/blob/main/src/lib/prisma.ts): `src/lib/prisma.ts`
- [Next GP repository](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/nextGrandPrixRepository.ts): `src/services/db/nextGrandPrixRepository.ts`
- [Favorites repository](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/favoritesRepository.ts): `src/services/db/favoritesRepository.ts`
- [Rider standings repository](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/riderStandingsRepository.ts): `src/services/db/riderStandingsRepository.ts`
- [Current season lookup](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/db/seasonRepository.ts): `src/services/db/seasonRepository.ts`
- [Favorites scoring model](https://github.com/mikilix2006/motogp-paradise/blob/main/src/services/stats/favoritesModel.ts): `src/services/stats/favoritesModel.ts`

### Application API

- [Next GP route](https://github.com/mikilix2006/motogp-paradise/blob/main/src/app/api/next-gp/route.ts): `src/app/api/next-gp/route.ts`
- [Favorites route](https://github.com/mikilix2006/motogp-paradise/blob/main/src/app/api/next-gp/favorites/route.ts): `src/app/api/next-gp/favorites/route.ts`
- [Standings route](https://github.com/mikilix2006/motogp-paradise/blob/main/src/app/api/riders/standings/route.ts): `src/app/api/riders/standings/route.ts`

### Web experience

- [Stats page](https://github.com/mikilix2006/motogp-paradise/blob/main/src/app/page.tsx): `src/app/page.tsx`
- [Stats components](https://github.com/mikilix2006/motogp-paradise/tree/main/src/components): `src/components`

### Other components

- **MotoGP API**
- **Results API**
- **MotoGP fan**

## Connections

- Season and event importers → General API client: fetches data
- Session importer → Results API client: fetches sessions
- Session result importer → Results API client: fetches results
- Rider data importers → General API client: fetches data
- Standings importers → Results API client: fetches data
- General API client → MotoGP API: requests data
- Results API client → Results API: requests results
- Season and event importers → Prisma client: writes normalized data
- Session importer → Prisma client: writes sessions
- Event details importer → Prisma client: updates event data
- Session result importer → Prisma client: upserts results
- Session result importer → Rider data importers: resolves riders
- Rider data importers → Prisma client: writes rider data
- Standings importers → Prisma client: writes standings
- Live session sync → Session importer: refreshes sessions
- Live session sync → Session result importer: imports results
- Live session sync → Season and event importers: refreshes events
- Live session sync → Rider data importers: refreshes statistics
- Live session sync → Standings importers: refreshes standings
- Prisma client → PostgreSQL: reads and writes
- Next GP repository → Prisma client: queries
- Next GP repository → Current season lookup: gets current season
- Favorites repository → Prisma client: queries
- Favorites repository → Current season lookup: gets current season
- Favorites repository → Next GP repository: finds next event
- Favorites repository → Favorites scoring model: scores riders
- Rider standings repository → Prisma client: queries
- Rider standings repository → Current season lookup: gets current season
- Next GP route → Next GP repository: loads GP data
- Favorites route → Favorites repository: loads favorites
- Standings route → Rider standings repository: loads standings
- MotoGP fan → Stats page: browses
- Stats page → Stats components: renders
- Stats components → Next GP route: requests data
- Stats components → Favorites route: requests data
- Stats components → Standings route: requests data
