# Veza Backend API - Development Setup Guide ## Table of Contents 1. [Overview](#overview) 2. [Prerequisites](#prerequisites) 3. [Quick Start](#quick-start) 4. [Manual Setup](#manual-setup) 5. [Docker Setup](#docker-setup) 6. [Project Structure](#project-structure) 7. [Configuration](#configuration) 8. [Database Setup](#database-setup) 9. [Running the Application](#running-the-application) 10. [Development Workflow](#development-workflow) 11. [Testing](#testing) 12. [Debugging](#debugging) 13. [Development Tools](#development-tools) 14. [Troubleshooting](#troubleshooting) ## Overview This guide will help you set up a local development environment for the Veza Backend API. The API is built with Go 1.23+ using the Gin web framework, PostgreSQL for data storage, and Redis for caching. ## Prerequisites ### Required Software #### Go **Version:** Go 1.23 or higher **Installation:** ```bash # Ubuntu/Debian sudo apt update sudo apt install golang-go # Fedora/RHEL sudo dnf install golang # macOS brew install go # Windows # Download from https://golang.org/dl/ # Or use Chocolatey: choco install golang ``` **Verify Installation:** ```bash go version # Should output: go version go1.23.x ... ``` #### PostgreSQL **Version:** PostgreSQL 12 or higher (15+ recommended) **Installation:** ```bash # Ubuntu/Debian sudo apt install postgresql postgresql-contrib # Fedora/RHEL sudo dnf install postgresql postgresql-server # macOS brew install postgresql@15 brew services start postgresql@15 # Windows # Download from https://www.postgresql.org/download/windows/ ``` **Verify Installation:** ```bash psql --version # Should output: psql (PostgreSQL) 15.x ... ``` #### Redis (Optional but Recommended) **Version:** Redis 6 or higher **Installation:** ```bash # Ubuntu/Debian sudo apt install redis-server # Fedora/RHEL sudo dnf install redis # macOS brew install redis brew services start redis # Windows # Download from https://github.com/microsoftarchive/redis/releases ``` **Verify Installation:** ```bash redis-cli ping # Should output: PONG ``` ### Optional Software #### Docker and Docker Compose For containerized development: ```bash # Ubuntu/Debian sudo apt install docker.io docker-compose # Fedora/RHEL sudo dnf install docker docker-compose # macOS brew install docker docker-compose # Windows # Download Docker Desktop from https://www.docker.com/products/docker-desktop ``` #### Air (Hot Reload) For automatic code reloading during development: ```bash go install github.com/cosmtrek/air@latest ``` #### golang-migrate For database migrations: ```bash # Install migrate tool go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest ``` #### Make For running common tasks: ```bash # Ubuntu/Debian sudo apt install build-essential # Fedora/RHEL sudo dnf install make # macOS (usually pre-installed) # Windows: Use Chocolatey or install from http://gnuwin32.sourceforge.net/packages/make.htm ``` ## Quick Start ### Automated Setup Script The fastest way to get started: ```bash # Navigate to backend API directory cd veza-backend-api # Run setup script chmod +x scripts/setup-dev.sh ./scripts/setup-dev.sh ``` This script will: - Check for required software (Go, PostgreSQL, Redis) - Create `.env` file from template - Create database if it doesn't exist - Install Go dependencies - Build the application ### Docker Quick Start If you prefer Docker: ```bash # From project root docker-compose up -d # Check logs docker-compose logs -f backend-api ``` ## Manual Setup ### 1. Clone Repository ```bash git clone cd veza/veza-backend-api ``` ### 2. Install Dependencies ```bash # Download Go modules go mod download # Tidy dependencies go mod tidy ``` ### 3. Create Environment File ```bash # Copy example environment file cp .env.example .env # Or create manually cat > .env << EOF # Database DATABASE_URL=postgres://veza:password@localhost:5432/veza_dev?sslmode=disable # Security JWT_SECRET=your-super-secret-jwt-key-minimum-32-characters-long JWT_EXPIRY=24h # Application APP_ENV=development API_PORT=8080 LOG_LEVEL=DEBUG LOG_FORMAT=text # Redis (Optional) REDIS_URL=redis://localhost:6379 # Services CHAT_SERVER_URL=http://localhost:8081 STREAM_SERVER_URL=http://localhost:8082 EOF ``` ### 4. Setup Database ```bash # Create PostgreSQL user and database sudo -u postgres psql << EOF CREATE USER veza WITH PASSWORD 'password'; CREATE DATABASE veza_dev OWNER veza; GRANT ALL PRIVILEGES ON DATABASE veza_dev TO veza; \q EOF # Or using createdb (if user exists) createdb -U veza veza_dev ``` ### 5. Run Migrations ```bash # Using migrate tool migrate -path ./migrations -database "$DATABASE_URL" up # Or using Make make migrate-up ``` ### 6. Build Application ```bash # Build binary make build # Or manually go build -o bin/veza-backend-api ./cmd/api/main.go ``` ### 7. Run Application ```bash # Run directly ./bin/veza-backend-api # Or using Make make run # Or with hot reload (if Air is installed) air ``` ## Docker Setup ### Using Docker Compose The project includes a `docker-compose.yml` for local development: ```bash # Start all services (PostgreSQL, Redis, Backend API) docker-compose up -d # View logs docker-compose logs -f backend-api # Stop services docker-compose down # Rebuild and restart docker-compose up -d --build ``` ### Docker Compose Services - **postgres**: PostgreSQL database on port 5432 - **redis**: Redis cache on port 6379 - **backend-api**: Go API on port 8080 ### Environment Variables for Docker Create `.env` file in project root: ```bash POSTGRES_DB=veza_dev POSTGRES_USER=veza POSTGRES_PASSWORD=password REDIS_PASSWORD= JWT_SECRET=your-super-secret-jwt-key-minimum-32-characters-long ``` ## Project Structure ``` veza-backend-api/ ├── cmd/ │ └── api/ │ └── main.go # Application entry point ├── internal/ │ ├── api/ # HTTP routes and router configuration │ ├── core/ # Business logic (auth, track, marketplace) │ │ ├── auth/ # Authentication core │ │ ├── track/ # Track management core │ │ ├── marketplace/ # Marketplace core │ │ └── social/ # Social features core │ ├── config/ # Configuration management │ ├── database/ # Database connection and migrations │ ├── handlers/ # HTTP request handlers │ ├── middleware/ # HTTP middleware (auth, CORS, rate limiting) │ ├── models/ # GORM data models │ ├── repositories/ # Data access layer │ ├── services/ # Business services │ ├── workers/ # Background job workers │ ├── validators/ # Input validation │ └── utils/ # Utility functions ├── migrations/ # SQL migration files ├── tests/ # Integration tests ├── docs/ # Documentation ├── scripts/ # Utility scripts ├── Makefile # Common tasks ├── go.mod # Go module definition ├── go.sum # Go module checksums └── .env # Environment variables (not in git) ``` ## Configuration ### Environment Variables #### Required Variables ```bash # Database connection DATABASE_URL=postgres://user:password@host:5432/dbname?sslmode=disable # JWT secret (minimum 32 characters) JWT_SECRET=your-super-secret-jwt-key-minimum-32-characters-long # Application environment APP_ENV=development # development|staging|production ``` #### Development Variables ```bash # Logging LOG_LEVEL=DEBUG # DEBUG|INFO|WARN|ERROR LOG_FORMAT=text # text|json # Server API_PORT=8080 HANDLER_TIMEOUT=30s # Redis (optional) REDIS_URL=redis://localhost:6379 # Services CHAT_SERVER_URL=http://localhost:8081 STREAM_SERVER_URL=http://localhost:8082 # Uploads UPLOAD_DIR=./uploads MAX_CONCURRENT_UPLOADS=10 # ClamAV (optional) ENABLE_CLAMAV=false # Set to false for local development CLAMAV_REQUIRED=false ``` ### Configuration Files - `.env`: Local environment variables (not committed to git) - `.env.example`: Example environment file (committed to git) - `config/`: Configuration files for different environments ## Database Setup ### Create Database ```bash # Using psql sudo -u postgres psql CREATE DATABASE veza_dev; CREATE USER veza WITH PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE veza_dev TO veza; \q # Or using createdb createdb -U veza veza_dev ``` ### Run Migrations ```bash # Using migrate tool migrate -path ./migrations -database "$DATABASE_URL" up # Check migration status migrate -path ./migrations -database "$DATABASE_URL" version # Rollback last migration migrate -path ./migrations -database "$DATABASE_URL" down 1 ``` ### Seed Database (Optional) ```bash # If seed scripts exist go run scripts/seed.go ``` ## Running the Application ### Development Mode #### With Hot Reload (Air) ```bash # Install Air if not already installed go install github.com/cosmtrek/air@latest # Run with hot reload air # Or create .air.toml config file air init air ``` #### Without Hot Reload ```bash # Build and run make run # Or manually go run ./cmd/api/main.go # Or run binary ./bin/veza-backend-api ``` ### Verify Application ```bash # Health check curl http://localhost:8080/healthz # API endpoint curl http://localhost:8080/api/v1/tracks ``` ### Common Make Commands ```bash # Build application make build # Run application make run # Run tests make test # Run tests with coverage make test-coverage # Run linter make lint # Format code make fmt # Run migrations make migrate-up make migrate-down # Clean build artifacts make clean ``` ## Development Workflow ### 1. Create Feature Branch ```bash git checkout -b feature/my-feature ``` ### 2. Make Changes - Write code following Go best practices - Follow project structure conventions - Add tests for new functionality ### 3. Run Tests ```bash # Run all tests make test # Run specific test go test ./internal/services/... -v # Run with coverage make test-coverage ``` ### 4. Check Code Quality ```bash # Format code make fmt # Run linter make lint # Check for security issues go vet ./... ``` ### 5. Commit Changes ```bash git add . git commit -m "feat: add new feature" ``` ### 6. Push and Create PR ```bash git push origin feature/my-feature # Create pull request on GitHub/GitLab ``` ## Testing ### Unit Tests ```bash # Run all unit tests go test ./... # Run tests in specific package go test ./internal/services/... # Run with verbose output go test -v ./... # Run specific test go test -v ./internal/services -run TestUserService ``` ### Integration Tests ```bash # Run integration tests go test ./tests/... -v # Run with database DATABASE_URL=postgres://... go test ./tests/integration/... ``` ### Test Coverage ```bash # Generate coverage report go test -cover ./... # Generate HTML coverage report go test -coverprofile=coverage.out ./... go tool cover -html=coverage.out -o coverage.html ``` ### Test Database For integration tests, use a separate test database: ```bash # Create test database createdb -U veza veza_test # Set test database URL export DATABASE_URL=postgres://veza:password@localhost:5432/veza_test?sslmode=disable # Run tests go test ./tests/... ``` ## Debugging ### Using Delve (Go Debugger) ```bash # Install Delve go install github.com/go-delve/delve/cmd/dlv@latest # Debug application dlv debug ./cmd/api/main.go # Or attach to running process dlv attach ``` ### VS Code Debugging Create `.vscode/launch.json`: ```json { "version": "0.2.0", "configurations": [ { "name": "Launch API", "type": "go", "request": "launch", "mode": "debug", "program": "${workspaceFolder}/cmd/api/main.go", "env": { "DATABASE_URL": "postgres://veza:password@localhost:5432/veza_dev?sslmode=disable", "JWT_SECRET": "your-secret-key", "APP_ENV": "development" } } ] } ``` ### Logging Enable debug logging: ```bash export LOG_LEVEL=DEBUG export LOG_FORMAT=text ``` View logs: ```bash # If running directly ./bin/veza-backend-api # If using Docker docker-compose logs -f backend-api # If using systemd journalctl -u veza-backend-api -f ``` ### Common Debugging Tips 1. **Check database connection:** ```bash psql "$DATABASE_URL" -c "SELECT 1;" ``` 2. **Check Redis connection:** ```bash redis-cli ping ``` 3. **Verify environment variables:** ```bash env | grep -E 'DATABASE|JWT|APP_ENV' ``` 4. **Check application health:** ```bash curl http://localhost:8080/healthz ``` ## Development Tools ### Code Generation #### Generate Swagger Documentation ```bash # Install swag go install github.com/swaggo/swag/cmd/swag@latest # Generate docs swag init -g cmd/api/main.go ``` #### Generate Mock Services ```bash # Install mockgen go install github.com/golang/mock/mockgen@latest # Generate mocks mockgen -source=internal/services/user_service.go -destination=internal/mocks/user_service_mock.go ``` ### Database Tools #### Database GUI Clients - **pgAdmin**: https://www.pgadmin.org/ - **DBeaver**: https://dbeaver.io/ - **TablePlus**: https://tableplus.com/ #### CLI Tools ```bash # PostgreSQL client psql "$DATABASE_URL" # Redis client redis-cli # Database migrations migrate -path ./migrations -database "$DATABASE_URL" version ``` ### API Testing #### Using curl ```bash # Health check curl http://localhost:8080/healthz # Get tracks curl http://localhost:8080/api/v1/tracks # Login curl -X POST http://localhost:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","password":"password"}' ``` #### Using HTTPie ```bash # Install HTTPie pip install httpie # Make requests http GET http://localhost:8080/api/v1/tracks http POST http://localhost:8080/api/v1/auth/login email=user@example.com password=password ``` #### Using Postman Import the API collection from `docs/postman/veza-api.json` (if available). ### Performance Profiling ```bash # Enable pprof export ENABLE_PPROF=true # Access profiler go tool pprof http://localhost:8080/debug/pprof/profile go tool pprof http://localhost:8080/debug/pprof/heap ``` ## Troubleshooting ### Common Issues #### Database Connection Failed ```bash # Check PostgreSQL is running sudo systemctl status postgresql # Check connection psql "$DATABASE_URL" -c "SELECT 1;" # Verify DATABASE_URL format echo $DATABASE_URL ``` #### Port Already in Use ```bash # Find process using port 8080 lsof -i :8080 # or netstat -tulpn | grep 8080 # Kill process kill -9 # Or change port in .env API_PORT=8081 ``` #### Go Module Issues ```bash # Clean module cache go clean -modcache # Download dependencies go mod download # Tidy modules go mod tidy ``` #### Migration Errors ```bash # Check migration status migrate -path ./migrations -database "$DATABASE_URL" version # Force version (if needed) migrate -path ./migrations -database "$DATABASE_URL" force # Rollback and retry migrate -path ./migrations -database "$DATABASE_URL" down 1 migrate -path ./migrations -database "$DATABASE_URL" up ``` ### Getting Help - **Documentation**: See `docs/` directory - **API Documentation**: http://localhost:8080/swagger/index.html - **Issues**: Create an issue on GitHub - **Team Chat**: Ask in team Slack/Discord ## Next Steps After setting up your development environment: 1. **Read the API Documentation**: See `docs/API_DOCUMENTATION.md` 2. **Explore the Codebase**: Start with `cmd/api/main.go` 3. **Run the Test Suite**: `make test` 4. **Check out Example Code**: Look at existing handlers and services 5. **Join the Team**: Get familiar with team workflows and conventions ## Additional Resources - **Go Documentation**: https://golang.org/doc/ - **Gin Framework**: https://gin-gonic.com/docs/ - **GORM Documentation**: https://gorm.io/docs/ - **PostgreSQL Documentation**: https://www.postgresql.org/docs/ - **Redis Documentation**: https://redis.io/documentation