108 lines
4.0 KiB
Go
108 lines
4.0 KiB
Go
package routes
|
|
|
|
import (
|
|
"bssapp-backend/auth"
|
|
"bssapp-backend/queries"
|
|
"context"
|
|
"database/sql"
|
|
"encoding/json"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type productPricingCalcRequest struct {
|
|
ProductCodes []string `json:"product_codes"`
|
|
RateDate string `json:"rate_date"`
|
|
ForceFxRefresh bool `json:"force_fx_refresh"`
|
|
PreviewOnly bool `json:"preview_only"`
|
|
|
|
Search string `json:"q"`
|
|
ProductCode []string `json:"product_code"`
|
|
BrandGroup []string `json:"brand_group_selection"`
|
|
AskiliYan []string `json:"askili_yan"`
|
|
Kategori []string `json:"kategori"`
|
|
UrunIlkGrubu []string `json:"urun_ilk_grubu"`
|
|
UrunAnaGrubu []string `json:"urun_ana_grubu"`
|
|
UrunAltGrubu []string `json:"urun_alt_grubu"`
|
|
Icerik []string `json:"icerik"`
|
|
Karisim []string `json:"karisim"`
|
|
Marka []string `json:"marka"`
|
|
}
|
|
|
|
func PostProductPricingCalculateSnapshotsHandler(pg *sql.DB) http.HandlerFunc {
|
|
return func(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 {
|
|
http.Error(w, "unauthorized", http.StatusUnauthorized)
|
|
return
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(r.Context(), 170*time.Second)
|
|
defer cancel()
|
|
|
|
reqBody := productPricingCalcRequest{}
|
|
if r.Body != nil {
|
|
_ = json.NewDecoder(r.Body).Decode(&reqBody)
|
|
}
|
|
|
|
filters := queries.ProductPricingFilters{
|
|
Search: strings.TrimSpace(reqBody.Search),
|
|
ProductCode: reqBody.ProductCode,
|
|
BrandGroup: reqBody.BrandGroup,
|
|
AskiliYan: reqBody.AskiliYan,
|
|
Kategori: reqBody.Kategori,
|
|
UrunIlkGrubu: reqBody.UrunIlkGrubu,
|
|
UrunAnaGrubu: reqBody.UrunAnaGrubu,
|
|
UrunAltGrubu: reqBody.UrunAltGrubu,
|
|
Icerik: reqBody.Icerik,
|
|
Karisim: reqBody.Karisim,
|
|
Marka: reqBody.Marka,
|
|
}
|
|
if filters.Search == "" && len(filters.ProductCode) == 0 && len(filters.BrandGroup) == 0 &&
|
|
len(filters.AskiliYan) == 0 && len(filters.Kategori) == 0 && len(filters.UrunIlkGrubu) == 0 &&
|
|
len(filters.UrunAnaGrubu) == 0 && len(filters.UrunAltGrubu) == 0 && len(filters.Icerik) == 0 &&
|
|
len(filters.Karisim) == 0 && len(filters.Marka) == 0 {
|
|
filters = parseProductPricingFilters(r)
|
|
}
|
|
|
|
calcReq := queries.ProductPricingSnapshotCalcRequest{
|
|
ProductCodes: reqBody.ProductCodes,
|
|
Filters: filters,
|
|
RateDate: reqBody.RateDate,
|
|
ForceFxRefresh: reqBody.ForceFxRefresh,
|
|
}
|
|
if reqBody.PreviewOnly {
|
|
result, err := queries.PreviewProductPricingSnapshots(ctx, pg, calcReq)
|
|
if err != nil {
|
|
log.Printf("[ProductPricingCalcPreview] trace=%s user=%s id=%d err=%v duration_ms=%d",
|
|
traceID, claims.Username, claims.ID, err, time.Since(started).Milliseconds())
|
|
http.Error(w, "Urun fiyat hesap onizlemesi olusturulamadi: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
log.Printf("[ProductPricingCalcPreview] trace=%s user=%s id=%d requested=%d calculated=%d skipped=%d fx_date=%s duration_ms=%d",
|
|
traceID, claims.Username, claims.ID, result.Requested, result.Calculated, result.Skipped, result.RateDate, time.Since(started).Milliseconds())
|
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
|
_ = json.NewEncoder(w).Encode(result)
|
|
return
|
|
}
|
|
result, err := queries.CalculateProductPricingSnapshots(ctx, pg, calcReq)
|
|
if err != nil {
|
|
log.Printf("[ProductPricingCalc] trace=%s user=%s id=%d err=%v duration_ms=%d",
|
|
traceID, claims.Username, claims.ID, err, time.Since(started).Milliseconds())
|
|
http.Error(w, "Urun fiyat hesaplari olusturulamadi: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
log.Printf("[ProductPricingCalc] trace=%s user=%s id=%d requested=%d calculated=%d skipped=%d fx_date=%s duration_ms=%d",
|
|
traceID, claims.Username, claims.ID, result.Requested, result.Calculated, result.Skipped, result.RateDate, time.Since(started).Milliseconds())
|
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
|
_ = json.NewEncoder(w).Encode(result)
|
|
}
|
|
}
|