Files
go-caatsm/GEMINI.md
T

95 lines
4.3 KiB
Markdown
Raw Normal View History

# go-caatsm (Civil Aviation Authority Telegram Message Processor)
## Project Overview
`go-caatsm` is a high-performance Go application designed to process aviation telegrams (like FPL, ARR, DEP) and weather reports (METAR, SPECI, TAF) from NATS JetStream, parse them, persist them to PostgreSQL/TimescaleDB, and republish the parsed results. It follows Clean Architecture principles to ensure modularity and testability.
## Architecture
The project is structured using Clean Architecture:
* **`cmd/`**: Application entry points. `cmd/main` is the primary service, `cmd/seed-telegrams` is a utility for generating test data.
* **`internal/domain/`**: Core business logic and types (e.g., `aviation.go`, `fpl.go`, `weather/`). Pure Go, no dependencies on outer layers.
* **`internal/app/`**: Application business rules (use cases). `MessageProcessor` orchestrates the flow between ports.
* **`internal/adapter/`**: Adapters for external interfaces.
* `parser/`: Logic to parse raw telegram text into domain objects.
* `aviation/`: Aviation telegram parser (ARR, DEP, CNL, DLA, FPL)
* `weather/`: Weather report parser (METAR, SPECI, TAF)
* `composite.go`: Composite parser that routes messages to appropriate parser
* `validator/`: AFTN protocol validation.
* `dto/`: Data Transfer Objects.
* **`internal/infra/`**: Infrastructure implementations.
* `nats/`: NATS JetStream consumer and publisher.
* `postgres/`: Database repository using `pgx`.
* `config/`, `log/`, `telemetry/`, `monitoring/`: Cross-cutting concerns.
* **`internal/port/`**: Interfaces defining the contracts for repositories, publishers, and parsers.
* **`pkg/di/`**: Dependency Injection using Google Wire.
## Tech Stack
* **Language:** Go 1.24+
* **Messaging:** NATS JetStream
* **Database:** PostgreSQL (with TimescaleDB extension for time-series data)
* **Observability:** OpenTelemetry (OTLP), Prometheus, Jaeger, Grafana, Zap Logger
* **CLI:** `urfave/cli`
* **DI:** Google Wire
* **Testing:** Ginkgo (BDD), Gomega, Testcontainers (integration tests)
## Key Commands (Taskfile)
The project uses `Taskfile.yml` for managing common tasks.
* **Build:** `task build` (Output: `bin/receiver`)
* **Run (Dev):** `task run-dev` (Connects to local Docker stack)
* **Run (Prod):** `task run-prod`
* **Test (Unit):** `task test`
* **Test (Integration):** `task test-int` (Requires Docker)
* **Lint:** `task lint`
* **Start Infrastructure:** `task up` (Starts Postgres, NATS, Observability stack)
* **Stop Infrastructure:** `task down`
* **Seed Data:** `task seed` (Injects sample telegrams into NATS)
## Configuration
Configuration is managed via TOML files in `configs/` and environment variables.
* `configs/config.dev.toml`: Default for development (`GO_ENV=dev`).
* `configs/config.prod.toml`: Production settings (`GO_ENV=prod`).
* Environment Variables: Prefix `CAATSM_` (e.g., `CAATSM_NATS_URL`, `CAATSM_POSTGRES_URL`).
## Development Workflow
1. **Start Infrastructure:**
```bash
task up
```
2. **Run Service Locally:**
```bash
task run-dev
```
3. **Generate Traffic:**
```bash
task seed
# OR for continuous traffic
task seed-slow
```
4. **Observe:**
* Grafana: http://localhost:3000 (admin/admin)
* Jaeger: http://localhost:16686
* Prometheus: http://localhost:9090
## Key Files & Directories
* `cmd/main/main.go`: Application entry point. Sets up config, DI, and starts the listener.
* `internal/app/processor.go`: `MessageProcessor` - The core orchestration logic.
* `internal/adapter/parser/`: Contains parsers for aviation telegrams and weather reports (composite pattern).
* `internal/infra/nats/consumer.go`: JetStream consumer implementation.
* `internal/infra/postgres/telegrams.ddl`: Database schema.
* `docs/`: Extensive documentation (Architecture, NATS, Dev Guide).
## Notes for AI Agent
* **Conventions:** Follow existing patterns in `internal/`. Use `internal/port` for interfaces.
* **Testing:** New features must include Ginkgo tests. Integration tests should be added for infrastructure components.
* **DI:** If adding new components, update `pkg/di/wire.go` and run `task wire` (or `task generate`).
* **Safety:** Always check `go.mod` before adding imports.