Go REST API. See root CLAUDE.md for full context.
go build ./... # must pass
make lint # must pass (golangci-lint, zero issues)
make sqlc # after editing db/queries/*.sql
make migrate-new MIGRATION_NAME=xxx # new migration pair- Create
internal/<domain>/withhandler.go,service.go,repo.go,model.go - Add SQL queries in
db/queries/<table>.sql, runmake sqlc - Wire in
cmd/coreapi/main.go:pool → repo → service → handler - Register routes in
internal/app/routes.go
- Add SQL query (
db/queries/) →make sqlc - Add repo method wrapping generated query
- Add service method with business logic + sentinel errors
- Add handler method +
handleServiceErrorcase - Register route in
routes.go go build ./...+make lint
-- name: GetFoo :one
SELECT * FROM foos WHERE id = $1;
-- name: ListFoos :many
SELECT * FROM foos WHERE owner_id = $1 ORDER BY created_at DESC LIMIT $2 OFFSET $3;
-- name: UpdateFoo :one
UPDATE foos SET
title = COALESCE(sqlc.narg('title'), title),
description = COALESCE(sqlc.narg('description'), description)
WHERE id = $1 AND owner_id = $2
RETURNING *;- Use
sqlc.narg('name')for optional/nullable params → generatespgtype.X - Convert
*uuid.UUIDto pgtype:pgtype.UUID{Bytes: *id, Valid: true}
Key enabled linters: gosec, revive, errorlint, tagliatelle (JSON snake_case), bodyclose, gocritic.
Suppress with: //nolint:lintername // reason
No test suite exists yet. When adding tests, use standard *_test.go files with testing package.