Files
ackify-ce/Makefile
Benjamin 24e2de2922 refactor(arch): enforce strict layered architecture with private interfaces
Apply Clean Architecture principles throughout the codebase to eliminate tight coupling between layers. Handlers now depend exclusively on services through private interfaces, never directly on repositories.
Introduce a ServerBuilder pattern with pluggable capability providers.

refactor(auth): introduce injectable AuthorizerService

Replace hardcoded AdminEmails and OnlyAdminCanCreate config fields
with an injectable AuthorizerService. This improves testability and
follows the dependency injection pattern used elsewhere in the codebase.

- Create AuthorizerService in application/services/
- Define minimal Authorizer interfaces in consuming packages
- Update middleware, handlers, and router to use injected authorizer
- Update all affected tests with mock implementations

refactor(build): move go.mod to backend directory
Move Go module files from project root to backend/ directory while keeping the module name as github.com/btouchard/ackify-ce.
This improves project structure by keeping Go-specific files within the Go codebase directory.

# Conflicts:
#	backend/internal/application/services/checksum_service_test.go
#	backend/internal/application/services/document_service.go
#	backend/internal/application/services/document_service_duplicate_test.go
#	backend/internal/application/services/document_service_test.go
#	backend/internal/presentation/api/documents/handler.go
#	backend/internal/presentation/api/documents/handler_test.go
#	backend/internal/presentation/api/router.go
#	backend/pkg/web/server.go
2025-12-08 16:07:03 +01:00

177 lines
7.3 KiB
Makefile

# SPDX-License-Identifier: AGPL-3.0-or-later
# Makefile for ackify-ce project
.PHONY: build build-frontend build-backend build-all test test-unit test-integration test-short coverage lint fmt vet clean help dev dev-frontend dev-backend migrate-up migrate-down docker-rebuild
# Variables
BINARY_NAME=ackify-ce
BACKEND_DIR=./backend
BUILD_DIR=./cmd/community
MIGRATE_DIR=./cmd/migrate
COVERAGE_DIR=coverage
WEBAPP_DIR=./webapp
# Default target
help: ## Display this help message
@echo "Available targets:"
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
# Build targets
build: build-all ## Build the complete application (frontend + backend)
build-frontend: ## Build the Vue.js frontend
@echo "Building frontend..."
cd $(WEBAPP_DIR) && npm install && npm run build
build-backend: ## Build the Go backend
@echo "Building $(BINARY_NAME)..."
cd $(BACKEND_DIR) && go build -o ../$(BINARY_NAME) $(BUILD_DIR)
build-all: build-frontend build-backend ## Build frontend and backend
# Test targets
test: test-unit test-integration ## Run all tests
test-unit: ## Run unit tests
@echo "Running unit tests with race detection..."
cd $(BACKEND_DIR) && CGO_ENABLED=1 go test -short -race -v ./internal/... ./pkg/... ./cmd/...
test-integration: ## Run integration tests (DB + admin; requires PostgreSQL - migrations applied automatically)
@echo "Running integration tests with race detection..."
@echo "Note: Migrations are applied automatically by test setup"
@export INTEGRATION_TESTS=1; \
export ACKIFY_DB_DSN="postgres://postgres:testpassword@localhost:5432/ackify_test?sslmode=disable"; \
cd $(BACKEND_DIR) && CGO_ENABLED=1 go test -v -race -tags=integration ./internal/infrastructure/database/... ./internal/presentation/api/admin
test-integration-setup: ## Setup test database for integration tests (migrations applied by tests)
@echo "Setting up test database..."
@psql "postgres://postgres:testpassword@localhost:5432/postgres?sslmode=disable" -c "DROP DATABASE IF EXISTS ackify_test;" || true
@psql "postgres://postgres:testpassword@localhost:5432/postgres?sslmode=disable" -c "CREATE DATABASE ackify_test;"
@echo "Test database ready! Migrations will be applied automatically when tests run."
test-short: ## Run only quick tests
@echo "Running short tests..."
cd $(BACKEND_DIR) && go test -short ./...
# Coverage targets
coverage: ## Generate test coverage report
@echo "Generating coverage report..."
@mkdir -p $(COVERAGE_DIR)
cd $(BACKEND_DIR) && go test -coverprofile=../$(COVERAGE_DIR)/coverage.out ./...
go tool cover -html=$(COVERAGE_DIR)/coverage.out -o $(COVERAGE_DIR)/coverage.html
@echo "Coverage report generated: $(COVERAGE_DIR)/coverage.html"
coverage-integration: ## Generate integration test coverage report
@echo "Generating integration coverage report..."
@mkdir -p $(COVERAGE_DIR)
@export ACKIFY_DB_DSN="postgres://postgres:testpassword@localhost:5432/ackify_test?sslmode=disable"; \
export INTEGRATION_TESTS=1; \
cd $(BACKEND_DIR) && CGO_ENABLED=1 go test -v -race -tags=integration -coverprofile=../$(COVERAGE_DIR)/coverage-integration.out ./internal/infrastructure/database/... ./internal/presentation/api/admin
go tool cover -html=$(COVERAGE_DIR)/coverage-integration.out -o $(COVERAGE_DIR)/coverage-integration.html
@echo "Integration coverage report generated: $(COVERAGE_DIR)/coverage-integration.html"
coverage-all: ## Generate full coverage report (unit + integration merged)
@echo "Generating full coverage report..."
@mkdir -p $(COVERAGE_DIR)
@echo "Step 1/3: Running unit tests with coverage..."
@cd $(BACKEND_DIR) && CGO_ENABLED=1 go test -short -race -coverprofile=../$(COVERAGE_DIR)/coverage-unit.out ./internal/... ./pkg/... ./cmd/...
@echo "Step 2/3: Running integration tests with coverage..."
@export ACKIFY_DB_DSN="postgres://postgres:testpassword@localhost:5432/ackify_test?sslmode=disable"; \
export INTEGRATION_TESTS=1; \
cd $(BACKEND_DIR) && CGO_ENABLED=1 go test -v -race -tags=integration -coverprofile=../$(COVERAGE_DIR)/coverage-integration.out ./internal/infrastructure/database/... ./internal/presentation/api/admin
@echo "Step 3/3: Merging coverage files..."
@echo "mode: atomic" > $(COVERAGE_DIR)/coverage-all.out
@grep -h -v "^mode:" $(COVERAGE_DIR)/coverage-unit.out $(COVERAGE_DIR)/coverage-integration.out >> $(COVERAGE_DIR)/coverage-all.out || true
@go tool cover -html=$(COVERAGE_DIR)/coverage-all.out -o $(COVERAGE_DIR)/coverage-all.html
@go tool cover -func=$(COVERAGE_DIR)/coverage-all.out
@echo "Full coverage report generated: $(COVERAGE_DIR)/coverage-all.html"
coverage-func: ## Show function-level coverage
cd $(BACKEND_DIR) && go test -coverprofile=../$(COVERAGE_DIR)/coverage.out ./...
go tool cover -func=$(COVERAGE_DIR)/coverage.out
# Code quality targets
fmt: ## Format Go code
@echo "Formatting code..."
cd $(BACKEND_DIR) && go fmt ./...
vet: ## Run go vet
@echo "Running go vet..."
cd $(BACKEND_DIR) && go vet ./...
lint: fmt vet ## Run basic linting tools
lint-extra: ## Run staticcheck if available (installs if missing)
@command -v staticcheck >/dev/null 2>&1 || { echo "Installing staticcheck..."; go install honnef.co/go/tools/cmd/staticcheck@latest; }
cd $(BACKEND_DIR) && staticcheck ./...
# Development targets
dev: dev-backend ## Start development server (backend only - frontend served by backend)
dev-frontend: ## Start frontend development server (Vite hot reload)
@echo "Starting frontend dev server..."
cd $(WEBAPP_DIR) && npm run dev
dev-backend: ## Run backend in development mode
@echo "Starting backend..."
cd $(BACKEND_DIR) && go run $(BUILD_DIR)
clean: ## Clean build artifacts and test coverage
@echo "Cleaning..."
rm -f $(BINARY_NAME)
rm -rf $(COVERAGE_DIR)
rm -rf $(WEBAPP_DIR)/dist
rm -rf $(WEBAPP_DIR)/node_modules
cd $(BACKEND_DIR) && go clean ./...
deps: ## Download and tidy dependencies (Go + npm)
@echo "Downloading Go dependencies..."
cd $(BACKEND_DIR) && go mod download
cd $(BACKEND_DIR) && go mod tidy
@echo "Installing frontend dependencies..."
cd $(WEBAPP_DIR) && npm install
migrate-up: ## Apply database migrations
@echo "Applying database migrations..."
cd $(BACKEND_DIR) && go run $(MIGRATE_DIR) up
migrate-down: ## Rollback last database migration
@echo "Rolling back last migration..."
cd $(BACKEND_DIR) && go run $(MIGRATE_DIR) down
# Mock generation (none at the moment)
generate-mocks: ## No exported interfaces to mock (skipped)
@echo "Skipping mock generation: no exported interfaces to mock."
# Docker targets
docker-build: ## Build Docker image
docker build -t ackify-ce:latest .
docker-rebuild: ## Rebuild and restart Docker containers (as per CLAUDE.md)
@echo "Rebuilding and restarting Docker containers..."
docker compose -f compose.local.yml up -d --force-recreate ackify-ce --build
docker-up: ## Start Docker containers
docker compose -f compose.local.yml up -d
docker-down: ## Stop Docker containers
docker compose -f compose.local.yml down
docker-logs: ## View Docker logs
docker compose -f compose.local.yml logs -f ackify-ce
docker-test: ## Run tests in Docker environment
docker compose -f compose.local.yml up -d ackify-db
@sleep 5
$(MAKE) test
docker compose -f compose.local.yml down
# CI targets
ci: deps lint test coverage ## Run all CI checks
# Install dev tools
dev-tools: ## Install development tools
@echo "Installing development tools..."
go install go.uber.org/mock/mockgen@latest