# muskaanpopat/ev-analytics-bda architecture

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

- Interactive diagram: https://gitdiagram.com/muskaanpopat/ev-analytics-bda
- Repository: https://github.com/muskaanpopat/ev-analytics-bda

## Overview

EVInsight is a Washington State EV adoption analytics platform: users explore dashboards and vehicle records, while the REST API returns analytics from MongoDB or falls back to CSV processing. The principal path is dashboard interaction → API client → backend route/controller → analytics service → data source → displayed results. Separate capabilities cover MapReduce results, MongoDB analytics, Spark and Spark SQL, health checks, and exports. The README documents a cleaning/import and batch-processing pipeline, but the sampled code does not establish all operational connections between those batch tools and the backend.

Main entry points: [`frontend/src/App.tsx`](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/App.tsx) (Page router), [`backend/src/routes/apiRoutes.ts`](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/apiRoutes.ts) (API route dispatch), [`frontend/src/services/api.ts`](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/services/api.ts) (API client), [`backend/src/services/mongoService.ts`](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/mongoService.ts) (Mongo analytics)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["Web interface"]
  node_app["Page router<br/>[App.tsx]"]
  node_dashboard["Analytics dashboard<br/>[Dashboard.tsx]"]
  node_explorer["Vehicle explorer"]
  node_insights["Insights view<br/>[InsightsPage.tsx]"]
  node_mapreduce_view["MapReduce view"]
  node_mongo_view["MongoDB view<br/>[MongoDbPage.tsx]"]
  node_spark_view["Spark views<br/>[SparkPage.tsx]"]
  node_sql_view["Spark SQL view<br/>[SparkSqlPage.tsx]"]
  node_pipeline_view["Pipeline overview"]
  node_api_client["API client<br/>[api.ts]"]
end

subgraph group_api["REST backend"]
  node_server["Express server<br/>[server.ts]"]
  node_api_routes["API route dispatch<br/>[apiRoutes.ts]"]
  node_analytics_routes["Analytics routes<br/>[analyticsRoutes.ts]"]
  node_analytics_controller["Analytics controller"]
  node_mapreduce_controller["MapReduce controller"]
  node_spark_controller["Spark controller<br/>[sparkController.ts]"]
  node_export_controller["Export controller"]
  node_health_controller["Health controller"]
  node_health_routes["Health routes<br/>[healthRoutes.ts]"]
  node_mapreduce_routes["MapReduce routes<br/>[mapreduceRoutes.ts]"]
  node_spark_routes["Spark routes<br/>[sparkRoutes.ts]"]
  node_export_routes["Export routes<br/>[exportRoutes.ts]"]
end

subgraph group_data["Analytics and data"]
  node_mongo_service["Mongo analytics<br/>[mongoService.ts]"]
  node_csv_service["CSV analytics fallback<br/>[csvDataService.ts]"]
  node_mongo_client["Mongo connection<br/>[mongoClient.ts]"]
  node_mongo_store[("EV vehicle collection")]
  node_health_service["Health service<br/>[healthService.ts]"]
end

subgraph group_batch["Batch processing"]
  node_spark_service["Spark service<br/>[sparkService.ts]"]
  node_mapreduce_service["MapReduce service"]
  node_mapper["Map stage<br/>[ev_mapper.py]"]
  node_reducer["Reduce stage<br/>[ev_reducer.py]"]
  node_spark_analysis["Spark analysis<br/>[ev_analysis.py]"]
  node_spark_save["Spark result saving<br/>[ev_save_results.py]"]
end

node_user(("Dashboard user"))

node_user -->|"uses"| node_app
node_app -->|"routes"| node_dashboard
node_app -->|"routes"| node_explorer
node_app -->|"routes"| node_insights
node_app -->|"routes"| node_mapreduce_view
node_app -->|"routes"| node_mongo_view
node_app -->|"routes"| node_spark_view
node_app -->|"routes"| node_sql_view
node_app -->|"routes"| node_pipeline_view
node_dashboard -->|"requests data"| node_api_client
node_explorer -->|"requests records"| node_api_client
node_insights -->|"requests data"| node_api_client
node_mapreduce_view -->|"requests results"| node_api_client
node_mongo_view -->|"requests analytics"| node_api_client
node_spark_view -->|"requests analytics"| node_api_client
node_sql_view -->|"submits query"| node_api_client
node_api_client -->|"sends requests"| node_server
node_server -->|"mounts routes"| node_api_routes
node_api_routes -->|"dispatches"| node_analytics_routes
node_api_routes -->|"dispatches vehicles"| node_analytics_controller
node_api_routes -->|"dispatches"| node_mapreduce_routes
node_api_routes -->|"dispatches"| node_spark_routes
node_api_routes -->|"dispatches"| node_export_routes
node_api_routes -->|"dispatches"| node_health_routes
node_analytics_routes -->|"dispatches"| node_analytics_controller
node_mapreduce_routes -->|"dispatches"| node_mapreduce_controller
node_spark_routes -->|"dispatches"| node_spark_controller
node_export_routes -->|"dispatches"| node_export_controller
node_health_routes -->|"dispatches"| node_health_controller
node_analytics_controller -->|"requests analytics"| node_mongo_service
node_mongo_service -->|"gets connection"| node_mongo_client
node_mongo_client -->|"connects"| node_mongo_store
node_mongo_service -->|"queries"| node_mongo_store
node_mongo_service -->|"falls back"| node_csv_service
node_analytics_controller -->|"requests records"| node_csv_service
node_spark_controller -->|"requests execution"| node_spark_service
node_mapreduce_controller -->|"requests results"| node_mapreduce_service
node_health_controller -->|"checks status"| node_health_service
node_export_controller -->|"streams export"| node_user
node_mapper -->|"emits pairs"| node_reducer
node_spark_analysis -->|"saves results"| node_spark_save

click node_app "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/App.tsx"
click node_dashboard "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/Dashboard.tsx"
click node_explorer "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/DataExplorerPage.tsx"
click node_insights "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/InsightsPage.tsx"
click node_mapreduce_view "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/HdfsMapReducePage.tsx"
click node_mongo_view "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/MongoDbPage.tsx"
click node_spark_view "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/SparkPage.tsx"
click node_sql_view "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/SparkSqlPage.tsx"
click node_pipeline_view "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/TechPipelinePage.tsx"
click node_api_client "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/services/api.ts"
click node_server "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/server.ts"
click node_api_routes "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/apiRoutes.ts"
click node_analytics_routes "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/analyticsRoutes.ts"
click node_analytics_controller "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/analyticsController.ts"
click node_mapreduce_controller "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/mapreduceController.ts"
click node_spark_controller "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/sparkController.ts"
click node_export_controller "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/exportController.ts"
click node_health_controller "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/healthController.ts"
click node_health_routes "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/healthRoutes.ts"
click node_mapreduce_routes "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/mapreduceRoutes.ts"
click node_spark_routes "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/sparkRoutes.ts"
click node_export_routes "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/exportRoutes.ts"
click node_mongo_service "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/mongoService.ts"
click node_csv_service "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/csvDataService.ts"
click node_mongo_client "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/database/mongoClient.ts"
click node_health_service "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/healthService.ts"
click node_spark_service "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/sparkService.ts"
click node_mapreduce_service "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/mapreduceService.ts"
click node_mapper "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/mapreduce/ev_mapper.py"
click node_reducer "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/mapreduce/ev_reducer.py"
click node_spark_analysis "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/spark/ev_analysis.py"
click node_spark_save "https://github.com/muskaanpopat/ev-analytics-bda/blob/main/spark/ev_save_results.py"

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_app,node_dashboard,node_explorer,node_insights,node_mapreduce_view,node_mongo_view,node_spark_view,node_sql_view,node_pipeline_view,node_api_client,node_user toneBlue
class node_server,node_api_routes,node_analytics_routes,node_analytics_controller,node_mapreduce_controller,node_spark_controller,node_export_controller,node_health_controller,node_health_routes,node_mapreduce_routes,node_spark_routes,node_export_routes toneAmber
class node_mongo_service,node_csv_service,node_mongo_client,node_mongo_store,node_health_service toneMint
class node_spark_service,node_mapreduce_service,node_mapper,node_reducer,node_spark_analysis,node_spark_save toneRose
```

## Components

### Web interface

- [Page router](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Analytics dashboard](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/Dashboard.tsx): `frontend/src/pages/Dashboard.tsx`
- [Vehicle explorer](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/DataExplorerPage.tsx): `frontend/src/pages/DataExplorerPage.tsx`
- [Insights view](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/InsightsPage.tsx): `frontend/src/pages/InsightsPage.tsx`
- [MapReduce view](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/HdfsMapReducePage.tsx): `frontend/src/pages/HdfsMapReducePage.tsx`
- [MongoDB view](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/MongoDbPage.tsx): `frontend/src/pages/MongoDbPage.tsx`
- [Spark views](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/SparkPage.tsx): `frontend/src/pages/SparkPage.tsx`
- [Spark SQL view](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/SparkSqlPage.tsx): `frontend/src/pages/SparkSqlPage.tsx`
- [Pipeline overview](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/pages/TechPipelinePage.tsx): `frontend/src/pages/TechPipelinePage.tsx`
- [API client](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/frontend/src/services/api.ts): `frontend/src/services/api.ts`

### REST backend

- [Express server](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/server.ts): `backend/src/server.ts`
- [API route dispatch](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/apiRoutes.ts): `backend/src/routes/apiRoutes.ts`
- [Analytics routes](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/analyticsRoutes.ts): `backend/src/routes/analyticsRoutes.ts`
- [Analytics controller](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/analyticsController.ts): `backend/src/controllers/analyticsController.ts`
- [MapReduce controller](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/mapreduceController.ts): `backend/src/controllers/mapreduceController.ts`
- [Spark controller](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/sparkController.ts): `backend/src/controllers/sparkController.ts`
- [Export controller](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/exportController.ts): `backend/src/controllers/exportController.ts`
- [Health controller](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/controllers/healthController.ts): `backend/src/controllers/healthController.ts`
- [Health routes](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/healthRoutes.ts): `backend/src/routes/healthRoutes.ts`
- [MapReduce routes](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/mapreduceRoutes.ts): `backend/src/routes/mapreduceRoutes.ts`
- [Spark routes](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/sparkRoutes.ts): `backend/src/routes/sparkRoutes.ts`
- [Export routes](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/routes/exportRoutes.ts): `backend/src/routes/exportRoutes.ts`

### Analytics and data

- [Mongo analytics](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/mongoService.ts): `backend/src/services/mongoService.ts`
- [CSV analytics fallback](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/csvDataService.ts): `backend/src/services/csvDataService.ts`
- [Mongo connection](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/database/mongoClient.ts): `backend/src/database/mongoClient.ts`
- **EV vehicle collection**
- [Health service](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/healthService.ts): `backend/src/services/healthService.ts`

### Batch processing

- [Spark service](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/sparkService.ts): `backend/src/services/sparkService.ts`
- [MapReduce service](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/backend/src/services/mapreduceService.ts): `backend/src/services/mapreduceService.ts`
- [Map stage](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/mapreduce/ev_mapper.py): `mapreduce/ev_mapper.py`
- [Reduce stage](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/mapreduce/ev_reducer.py): `mapreduce/ev_reducer.py`
- [Spark analysis](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/spark/ev_analysis.py): `spark/ev_analysis.py`
- [Spark result saving](https://github.com/muskaanpopat/ev-analytics-bda/blob/main/spark/ev_save_results.py): `spark/ev_save_results.py`

### Other components

- **Dashboard user**

## Connections

- Dashboard user → Page router: uses
- Page router → Analytics dashboard: routes
- Page router → Vehicle explorer: routes
- Page router → Insights view: routes
- Page router → MapReduce view: routes
- Page router → MongoDB view: routes
- Page router → Spark views: routes
- Page router → Spark SQL view: routes
- Page router → Pipeline overview: routes
- Analytics dashboard → API client: requests data
- Vehicle explorer → API client: requests records
- Insights view → API client: requests data
- MapReduce view → API client: requests results
- MongoDB view → API client: requests analytics
- Spark views → API client: requests analytics
- Spark SQL view → API client: submits query
- API client → Express server: sends requests
- Express server → API route dispatch: mounts routes
- API route dispatch → Analytics routes: dispatches
- API route dispatch → Analytics controller: dispatches vehicles
- API route dispatch → MapReduce routes: dispatches
- API route dispatch → Spark routes: dispatches
- API route dispatch → Export routes: dispatches
- API route dispatch → Health routes: dispatches
- Analytics routes → Analytics controller: dispatches
- MapReduce routes → MapReduce controller: dispatches
- Spark routes → Spark controller: dispatches
- Export routes → Export controller: dispatches
- Health routes → Health controller: dispatches
- Analytics controller → Mongo analytics: requests analytics
- Mongo analytics → Mongo connection: gets connection
- Mongo connection → EV vehicle collection: connects
- Mongo analytics → EV vehicle collection: queries
- Mongo analytics → CSV analytics fallback: falls back
- Analytics controller → CSV analytics fallback: requests records
- Spark controller → Spark service: requests execution
- MapReduce controller → MapReduce service: requests results
- Health controller → Health service: checks status
- Export controller → Dashboard user: streams export
- Map stage → Reduce stage: emits pairs
- Spark analysis → Spark result saving: saves results
