Re-vendor the shared files from sneak/prompts at 0653579 (closes #52)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
Takes .golangci.yml, .dockerignore, .gitignore, .editorconfig, the workflow and REPO_POLICIES.md from sneak/prompts 0653579, with this repository's own entries after the shared content. Lint (golangci-lint v2.14.0) and test are Dockerfile phases that script/lint and script/test build alone with a new CACHEBUST value, keeping Go's and golangci-lint's caches; the image build depends on both. make fmt and make fmt-check also format the markdown with prettier, pinned in yarn.lock. The agent guidance moves to AGENTS.md. The Go code is fixed for what the new configuration finds, and the AS and prefix detail reads now return the rows' error after their loops. Model: opus-5-5
This commit was merged in pull request #85.
This commit is contained in:
@@ -15,6 +15,7 @@ import (
|
||||
// responseWriter wraps http.ResponseWriter to capture the response
|
||||
type responseWriter struct {
|
||||
http.ResponseWriter
|
||||
|
||||
body *bytes.Buffer
|
||||
statusCode int
|
||||
written bool
|
||||
@@ -87,8 +88,10 @@ func JSONResponseMiddleware(next http.Handler) http.Handler {
|
||||
}
|
||||
|
||||
// Parse the original response
|
||||
var originalResponse map[string]interface{}
|
||||
if err := json.Unmarshal(rw.body.Bytes(), &originalResponse); err != nil {
|
||||
var originalResponse map[string]any
|
||||
|
||||
err := json.Unmarshal(rw.body.Bytes(), &originalResponse)
|
||||
if err != nil {
|
||||
// If we can't parse it, just write original
|
||||
w.WriteHeader(rw.statusCode)
|
||||
_, _ = w.Write(rw.body.Bytes())
|
||||
@@ -97,7 +100,7 @@ func JSONResponseMiddleware(next http.Handler) http.Handler {
|
||||
}
|
||||
|
||||
// Add @meta field
|
||||
originalResponse["@meta"] = map[string]interface{}{
|
||||
originalResponse["@meta"] = map[string]any{
|
||||
"time_zone": "UTC",
|
||||
"api_version": 1,
|
||||
"execution_time": fmt.Sprintf("%d ms", execTime.Milliseconds()),
|
||||
@@ -160,8 +163,10 @@ func JSONValidationMiddleware(next http.Handler) http.Handler {
|
||||
|
||||
// For JSON responses, validate the JSON
|
||||
if rw.body.Len() > 0 {
|
||||
var testParse interface{}
|
||||
if err := json.Unmarshal(rw.body.Bytes(), &testParse); err == nil {
|
||||
var testParse any
|
||||
|
||||
err := json.Unmarshal(rw.body.Bytes(), &testParse)
|
||||
if err == nil {
|
||||
// Valid JSON, write it out
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.WriteHeader(rw.statusCode)
|
||||
@@ -180,9 +185,11 @@ func JSONValidationMiddleware(next http.Handler) http.Handler {
|
||||
if statusCode == http.StatusOK {
|
||||
statusCode = http.StatusInternalServerError
|
||||
}
|
||||
|
||||
if deadlinePassed(r.Context()) {
|
||||
statusCode = http.StatusGatewayTimeout
|
||||
}
|
||||
|
||||
w.WriteHeader(statusCode)
|
||||
|
||||
errorMsg := "Internal server error"
|
||||
@@ -190,11 +197,11 @@ func JSONValidationMiddleware(next http.Handler) http.Handler {
|
||||
errorMsg = requestTimeoutMessage
|
||||
}
|
||||
|
||||
response := map[string]interface{}{
|
||||
"status": "error",
|
||||
"error": map[string]interface{}{
|
||||
"msg": errorMsg,
|
||||
"code": statusCode,
|
||||
response := map[string]any{
|
||||
jsonKeyStatus: jsonStatusError,
|
||||
jsonKeyError: map[string]any{
|
||||
jsonKeyMsg: errorMsg,
|
||||
jsonKeyCode: statusCode,
|
||||
},
|
||||
}
|
||||
_ = json.NewEncoder(w).Encode(response)
|
||||
@@ -204,6 +211,7 @@ func JSONValidationMiddleware(next http.Handler) http.Handler {
|
||||
// statusWriter wraps http.ResponseWriter to capture the status code
|
||||
type statusWriter struct {
|
||||
http.ResponseWriter
|
||||
|
||||
statusCode int
|
||||
written bool
|
||||
}
|
||||
@@ -213,6 +221,7 @@ func (sw *statusWriter) WriteHeader(statusCode int) {
|
||||
sw.statusCode = statusCode
|
||||
sw.written = true
|
||||
}
|
||||
|
||||
sw.ResponseWriter.WriteHeader(statusCode)
|
||||
}
|
||||
|
||||
@@ -252,11 +261,12 @@ func RequestLoggerMiddleware(logger *slog.Logger) func(http.Handler) http.Handle
|
||||
// Slow query threshold (1 second)
|
||||
const slowQueryThreshold = 1 * time.Second
|
||||
|
||||
if sw.statusCode >= http.StatusInternalServerError {
|
||||
switch {
|
||||
case sw.statusCode >= http.StatusInternalServerError:
|
||||
logLevel = slog.LevelError
|
||||
} else if sw.statusCode >= http.StatusBadRequest {
|
||||
case sw.statusCode >= http.StatusBadRequest:
|
||||
logLevel = slog.LevelWarn
|
||||
} else if duration >= slowQueryThreshold {
|
||||
case duration >= slowQueryThreshold:
|
||||
logLevel = slog.LevelWarn
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user