# getta16/irrisat_th architecture

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

- Interactive diagram: https://gitdiagram.com/getta16/irrisat_th
- Repository: https://github.com/getta16/irrisat_th

## Overview

IRRISAT-THAI is a browser-based, per-field irrigation planner using satellite imagery, weather, and root-zone water balance to produce irrigation recommendations. The user imports or manages field boundaries, selects a field and analysis settings, then views NDVI/Kc map layers and analysis results. The graph separates the UI, field-boundary workflow, analysis services, and authentication/storage. Edges reflect the sampled calls, indexed references, and README descriptions; several service internals and UI wiring were not sampled, so uncertain links are omitted.

Main entry points: [`client/src/App.jsx`](https://github.com/getta16/irrisat_th/blob/main/client/src/App.jsx) (Workspace), [`client/src/api.js`](https://github.com/getta16/irrisat_th/blob/main/client/src/api.js) (API client), [`server/routes/analysis.js`](https://github.com/getta16/irrisat_th/blob/main/server/routes/analysis.js) (Analysis endpoint), [`server/routes/import.js`](https://github.com/getta16/irrisat_th/blob/main/server/routes/import.js) (Import endpoint)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Web application"]
  node_app["Workspace<br/>[App.jsx]"]
  node_api["API client<br/>[api.js]"]
  node_map["Field map<br/>[MapView.jsx]"]
  node_mapcontrols["Map controls<br/>[MapControls.jsx]"]
  node_importui["Import panel<br/>[ImportPanel.jsx]"]
  node_fieldlist["Field list<br/>[FieldList.jsx]"]
  node_settings["Field settings<br/>[FieldSettings.jsx]"]
  node_analysisui["Analysis panel<br/>[AnalysisPanel.jsx]"]
end

subgraph group_fields["Field management"]
  node_importroute["Import endpoint<br/>[import.js]"]
  node_geoparser["Boundary parser<br/>[parseGeo.js]"]
  node_normalizer["Field normalizer<br/>[normalize.js]"]
  node_fieldroutes["Field endpoints<br/>[fields.js]"]
end

subgraph group_analysis["Irrigation analysis"]
  node_analysisroute["Analysis endpoint<br/>[analysis.js]"]
  node_gee["Satellite processing<br/>[gee.js]"]
  node_weather["Weather data<br/>[weather.js]"]
  node_irrigation["Water balance<br/>[irrigation.js]"]
end

subgraph group_platform["Identity and storage"]
  node_authui["Sign-in flow<br/>[useAuth.js]"]
  node_authroutes["Auth routes<br/>[auth.js]"]
  node_authservice["Token verification<br/>[auth.js]"]
  node_store[("Field store<br/>[store.js]")]
end

node_farmer(("Farmer"))
node_gis(("Google Identity"))
node_nasa(("NASA POWER"))
node_earthengine(("Earth Engine"))

node_farmer -->|"uses"| node_app
node_app -->|"requests"| node_api
node_app -->|"renders"| node_map
node_app -->|"renders"| node_mapcontrols
node_app -->|"renders"| node_importui
node_app -->|"renders"| node_fieldlist
node_app -->|"renders"| node_settings
node_app -->|"renders"| node_analysisui
node_app -->|"uses"| node_authui
node_authui -->|"verifies login"| node_api
node_authui -->|"gets credentials"| node_gis
node_api -->|"uploads boundaries"| node_importroute
node_api -->|"manages fields"| node_fieldroutes
node_api -->|"requests analysis"| node_analysisroute
node_api -->|"checks session"| node_authroutes
node_importroute -->|"parses files"| node_geoparser
node_importroute -->|"normalizes fields"| node_normalizer
node_fieldroutes -->|"normalizes fields"| node_normalizer
node_fieldroutes -->|"reads and writes"| node_store
node_authroutes -->|"verifies tokens"| node_authservice
node_analysisroute -->|"loads field"| node_store
node_analysisroute -->|"gets satellite data"| node_gee
node_analysisroute -->|"gets weather"| node_weather
node_analysisroute -->|"runs water balance"| node_irrigation
node_weather -->|"fetches ET₀ data"| node_nasa
node_gee -->|"queries imagery"| node_earthengine

click node_app "https://github.com/getta16/irrisat_th/blob/main/client/src/App.jsx"
click node_api "https://github.com/getta16/irrisat_th/blob/main/client/src/api.js"
click node_map "https://github.com/getta16/irrisat_th/blob/main/client/src/components/MapView.jsx"
click node_mapcontrols "https://github.com/getta16/irrisat_th/blob/main/client/src/components/MapControls.jsx"
click node_importui "https://github.com/getta16/irrisat_th/blob/main/client/src/components/ImportPanel.jsx"
click node_fieldlist "https://github.com/getta16/irrisat_th/blob/main/client/src/components/FieldList.jsx"
click node_settings "https://github.com/getta16/irrisat_th/blob/main/client/src/components/FieldSettings.jsx"
click node_analysisui "https://github.com/getta16/irrisat_th/blob/main/client/src/components/AnalysisPanel.jsx"
click node_authui "https://github.com/getta16/irrisat_th/blob/main/client/src/useAuth.js"
click node_authroutes "https://github.com/getta16/irrisat_th/blob/main/server/routes/auth.js"
click node_authservice "https://github.com/getta16/irrisat_th/blob/main/server/services/auth.js"
click node_importroute "https://github.com/getta16/irrisat_th/blob/main/server/routes/import.js"
click node_geoparser "https://github.com/getta16/irrisat_th/blob/main/server/services/parseGeo.js"
click node_normalizer "https://github.com/getta16/irrisat_th/blob/main/server/services/normalize.js"
click node_fieldroutes "https://github.com/getta16/irrisat_th/blob/main/server/routes/fields.js"
click node_store "https://github.com/getta16/irrisat_th/blob/main/server/services/store.js"
click node_analysisroute "https://github.com/getta16/irrisat_th/blob/main/server/routes/analysis.js"
click node_gee "https://github.com/getta16/irrisat_th/blob/main/server/services/gee.js"
click node_weather "https://github.com/getta16/irrisat_th/blob/main/server/services/weather.js"
click node_irrigation "https://github.com/getta16/irrisat_th/blob/main/server/services/irrigation.js"

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_api,node_map,node_mapcontrols,node_importui,node_fieldlist,node_settings,node_analysisui toneBlue
class node_importroute,node_geoparser,node_normalizer,node_fieldroutes toneAmber
class node_analysisroute,node_gee,node_weather,node_irrigation toneMint
class node_authui,node_authroutes,node_authservice,node_store toneRose
class node_farmer,node_gis,node_nasa,node_earthengine toneIndigo
```

## Components

### Web application

- [Workspace](https://github.com/getta16/irrisat_th/blob/main/client/src/App.jsx): `client/src/App.jsx`
- [API client](https://github.com/getta16/irrisat_th/blob/main/client/src/api.js): `client/src/api.js`
- [Field map](https://github.com/getta16/irrisat_th/blob/main/client/src/components/MapView.jsx): `client/src/components/MapView.jsx`
- [Map controls](https://github.com/getta16/irrisat_th/blob/main/client/src/components/MapControls.jsx): `client/src/components/MapControls.jsx`
- [Import panel](https://github.com/getta16/irrisat_th/blob/main/client/src/components/ImportPanel.jsx): `client/src/components/ImportPanel.jsx`
- [Field list](https://github.com/getta16/irrisat_th/blob/main/client/src/components/FieldList.jsx): `client/src/components/FieldList.jsx`
- [Field settings](https://github.com/getta16/irrisat_th/blob/main/client/src/components/FieldSettings.jsx): `client/src/components/FieldSettings.jsx`
- [Analysis panel](https://github.com/getta16/irrisat_th/blob/main/client/src/components/AnalysisPanel.jsx): `client/src/components/AnalysisPanel.jsx`

### Field management

- [Import endpoint](https://github.com/getta16/irrisat_th/blob/main/server/routes/import.js): `server/routes/import.js`
- [Boundary parser](https://github.com/getta16/irrisat_th/blob/main/server/services/parseGeo.js): `server/services/parseGeo.js`
- [Field normalizer](https://github.com/getta16/irrisat_th/blob/main/server/services/normalize.js): `server/services/normalize.js`
- [Field endpoints](https://github.com/getta16/irrisat_th/blob/main/server/routes/fields.js): `server/routes/fields.js`

### Irrigation analysis

- [Analysis endpoint](https://github.com/getta16/irrisat_th/blob/main/server/routes/analysis.js): `server/routes/analysis.js`
- [Satellite processing](https://github.com/getta16/irrisat_th/blob/main/server/services/gee.js): `server/services/gee.js`
- [Weather data](https://github.com/getta16/irrisat_th/blob/main/server/services/weather.js): `server/services/weather.js`
- [Water balance](https://github.com/getta16/irrisat_th/blob/main/server/services/irrigation.js): `server/services/irrigation.js`

### Identity and storage

- [Sign-in flow](https://github.com/getta16/irrisat_th/blob/main/client/src/useAuth.js): `client/src/useAuth.js`
- [Auth routes](https://github.com/getta16/irrisat_th/blob/main/server/routes/auth.js): `server/routes/auth.js`
- [Token verification](https://github.com/getta16/irrisat_th/blob/main/server/services/auth.js): `server/services/auth.js`
- [Field store](https://github.com/getta16/irrisat_th/blob/main/server/services/store.js): `server/services/store.js`

### Other components

- **Farmer**
- **Google Identity**
- **NASA POWER**
- **Earth Engine**

## Connections

- Farmer → Workspace: uses (evidence: `README.md`)
- Workspace → API client: requests (evidence: `client/src/App.jsx`)
- Workspace → Field map: renders (evidence: `client/src/App.jsx`)
- Workspace → Map controls: renders (evidence: `client/src/App.jsx`)
- Workspace → Import panel: renders (evidence: `client/src/App.jsx`)
- Workspace → Field list: renders (evidence: `client/src/App.jsx`)
- Workspace → Field settings: renders (evidence: `client/src/App.jsx`)
- Workspace → Analysis panel: renders (evidence: `client/src/App.jsx`)
- Workspace → Sign-in flow: uses (evidence: `client/src/App.jsx`)
- Sign-in flow → API client: verifies login (evidence: `client/src/useAuth.js`)
- Sign-in flow → Google Identity: gets credentials
- API client → Import endpoint: uploads boundaries (evidence: `client/src/api.js`)
- API client → Field endpoints: manages fields (evidence: `client/src/api.js`)
- API client → Analysis endpoint: requests analysis (evidence: `client/src/api.js`)
- API client → Auth routes: checks session (evidence: `client/src/api.js`)
- Import endpoint → Boundary parser: parses files (evidence: `server/routes/import.js`)
- Import endpoint → Field normalizer: normalizes fields (evidence: `server/routes/import.js`)
- Field endpoints → Field normalizer: normalizes fields (evidence: `server/routes/fields.js`)
- Field endpoints → Field store: reads and writes (evidence: `server/routes/fields.js`)
- Auth routes → Token verification: verifies tokens (evidence: `server/routes/auth.js`)
- Analysis endpoint → Field store: loads field (evidence: `server/routes/analysis.js`)
- Analysis endpoint → Satellite processing: gets satellite data (evidence: `server/routes/analysis.js`)
- Analysis endpoint → Weather data: gets weather (evidence: `server/routes/analysis.js`)
- Analysis endpoint → Water balance: runs water balance (evidence: `server/routes/analysis.js`)
- Weather data → NASA POWER: fetches ET₀ data (evidence: `README.md`)
- Satellite processing → Earth Engine: queries imagery (evidence: `README.md`)
