veza/veza-backend-api/docs/DEVELOPMENT_SETUP_GUIDE.md

886 lines
16 KiB
Markdown

# 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 <repository-url>
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 <pid>
```
### 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 <pid>
# 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 <version>
# 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