.PHONY: run run-worker-paid run-worker-free dev dev-infra-up dev-infra-down test test-integration lint migrate-up migrate-down migrate-create migrate-status docker-up docker-down docker-logs docker-logs-worker import-off ifneq (,$(wildcard .env)) include .env export endif # Run for development run: go run ./cmd/server run-worker-paid: WORKER_PLAN=paid go run ./cmd/worker run-worker-free: WORKER_PLAN=free go run ./cmd/worker # Start only infra (postgres, kafka) in Docker, run server + both workers locally dev: dev-infra-up @trap 'kill 0' INT; \ go run ./cmd/server & \ WORKER_PLAN=paid go run ./cmd/worker & \ WORKER_PLAN=free go run ./cmd/worker & \ wait dev-infra-up: docker compose up -d postgres kafka kafka-init dev-infra-down: docker compose stop postgres kafka kafka-init # Tests test: go test ./... -v -race -count=1 # Integration tests (require Docker) test-integration: go test -tags=integration ./... -v -race -count=1 # Linter lint: golangci-lint run ./... # Migrations migrate-up: goose -dir migrations postgres "$(DATABASE_URL)" up migrate-down: goose -dir migrations postgres "$(DATABASE_URL)" down migrate-create: goose -dir migrations create $(name) sql migrate-status: goose -dir migrations postgres "$(DATABASE_URL)" status # OpenFoodFacts import # Usage: make import-off file=openfoodfacts-products.jsonl.gz # Optional: make import-off file=... limit=1000 batch=500 min-scans=1 import-off: go run ./cmd/importoff \ -file=$(file) \ -dsn="$(DATABASE_URL)" \ $(if $(limit),-limit=$(limit)) \ $(if $(batch),-batch=$(batch)) \ $(if $(min-scans),-min-scans=$(min-scans)) # Docker docker-up: docker compose up -d docker-down: docker compose down docker-logs: docker compose logs -f app docker-logs-worker: docker compose logs -f worker-paid worker-free