97 lines
2.6 KiB
Go
97 lines
2.6 KiB
Go
package routes
|
|
|
|
import (
|
|
"bssapp-backend/auth"
|
|
"bssapp-backend/queries"
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// GET /api/pricing/products
|
|
func GetProductPricingListHandler(w http.ResponseWriter, r *http.Request) {
|
|
started := time.Now()
|
|
traceID := buildPricingTraceID(r)
|
|
w.Header().Set("X-Trace-ID", traceID)
|
|
claims, ok := auth.GetClaimsFromContext(r.Context())
|
|
if !ok || claims == nil {
|
|
log.Printf("[ProductPricing] trace=%s unauthorized method=%s path=%s", traceID, r.Method, r.URL.Path)
|
|
http.Error(w, "unauthorized", http.StatusUnauthorized)
|
|
return
|
|
}
|
|
log.Printf("[ProductPricing] trace=%s start user=%s id=%d", traceID, claims.Username, claims.ID)
|
|
|
|
ctx, cancel := context.WithTimeout(r.Context(), 180*time.Second)
|
|
defer cancel()
|
|
|
|
rows, err := queries.GetProductPricingList(ctx)
|
|
if err != nil {
|
|
if isPricingTimeoutLike(err, ctx.Err()) {
|
|
log.Printf(
|
|
"[ProductPricing] trace=%s timeout user=%s id=%d duration_ms=%d err=%v",
|
|
traceID,
|
|
claims.Username,
|
|
claims.ID,
|
|
time.Since(started).Milliseconds(),
|
|
err,
|
|
)
|
|
http.Error(w, "Urun fiyatlandirma listesi zaman asimina ugradi", http.StatusGatewayTimeout)
|
|
return
|
|
}
|
|
log.Printf(
|
|
"[ProductPricing] trace=%s query_error user=%s id=%d duration_ms=%d err=%v",
|
|
traceID,
|
|
claims.Username,
|
|
claims.ID,
|
|
time.Since(started).Milliseconds(),
|
|
err,
|
|
)
|
|
http.Error(w, "Urun fiyatlandirma listesi alinamadi: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
log.Printf(
|
|
"[ProductPricing] trace=%s success user=%s id=%d count=%d duration_ms=%d",
|
|
traceID,
|
|
claims.Username,
|
|
claims.ID,
|
|
len(rows),
|
|
time.Since(started).Milliseconds(),
|
|
)
|
|
|
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
|
_ = json.NewEncoder(w).Encode(rows)
|
|
}
|
|
|
|
func buildPricingTraceID(r *http.Request) string {
|
|
if r != nil {
|
|
if id := strings.TrimSpace(r.Header.Get("X-Request-ID")); id != "" {
|
|
return id
|
|
}
|
|
if id := strings.TrimSpace(r.Header.Get("X-Correlation-ID")); id != "" {
|
|
return id
|
|
}
|
|
}
|
|
return "pricing-" + strconv.FormatInt(time.Now().UnixNano(), 36)
|
|
}
|
|
|
|
func isPricingTimeoutLike(err error, ctxErr error) bool {
|
|
if errors.Is(err, context.DeadlineExceeded) || errors.Is(ctxErr, context.DeadlineExceeded) {
|
|
return true
|
|
}
|
|
if err == nil {
|
|
return false
|
|
}
|
|
e := strings.ToLower(err.Error())
|
|
return strings.Contains(e, "timeout") ||
|
|
strings.Contains(e, "i/o timeout") ||
|
|
strings.Contains(e, "wsarecv") ||
|
|
strings.Contains(e, "connection attempt failed") ||
|
|
strings.Contains(e, "no connection could be made") ||
|
|
strings.Contains(e, "failed to respond")
|
|
}
|