Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -209,6 +209,11 @@ WHERE typ='img'
|
||||
}
|
||||
query += `
|
||||
ORDER BY
|
||||
CASE
|
||||
WHEN COALESCE(file_name,'') ~* 'gallery[-_ ]*1' THEN 0
|
||||
WHEN COALESCE(file_name,'') ~* '\(1\)(\.[A-Za-z0-9]+)?$' THEN 0
|
||||
ELSE 1
|
||||
END,
|
||||
COALESCE(sort_order,999999),
|
||||
zlins_dttm DESC,
|
||||
id DESC`
|
||||
|
||||
@@ -7,23 +7,39 @@ import (
|
||||
"encoding/json"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func readStockAttrFilters(r *http.Request) (kategori, urunAnaGrubu, urunAltGrubu, renk, renk2, urunIcerigi, fit, drop, beden string) {
|
||||
const filterValueSeparator = "\x1f"
|
||||
|
||||
type stockAttrFilters struct {
|
||||
kategori string
|
||||
urunAnaGrubu string
|
||||
urunAltGrubu []string
|
||||
renk []string
|
||||
renk2 []string
|
||||
urunIcerigi []string
|
||||
fit []string
|
||||
drop []string
|
||||
beden []string
|
||||
}
|
||||
|
||||
func readStockAttrFilters(r *http.Request) stockAttrFilters {
|
||||
q := r.URL.Query()
|
||||
|
||||
kategori = strings.TrimSpace(firstNonEmpty(q.Get("kategori"), q.Get("att44")))
|
||||
urunAnaGrubu = strings.TrimSpace(firstNonEmpty(q.Get("urun_ana_grubu"), q.Get("att01")))
|
||||
urunAltGrubu = strings.TrimSpace(firstNonEmpty(q.Get("urun_alt_grubu"), q.Get("att02")))
|
||||
renk = strings.TrimSpace(q.Get("renk"))
|
||||
renk2 = strings.TrimSpace(firstNonEmpty(q.Get("renk2"), q.Get("yaka")))
|
||||
urunIcerigi = strings.TrimSpace(firstNonEmpty(q.Get("urun_icerigi"), q.Get("att41")))
|
||||
fit = strings.TrimSpace(firstNonEmpty(q.Get("fit"), q.Get("att38")))
|
||||
drop = strings.TrimSpace(firstNonEmpty(q.Get("drop"), q.Get("att11")))
|
||||
beden = strings.TrimSpace(q.Get("beden"))
|
||||
return
|
||||
return stockAttrFilters{
|
||||
kategori: readSingleFilter(q, "kategori", "att44"),
|
||||
urunAnaGrubu: readSingleFilter(q, "urun_ana_grubu", "att01"),
|
||||
urunAltGrubu: readMultiFilter(q, "urun_alt_grubu", "att02"),
|
||||
renk: readMultiFilter(q, "renk"),
|
||||
renk2: readMultiFilter(q, "renk2", "yaka"),
|
||||
urunIcerigi: readMultiFilter(q, "urun_icerigi", "att41"),
|
||||
fit: readMultiFilter(q, "fit", "att38"),
|
||||
drop: readMultiFilter(q, "drop", "att11"),
|
||||
beden: readMultiFilter(q, "beden"),
|
||||
}
|
||||
}
|
||||
|
||||
func firstNonEmpty(vals ...string) string {
|
||||
@@ -35,10 +51,66 @@ func firstNonEmpty(vals ...string) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func readSingleFilter(q url.Values, keys ...string) string {
|
||||
for _, k := range keys {
|
||||
for _, raw := range q[k] {
|
||||
if v := strings.TrimSpace(raw); v != "" {
|
||||
return v
|
||||
}
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func splitFilterToken(raw string) []string {
|
||||
raw = strings.TrimSpace(raw)
|
||||
if raw == "" {
|
||||
return nil
|
||||
}
|
||||
r := strings.NewReplacer(
|
||||
filterValueSeparator, ",",
|
||||
";", ",",
|
||||
)
|
||||
normalized := r.Replace(raw)
|
||||
parts := strings.Split(normalized, ",")
|
||||
out := make([]string, 0, len(parts))
|
||||
for _, p := range parts {
|
||||
v := strings.TrimSpace(p)
|
||||
if v != "" {
|
||||
out = append(out, v)
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func readMultiFilter(q url.Values, keys ...string) []string {
|
||||
seen := make(map[string]struct{}, 8)
|
||||
out := make([]string, 0, 8)
|
||||
for _, k := range keys {
|
||||
for _, raw := range q[k] {
|
||||
for _, token := range splitFilterToken(raw) {
|
||||
if _, ok := seen[token]; ok {
|
||||
continue
|
||||
}
|
||||
seen[token] = struct{}{}
|
||||
out = append(out, token)
|
||||
}
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func joinFilterValues(values []string) string {
|
||||
if len(values) == 0 {
|
||||
return ""
|
||||
}
|
||||
return strings.Join(values, filterValueSeparator)
|
||||
}
|
||||
|
||||
// GetProductStockAttributeOptionsHandler
|
||||
// GET /api/product-stock-attribute-options
|
||||
func GetProductStockAttributeOptionsHandler(w http.ResponseWriter, r *http.Request) {
|
||||
kategori, urunAnaGrubu, urunAltGrubu, renk, renk2, urunIcerigi, fit, drop, beden := readStockAttrFilters(r)
|
||||
f := readStockAttrFilters(r)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
|
||||
defer cancel()
|
||||
@@ -46,15 +118,15 @@ func GetProductStockAttributeOptionsHandler(w http.ResponseWriter, r *http.Reque
|
||||
rows, err := db.MssqlDB.QueryContext(
|
||||
ctx,
|
||||
queries.GetProductStockAttributeOptionsQuery,
|
||||
kategori,
|
||||
urunAnaGrubu,
|
||||
urunAltGrubu,
|
||||
renk,
|
||||
renk2,
|
||||
urunIcerigi,
|
||||
fit,
|
||||
drop,
|
||||
beden,
|
||||
f.kategori,
|
||||
f.urunAnaGrubu,
|
||||
joinFilterValues(f.urunAltGrubu),
|
||||
joinFilterValues(f.renk),
|
||||
joinFilterValues(f.renk2),
|
||||
joinFilterValues(f.urunIcerigi),
|
||||
joinFilterValues(f.fit),
|
||||
joinFilterValues(f.drop),
|
||||
joinFilterValues(f.beden),
|
||||
)
|
||||
if err != nil {
|
||||
log.Printf("[PRODUCT-STOCK-ATTR-OPTIONS] SQL hatasi: %v", err)
|
||||
@@ -100,9 +172,9 @@ func GetProductStockAttributeOptionsHandler(w http.ResponseWriter, r *http.Reque
|
||||
// GetProductStockQueryByAttributesHandler
|
||||
// GET /api/product-stock-query-by-attributes
|
||||
func GetProductStockQueryByAttributesHandler(w http.ResponseWriter, r *http.Request) {
|
||||
kategori, urunAnaGrubu, urunAltGrubu, renk, renk2, urunIcerigi, fit, drop, beden := readStockAttrFilters(r)
|
||||
f := readStockAttrFilters(r)
|
||||
|
||||
if kategori == "" || urunAnaGrubu == "" {
|
||||
if f.kategori == "" || f.urunAnaGrubu == "" {
|
||||
http.Error(w, "Kategori ve Urun Ana Grubu secimi zorunludur", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
@@ -112,21 +184,21 @@ func GetProductStockQueryByAttributesHandler(w http.ResponseWriter, r *http.Requ
|
||||
defer cancel()
|
||||
log.Printf(
|
||||
"[PRODUCT-STOCK-BY-ATTRS] request kategori=%q urun_ana_grubu=%q urun_alt_grubu=%q renk=%q renk2=%q urun_icerigi=%q fit=%q drop=%q beden=%q",
|
||||
kategori, urunAnaGrubu, urunAltGrubu, renk, renk2, urunIcerigi, fit, drop, beden,
|
||||
f.kategori, f.urunAnaGrubu, strings.Join(f.urunAltGrubu, ","), strings.Join(f.renk, ","), strings.Join(f.renk2, ","), strings.Join(f.urunIcerigi, ","), strings.Join(f.fit, ","), strings.Join(f.drop, ","), strings.Join(f.beden, ","),
|
||||
)
|
||||
|
||||
rows, err := db.MssqlDB.QueryContext(
|
||||
ctx,
|
||||
queries.GetProductStockQueryByAttributes,
|
||||
kategori,
|
||||
urunAnaGrubu,
|
||||
urunAltGrubu,
|
||||
renk,
|
||||
renk2,
|
||||
urunIcerigi,
|
||||
fit,
|
||||
drop,
|
||||
beden,
|
||||
f.kategori,
|
||||
f.urunAnaGrubu,
|
||||
joinFilterValues(f.urunAltGrubu),
|
||||
joinFilterValues(f.renk),
|
||||
joinFilterValues(f.renk2),
|
||||
joinFilterValues(f.urunIcerigi),
|
||||
joinFilterValues(f.fit),
|
||||
joinFilterValues(f.drop),
|
||||
joinFilterValues(f.beden),
|
||||
)
|
||||
if err != nil {
|
||||
log.Printf("[PRODUCT-STOCK-BY-ATTRS] SQL hatasi: %v", err)
|
||||
|
||||
Reference in New Issue
Block a user