Files
member-console/Makefile
T

97 lines
3.9 KiB
Makefile

# Makefile for building and pushing multi-arch Docker images
IMAGE_REPO = git.coopcloud.tech/wiki-cafe/member-console
DATE_TAG = $(shell date -u +%Y-%m-%dT%H-%MZ)
# PLATFORMS = linux/arm64,linux/amd64
PLATFORMS = linux/amd64
.PHONY: docker-push
docker-push:
docker buildx build \
--platform $(PLATFORMS) \
-t $(IMAGE_REPO):latest \
-t $(IMAGE_REPO):$(DATE_TAG) \
--push .
# Database migration targets
.PHONY: sqlc-generate
# The nine package directories that carry their own sqlc.yaml (six core
# packages + three integration stores); see docs/database-management.md.
SQLC_DIRS = internal/identity \
internal/organization \
internal/billing \
internal/entitlements \
internal/integration \
internal/domains \
internal/integrations/fedwiki/store \
internal/integrations/stripe/store \
internal/integrations/discourse/store
sqlc-generate:
@for dir in $(SQLC_DIRS); do \
echo "sqlc generate: $$dir"; \
(cd $$dir && sqlc generate) || exit 1; \
done
# Build the application
.PHONY: build
build:
go build -o member-console .
# Run the test suite against pristine test databases. reset-test-db.sh drops,
# recreates, and migrates the tests' own databases (never the app's), so the
# suite starts from migrations only and a running app cannot perturb it.
# Requires the stack up: cd test && ./bootstrap-stack.sh && docker compose up -d.
#
# -count=1 because Go's test cache keys on code and env, not database state:
# after a reset, a cached "ok" would be reporting on a database that no
# longer exists.
#
# -p 1 because several packages commit rows that other packages read: the
# org-type-change suites set and restore personal.default_plan_ladder_id
# while internal/provisioning asserts it is unset; the discourse operator and
# webhook suites commit group mappings that the reconcile suite's fake forum
# has never heard of. Serializing packages closes that whole class. It is not
# a stand-in for the separate e2e database — serialization orders commits, it
# does not undo them — the two fixes cover different vectors.
.PHONY: test
test:
@cd test && ./reset-test-db.sh && set -a && . ./.env && set +a && cd .. && go test -count=1 -p 1 ./...
# Respin the test stack from scratch: teardown (drops volumes), regenerate
# per-worktree ports/secrets, bring compose back up. The app and demo seed
# stay manual because migrations run at app boot (see test/AGENTS.md,
# "Browser walkthroughs (e2e) and stack age"). Suite freshness does not need
# this — `make test` resets the test databases on its own; respin when the
# *app* database or another service's state needs clearing.
#
# Composes the core stack. Teardown drops test/.env, so a composition carries
# over only if you pass it back in:
# make stack-fresh COMPOSE_PROFILES=fedwiki,discourse
.PHONY: stack-fresh
stack-fresh:
cd test && ./teardown-stack.sh && COMPOSE_PROFILES="$(COMPOSE_PROFILES)" ./bootstrap-stack.sh && docker compose up -d
@echo ""
@echo "Stack is fresh. For a full-exercise browser-walkthrough run:"
@echo " 1. cd test && set -a && . ./.env && set +a && go run .. start --config mc-config.yaml # boots + migrates"
@echo " 2. ./test/seed-demo.sh # walkthrough subjects (demo catalog + one active grant)"
@echo " 3. go test ./test/e2e/operator-walkthroughs/ -count=1"
@echo ""
@echo "Integration walkthroughs skip unless their compose profile is on AND"
@echo "the matching MC_* block in test/.env is uncommented (see test/AGENTS.md)."
@echo ""
@echo "The Go suite needs none of that: make test"
# Lint: ensure no handler bypasses SafeTemplates by writing directly to ResponseWriter.
# All template rendering must go through h.Templates.Render() — see internal/server/render.go.
.PHONY: lint-templates
lint-templates:
@if grep -rn '\.ExecuteTemplate(w,' internal/server/; then \
echo "ERROR: Direct ExecuteTemplate on ResponseWriter found. Use h.Templates.Render() instead."; \
exit 1; \
else \
echo "OK: No direct ExecuteTemplate on ResponseWriter detected."; \
fi