Files
Mathias Bergqvist 91be18c100
Some checks failed
CD / Lint / Test / Vet (push) Failing after 2s
CD / Build & Import (push) Has been skipped
CD / Deploy via GitOps (push) Has been skipped
feat(auth): JWT-or-static middleware + /.well-known/oauth-protected-resource (issue #5)
- internal/auth/jwt.go: JWTValidator via lestrrat-go/jwx/v2, JWKS auto-refresh
- internal/auth/bearer.go: replace Gitea PAT validation with JWT->static->default chain
- internal/gitea/client.go: always use service PAT; remove TokenFromContext lookup
- internal/config/config.go: add DexIssuerURL, MCPAudience, MCPResourceURL, StaticToken
- cmd/gitea-mcp/main.go: wire validator, fix /.well-known to return real AS list
- bearer_test.go: rewrite for new API
2026-05-12 11:30:52 +02:00

1.2 KiB

name, description
name description
go-patterns Go project patterns — endpoint checklist, error handling, HTMX responses, dependency policy. Use when writing Go code, adding endpoints, or reviewing Go PRs.

Go project patterns

New endpoint checklist

  1. Define request/response types in types.go
  2. Write handler in handlers.go using http.HandlerFunc
  3. Add route in routes.go
  4. Write table-driven test in handlers_test.go
  5. Run task check before committing

Error handling pattern

if err != nil {
    return fmt.Errorf("descriptiveOperation: %w", err)
}

Never log and return — do one or the other.

HTMX response pattern

func (h *Handler) ListItems(w http.ResponseWriter, r *http.Request) {
    items, err := h.store.List(r.Context())
    if err != nil {
        http.Error(w, "failed to list items", http.StatusInternalServerError)
        return
    }
    if r.Header.Get("HX-Request") == "true" {
        h.templates.Render(w, "items/_list", items)
        return
    }
    h.templates.Render(w, "items/index", items)
}

Dependency policy

  • Prefer stdlib: net/http, encoding/json, database/sql
  • Allowed without justification: testify, slog, templ, sqlc
  • Needs justification in commit message: anything else