- 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
43 lines
1.2 KiB
Markdown
43 lines
1.2 KiB
Markdown
---
|
|
name: go-patterns
|
|
description: 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
|
|
```go
|
|
if err != nil {
|
|
return fmt.Errorf("descriptiveOperation: %w", err)
|
|
}
|
|
```
|
|
Never log and return — do one or the other.
|
|
|
|
## HTMX response pattern
|
|
```go
|
|
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
|