<div align="center">
  <img src="docs/logo.png" alt="drawing" width="200"/>
  <h1 align="center">Aviation Data</h1>
</div>

## Makefile
* `make` or `make help` to list all commands
* `make docker-up` to start all containers
* `make docker-refresh` to start the background services
* `make docker-clean` to stop and delete all containers, volumes, and networks related
to the application

**WARNING**: Running `make docker-clean` or `make docker-refresh` will wipe the database, redis, and minio data

## Setup

1. Override any environment variables in `.env.local`
2. Build the required images. Running just `make build` will build the `nginx` image
   * `make build f=nginx`
   * `make build f=api`
   * `make build f=ui`
3. Generate the SSL certificates with `make cert d=<DOMAIN>`
   * Running just `make cert` will generate `localhost` certificates
4. Run the application with `make up`

### Development Environment
Start background services with `make docker-refresh`
* Note: when `ENVIRONMENT` is not set to `production` (i.e., set to `development`),
   the nginx container will function only as a reverse proxy - the UI must be run through `make run-ui`

Start the UI through `make run-ui` and the API through `make run-api`

### Production Environment
Start with `make docker-up`

The most likely to change environment variables are the following:
* `UI_PORT`
* `API_PORT`
* `POSTGRES_PORT`
* `POSTGRES_PASSWORD` - Please change in production environments
* `MINIO_HOST` - Match to the `NGINX_HOST` value (see below)
* `MINIO_ROOT_PASSWORD` - Please change in production environments
* `MINIO_BROWSER_REDIRECT_URL` - Change to the FQDN of the URL that is reachable through the internet.
For example: `https://aviation.bensherriff.com/minio/`
* `NGINX_HOST` - The IP address of the system
* `NGINX_INTERNAL_HOST` - Typically `host.docker.internal` or `172.17.0.1`
to allow communication within the docker network
* `ENVIRONMENT` - Change to `production`
* `ADMIN_EMAIL` - Please change in production environments
* `ADMIN_PASSWORD` - Please change in production environments
* `VITE_API_URL` - Change to the FQDN of the URL that is reachable through the internet.
For example: `https://aviation.bensherriff.com/api`
* `__VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS` - Change to the domain of the `VITE_API_URL`.
For example: `aviation.bensherriff.com`

If the App is not directly exposed to the internet (i.e., behind another reverse proxy or similar),
then `NGINX_SSL_ENABLED` most likely should be `false`. The `NGINX_SSL_ENABLED` should only be
enabled when you need to set up SSL directly. However, the SSL configuration is incomplete, and may
require additional configuration that is not included in this README.
* Additionally, run `make cert` to generate certificates.

## Data Sources

### Airport Data

Potential Data sources
 - https://adip.faa.gov/agis/public/#/airportSearch/advanced
 - https://www.icao.int/Aviation-API-Data-Service/Pages/default.aspx
 - https://ourairports.com/data/
 - [mborsetti/airportsdata](https://github.com/mborsetti/airportsdata)
 - https://www.iata.org/en/publications/directories/code-search/
 - [openstreet](https://www.openstreetmap.org/#map=13/38.95223/-77.47417)

### Metar Data
Metar data is collected from aviationweather.gov.

#### Decoding METARS
The following resources were used to help decode METARS.
- [Metar Decode Key PDF](https://www.weather.gov/media/wrh/mesowest/metar_decode_key.pdf)
- [Metar Decode (NPS EDU)](https://met.nps.edu/~bcreasey/mr3222/files/helpful/DecodeMETAR-TAF.html)
- [moratech.com](http://moratech.com/aviation/metar-class/metar.html#INDEX)

### OpenMapTiles
[Generate Vector Tiles](https://openmaptiles.org/docs/generate/generate-openmaptiles/)

### ADS-B
- https://blog.exploit.org/ads-b-guide-demodulation-and-decoding/
- https://mode-s.org/1090mhz/index.html
- https://planewave.github.io/posts/rtlsdr/
- http://jasonplayne.com:8080/#

### Other data
- https://www.faa.gov/air_traffic/weather/asos

## Tests
`cargo test metars::model::tests::test_parse_time -- --exact --nocapture
`
