diff --git a/controllers/ImportController.go b/controllers/ImportController.go index f6f0809..74805ca 100644 --- a/controllers/ImportController.go +++ b/controllers/ImportController.go @@ -1065,36 +1065,3 @@ func UpdateProduct(product models.Product, db *gorm.DB, productFlat gm.ProductFl return errFlat } - -//func productAttributesAndFlat(data *models.Product) ([]gm.ProductAttributeValue,gm.ProductFlat){ -// -// var description string -// -// for _, desc := range data.Descriptions { -// description += "

" + desc.Description + "

" -// } -// -// weight, _ := strconv.ParseFloat(data.Weight, 64) -// -// flat := gm.ProductFlat{ -// Status: true, -// VisibleIndividually: true, -// Name: data.Name, -// Sku: data.ProductGroupID, -// ProductNumber: data.ProductNumber, -// Description: description, -// UrlKey: data.ProductGroupID, -// Weight: weight, -// FavoritesCount: uint(data.FavoriteCount), -// } -// return []gm.ProductAttributeValue{ -// {AttributeID: AttributesMap["favoritesCount"].ID, IntegerValue: data.FavoriteCount}, -// {AttributeID: AttributesMap["source"].ID, TextValue: data.URLKey}, -// {AttributeID: AttributesMap["product_number"].ID, TextValue: data.ProductNumber}, -// {AttributeID: AttributesMap["name"].ID, TextValue: data.Name, Channel: "default", Locale: "tm"}, -// {AttributeID: AttributesMap["weight"].ID, TextValue: data.Weight}, -// {AttributeID: AttributesMap["status"].ID, BooleanValue: true}, -// {AttributeID: AttributesMap["visible_individually"].ID, BooleanValue: true}, -// {AttributeID: AttributesMap["description"].ID, TextValue: description, Channel: "default", Locale: "tm"}, -// },flat -//} diff --git a/controllers/ParseController.go b/controllers/ParseController.go index fbcbe40..4bce7c8 100644 --- a/controllers/ParseController.go +++ b/controllers/ParseController.go @@ -1,16 +1,11 @@ package controller import ( - gm "db_service/gorm_models" helper "db_service/pkg" "db_service/repositories" "encoding/json" - "errors" - "gorm.io/driver/mysql" - "gorm.io/gorm" "log" "net/http" - "os" "strconv" "time" ) @@ -41,60 +36,28 @@ func ParseLink(w http.ResponseWriter, route *http.Request) { helper.Error(err) return } - - baza, err := gorm.Open(mysql.Open(os.Getenv("database_url")), &gorm.Config{}) + ///////////////////////////// + importRepo, err := repositories.ImporterInstance() if err != nil { - helper.Error(err) + http.Error(w, err.Error(), http.StatusInternalServerError) return } + //wait until initialization data is loaded to memory + importRepo.ImportWGroup.Wait() - var productFlat gm.ProductFlat - - err = baza.Preload("Variants"). - //Preload("Product"). - //Preload("Proudct.AttributeValues","attribute_id in(11,13)"). - First(&productFlat, "sku = ?", jsonProduct.ProductGroupID).Error - - if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { - helper.Error(err) - - if len(AttributesMap) == 0 { - var attributes, err = gm.GetAttributes(baza) - - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - for _, atrattribute := range attributes { - AttributesMap[atrattribute.Code] = atrattribute - } - } - - err = ImportProduct(jsonProduct, baza) - } else if err == nil { - err = UpdateProduct(jsonProduct, baza, productFlat) - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(map[string]string{ - "msg": "Link parsed successfully", - "productGroupId": strconv.Itoa(product.ProductGroupID), - }) - elapsed := time.Since(start) - log.Printf("end parse took %s", elapsed) + if err = importRepo.UpdateOrCreate(jsonProduct).Error; err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) return } - - if err != nil { - helper.Error(err) - return - } - elapsed := time.Since(start) - log.Printf("end parse took %s", elapsed) w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(map[string]string{ "msg": "Link parsed successfully", "productGroupId": strconv.Itoa(product.ProductGroupID), }) + elapsed := time.Since(start) + log.Printf("end parse took %s", elapsed) + return + ///////////////////////////////////////// } diff --git a/repositories/ImportRepository.go b/repositories/ImportRepository.go index f60b1a9..2fe7b57 100644 --- a/repositories/ImportRepository.go +++ b/repositories/ImportRepository.go @@ -394,3 +394,90 @@ func (importer *Importer) GetSexOption(optionName string) gm.AttributeOption { importer.SexMutex.Unlock() return option } + +func (importer *Importer) updateVariant(product models.Product) (*gm.Product, error) { + + //if len(*product.SizeVariants) > 0{ + // for _, sizeVariant := range *product.SizeVariants { + // + // if !sizeVariant.Sellable{ + // importer.baza.Model(&gm.ProductFlat{}). + // Where("sku like ? AND size_label = ?", product.ProductNumber+"-%",sizeVariant.AttributeValue). + // Update("status",false) + // }else { + // //todo update price + // //todo insert if not exists + // + // } + // } + //}else { + // var flat gm.ProductFlat + // err := importer.baza.Preload("Product").First(&flat,"sku = ?", product.ProductNumber).Error + // + //} + var flat gm.ProductFlat + err := importer.baza.Preload("Product", "Variants").First(&flat, "sku = ?", product.ProductNumber).Error + if err != nil { + return nil, err + } + + if flat.Product.Type == "configurable" { + + } else { + + } + return nil, nil +} + +func (importer *Importer) UpdateOrCreate(product models.Product) (instance *Importer) { + + firstProduct, err := importer.importVariant(product) + var newProducts []gm.Product + if err != nil { + helper.Error(err) + + firstProduct, importer.Error = importer.updateVariant(product) + + if importer.Error != nil { + return importer + } + } else { + newProducts[0] = *firstProduct + } + + if product.ColorVariants != nil && len(*product.ColorVariants) > 0 { + linkedProducts := []gm.Product{*firstProduct} + + for _, colorVariant := range *product.ColorVariants { + + var ( + variant *gm.Product + err error + ) + if !colorVariant.IsSellable { + + if err = importer.baza.Model(&gm.ProductFlat{}).Where("sku=?", colorVariant.ProductNumber).Update("status", false).Error; err != nil { + log.Println(err) + } + continue + + } else if variant, err = importer.importVariant(colorVariant); err != nil { + + if variant, importer.Error = importer.updateVariant(colorVariant); importer.Error != nil { + return importer + } + + linkedProducts = append(linkedProducts, *variant) + + } + + newProducts = append(newProducts, *variant) + } + + if len(newProducts) > 0 { + //todo relation + } + + } + return importer +}