fix products listing

This commit is contained in:
2026-03-27 23:17:21 +01:00
parent ec05101037
commit 9ec329b1d6
429 changed files with 9816 additions and 3774 deletions

View File

@@ -0,0 +1,233 @@
package searchservice
import (
"encoding/json"
"fmt"
"strconv"
"strings"
attributerepo "git.ma-al.com/goc_daniel/b2b/app/repos/attributeRepo"
categoryrepo "git.ma-al.com/goc_daniel/b2b/app/repos/categoryRepo"
featurerepo "git.ma-al.com/goc_daniel/b2b/app/repos/featureRepo"
searchrepo "git.ma-al.com/goc_daniel/b2b/app/repos/searchRepo"
)
type SearchService struct {
searchRepo searchrepo.UISearchRepo
attributeRepo attributerepo.UIAttributeRepo
featureRepo featurerepo.UIFeatureRepo
categoryRepo categoryrepo.UICategoryRepo
}
func New() *SearchService {
return &SearchService{
searchRepo: searchrepo.New(),
attributeRepo: attributerepo.New(),
featureRepo: featurerepo.New(),
categoryRepo: categoryrepo.New(),
}
}
func (s *SearchService) Search(index string, body []byte, idLang uint) (*searchrepo.SearchProxyResponse, error) {
resp, err := s.searchRepo.Search(index, body)
if err != nil {
return nil, err
}
if resp.StatusCode == 200 {
var data map[string]interface{}
if err := json.Unmarshal(resp.Body, &data); err == nil {
data = s.filterEmptyFacets(data)
data = s.enrichFacetTranslations(data, idLang)
resp.Body, _ = json.Marshal(data)
}
}
return resp, nil
}
func (s *SearchService) GetIndexSettings(index string) (*searchrepo.SearchProxyResponse, error) {
return s.searchRepo.GetIndexSettings(index)
}
func (s *SearchService) IsIndexNotFound(body []byte) bool {
var resp map[string]interface{}
if err := json.Unmarshal(body, &resp); err != nil {
return false
}
if code, ok := resp["code"].(string); ok {
return code == "index_not_found"
}
return false
}
func (s *SearchService) filterEmptyFacets(data map[string]interface{}) map[string]interface{} {
if facets, ok := data["facetDistribution"].(map[string]interface{}); ok {
filtered := make(map[string]interface{})
for k, v := range facets {
if m, ok := v.(map[string]interface{}); ok && len(m) > 0 {
filtered[k] = v
}
}
data["facetDistribution"] = filtered
}
return data
}
func (s *SearchService) enrichFacetTranslations(data map[string]interface{}, idLang uint) map[string]interface{} {
facets, ok := data["facetDistribution"].(map[string]interface{})
if !ok {
return data
}
groupIDs := []uint{}
attrIDs := []uint{}
featureIDs := []uint{}
featureValueIDs := []uint{}
categoryIDs := []uint{}
for key, values := range facets {
valueMap, ok := values.(map[string]interface{})
if !ok {
continue
}
if strings.HasPrefix(key, "attr.") {
groupIDStr := strings.TrimPrefix(key, "attr.")
groupID, err := strconv.ParseUint(groupIDStr, 10, 64)
if err != nil {
continue
}
groupIDs = append(groupIDs, uint(groupID))
for attrKey := range valueMap {
attrID, err := strconv.ParseUint(attrKey, 10, 64)
if err != nil {
continue
}
attrIDs = append(attrIDs, uint(attrID))
}
}
if strings.HasPrefix(key, "feat.") {
featureIDStr := strings.TrimPrefix(key, "feat.")
featureID, err := strconv.ParseUint(featureIDStr, 10, 64)
if err != nil {
continue
}
featureIDs = append(featureIDs, uint(featureID))
for valueKey := range valueMap {
valueID, err := strconv.ParseUint(valueKey, 10, 64)
if err != nil {
continue
}
featureValueIDs = append(featureValueIDs, uint(valueID))
}
}
if key == "category_ids" {
for catKey := range valueMap {
catID, err := strconv.ParseUint(catKey, 10, 64)
if err != nil {
continue
}
categoryIDs = append(categoryIDs, uint(catID))
}
}
}
attributeGroups, _ := s.attributeRepo.GetAttributeGroupsWithAttributes(groupIDs, attrIDs, idLang)
featureGroups, _ := s.featureRepo.GetFeaturesWithValues(featureIDs, featureValueIDs, idLang)
categoryTranslations, _ := s.categoryRepo.GetCategoryTranslations(categoryIDs, idLang)
translations := make(map[string]interface{})
for _, groupID := range groupIDs {
key := fmt.Sprintf("attr.%d", groupID)
group, ok := attributeGroups[groupID]
if !ok {
group = attributerepo.AttributeGroupWithAttrs{
GroupName: key,
Attrs: make(map[uint]attributerepo.AttributeWithColor),
}
}
valueTranslations := make(map[string]interface{})
for attrID, attr := range group.Attrs {
attrName := attr.Name
if attrName == "" {
attrName = strconv.FormatUint(uint64(attrID), 10)
}
entry := map[string]string{"t": attrName}
if attr.Color != "" {
entry["c"] = attr.Color
}
valueTranslations[strconv.FormatUint(uint64(attrID), 10)] = entry
}
groupName := group.GroupName
if groupName == "" {
groupName = key
}
translations[key] = map[string]interface{}{
"groupName": groupName,
"values": valueTranslations,
}
}
for _, featureID := range featureIDs {
key := fmt.Sprintf("feat.%d", featureID)
feature, ok := featureGroups[featureID]
if !ok {
feature = featurerepo.FeatureGroupWithValues{
FeatureName: key,
Values: make(map[uint]string),
}
}
valueTranslations := make(map[string]interface{})
for valueID, valueName := range feature.Values {
if valueName == "" {
valueName = strconv.FormatUint(uint64(valueID), 10)
}
valueTranslations[strconv.FormatUint(uint64(valueID), 10)] = map[string]string{
"t": valueName,
}
}
featureName := feature.FeatureName
if featureName == "" {
featureName = key
}
translations[key] = map[string]interface{}{
"groupName": featureName,
"values": valueTranslations,
}
}
categoryValueTranslations := make(map[string]interface{})
for _, catID := range categoryIDs {
catName := categoryTranslations[catID]
if catName == "" {
catName = strconv.FormatUint(uint64(catID), 10)
}
categoryValueTranslations[strconv.FormatUint(uint64(catID), 10)] = map[string]string{
"t": catName,
}
}
if len(categoryValueTranslations) > 0 {
translations["category_ids"] = map[string]interface{}{
"groupName": "category_ids",
"values": categoryValueTranslations,
}
}
data["facetTranslations"] = translations
return data
}