diff --git a/.env b/.env index 8fe69fd..bc636c1 100644 --- a/.env +++ b/.env @@ -25,6 +25,9 @@ AUTH_REFRESH_EXPIRATION=604800 MEILISEARCH_URL=http://localhost:7700 MEILISEARCH_API_KEY=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +# OpenAI +OPENAI_KEY=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 + # Google Translate Client GOOGLE_APPLICATION_CREDENTIALS=./google-cred.json GOOGLE_CLOUD_PROJECT_ID=translation-343517 @@ -33,6 +36,7 @@ GOOGLE_CLOUD_PROJECT_ID=translation-343517 OAUTH_GOOGLE_CLIENT_ID=331979954218-9vrpe08oqhhcgj6bvu6d4lds0dt630m9.apps.googleusercontent.com OAUTH_GOOGLE_CLIENT_SECRET=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 OAUTH_GOOGLE_REDIRECT_URL=http://localhost:3000/api/v1/public/auth/google/callback + # Email Configuration (SMTP) # Set EMAIL_ENABLED=true to require email verification EMAIL_ENABLED=true diff --git a/ADD_THIS_TO_SQL.sql b/ADD_THIS_TO_SQL.sql new file mode 100644 index 0000000..1ca5f9a --- /dev/null +++ b/ADD_THIS_TO_SQL.sql @@ -0,0 +1,2995 @@ +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 363) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 364) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 365) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 366) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 367) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 368) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 369) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 370) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 371) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ + + + +
' +WHERE (`ps_product_lang`.`id_product` = 373) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 374) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 375) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 383) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 384) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 385) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 386) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 387) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 388) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 389) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 390) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 391) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 392) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 393) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`=' +

+ + +
' +WHERE (`ps_product_lang`.`id_product` = 394) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 476) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 476) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 2); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 476) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 3); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 1435) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 1463) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 1464) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ + + + +
' +WHERE (`ps_product_lang`.`id_product` = 1484) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`=' + + +
' +WHERE (`ps_product_lang`.`id_product` = 1507) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ + + + +
' +WHERE (`ps_product_lang`.`id_product` = 1508) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1509) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1510) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1511) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1512) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1513) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ + + + +
' +WHERE (`ps_product_lang`.`id_product` = 1514) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1515) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ + + + +
' +WHERE (`ps_product_lang`.`id_product` = 1516) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1517) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1518) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ + + + +
' +WHERE (`ps_product_lang`.`id_product` = 1541) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ + + + +
' +WHERE (`ps_product_lang`.`id_product` = 1543) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1548) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1550) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1551) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

Zestaw powinien być poprawnie  zamontowany na odpowiedniej nawierzchni z zachowaniem właściwej strefy bezpieczeństwa.

+ +

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 1552) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 1825) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 2025) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

I. Czyszczenie i konserwacja

+

Tapicerkę należy czyścić powierzchniowo stosując dozwolone środki:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Rodzaj zabrudzenia

+
+

Dozwolone środki

+
+

Postępowanie

+
+

Codzienne zabrudzenia

+

 

+
+

Łagodny detergent najlepiej roztwór szarego mydła

+
+

Czyścić regularnie z użyciem gąbki lub miękkiej szczotki. Na koniec przetrzeć czyszczone miejsce wilgotną szmatką po czym wytrzeć do sucha (w celu usunięcia pozostałości detergentu).

+
+

Miejscowe, silniejsze zabrudzenia

+
+

25% roztwór alkoholu etylowego

+
+

Delikatnie przecierać nasączonym tamponem z gazy. Na koniec przetrzeć czyszczone miejsce wilgotną szmatką po czym wytrzeć do sucha (w celu usunięcia pozostałości detergentu).

+
+

Dezynfekcja

+
+

Ogólnodostępne środki do dezynfekcji zawierające:

+

- aktywny chlor – dichloroizocyjanuran sodu, max stężenie 10000 ppm 

+

- aktywny chlor - dwutlenek chloru w roztworze do 20 000 ppm 

+

- alkohol izopropylowy max stężenie 70 % 

+


+
+

Dezynfekować zgodnie z zaleceniami producenta używanego środka.

+
+

Przed użyciem środka innego niż łagodny detergent trzeba sprawdzić efekt w niewidocznym miejscu, a samo czyszczenie wykonać bardzo ostrożnie. + +

+
+


II. Informacje

+


+ + + + + + + + + + + + + + + + + + + + + + + +
+

Szamponować przy użyciu gąbki +

+
+

+   +

+
+

Nie prać!!! (delikatne wyroby)    +

+
+

+ +

+
+

Nie chlorować!!! (nie stosować do bielenia związków wydzielających wolny chlor) +

+
+

+   +

+
+

Nie prasować!!! (nie dopuszczać do kontaktu z nagrzanymi powierzchniami np. kaloryfer) +

+
+

+   +

+
+

Nie czyścić chemicznie!!! +

+
+


+

III. Warunki gwarancji

+

Gwarancji nie podlegają:

+' +WHERE (`ps_product_lang`.`id_product` = 2687) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='


+

I. Czyszczenie i konserwacja

+

Tapicerkę należy czyścić powierzchniowo stosując dozwolone środki:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Rodzaj zabrudzenia

+
+

Dozwolone środki

+
+

Postępowanie

+
+

Codzienne zabrudzenia

+

 

+
+

Łagodny detergent najlepiej roztwór szarego mydła

+
+

Czyścić regularnie z użyciem gąbki lub miękkiej szczotki. Na koniec przetrzeć czyszczone miejsce wilgotną szmatką po czym wytrzeć do sucha (w celu usunięcia pozostałości detergentu).

+
+

Miejscowe, silniejsze zabrudzenia

+
+

25% roztwór alkoholu etylowego

+
+

Delikatnie przecierać nasączonym tamponem z gazy. Na koniec przetrzeć czyszczone miejsce wilgotną szmatką po czym wytrzeć do sucha (w celu usunięcia pozostałości detergentu).

+
+

Dezynfekcja

+
+

Ogólnodostępne środki do dezynfekcji zawierające:

+

- aktywny chlor – dichloroizocyjanuran sodu, max stężenie 10000 ppm 

+

- aktywny chlor - dwutlenek chloru w roztworze do 20 000 ppm 

+

- alkohol izopropylowy max stężenie 70 % 

+


+
+

Dezynfekować zgodnie z zaleceniami producenta używanego środka.

+
+

Przed użyciem środka innego niż łagodny detergent trzeba sprawdzić efekt w niewidocznym miejscu, a samo czyszczenie wykonać bardzo ostrożnie. + +

+
+


II. Informacje

+


+ + + + + + + + + + + + + + + + + + + + + + + +
+

Szamponować przy użyciu gąbki +

+
+

+   +

+
+

Nie prać!!! (delikatne wyroby)    +

+
+

+ +

+
+

Nie chlorować!!! (nie stosować do bielenia związków wydzielających wolny chlor) +

+
+

+   +

+
+

Nie prasować!!! (nie dopuszczać do kontaktu z nagrzanymi powierzchniami np. kaloryfer) +

+
+

+   +

+
+

Nie czyścić chemicznie!!! +

+
+


+

III. Warunki gwarancji

+

Gwarancji nie podlegają:

+' +WHERE (`ps_product_lang`.`id_product` = 3424) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='


' +WHERE (`ps_product_lang`.`id_product` = 3441) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); + +UPDATE `ps_product_lang` +SET `usage`='

+ + + +
' +WHERE (`ps_product_lang`.`id_product` = 3842) AND (`ps_product_lang`.`id_shop` = 1) AND (`ps_product_lang`.`id_lang` = 1); diff --git a/app/delivery/web/api/restricted/listProducts.go b/app/delivery/web/api/restricted/listProducts.go index aeec22a..85317a6 100644 --- a/app/delivery/web/api/restricted/listProducts.go +++ b/app/delivery/web/api/restricted/listProducts.go @@ -1,8 +1,6 @@ package restricted import ( - "strconv" - "git.ma-al.com/goc_daniel/b2b/app/config" "git.ma-al.com/goc_daniel/b2b/app/service/listProductsService" "git.ma-al.com/goc_daniel/b2b/app/utils/i18n" @@ -52,13 +50,13 @@ func (h *ListProductsHandler) GetListing(c fiber.Ctx) error { // "override_currency": c.Query("override_currency", ""), // } - id_lang, err := strconv.Atoi(c.Cookies("lang_id", "2")) - if err != nil { + id_lang, ok := c.Locals("langID").(uint) + if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) } - listing, err := h.listProductsService.GetListing(uint(id_lang), paging, filters) + listing, err := h.listProductsService.GetListing(id_lang, paging, filters) if err != nil { return c.Status(responseErrors.GetErrorStatus(err)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) diff --git a/app/delivery/web/api/restricted/meiliSearch.go b/app/delivery/web/api/restricted/meiliSearch.go index b0b5aeb..8a41381 100644 --- a/app/delivery/web/api/restricted/meiliSearch.go +++ b/app/delivery/web/api/restricted/meiliSearch.go @@ -1,8 +1,6 @@ package restricted import ( - "strconv" - "git.ma-al.com/goc_daniel/b2b/app/service/meiliService" "git.ma-al.com/goc_daniel/b2b/app/utils/i18n" "git.ma-al.com/goc_daniel/b2b/app/utils/nullable" @@ -32,13 +30,13 @@ func MeiliSearchHandlerRoutes(r fiber.Router) fiber.Router { } func (h *MeiliSearchHandler) CreateIndex(c fiber.Ctx) error { - id_lang, err := strconv.Atoi(c.Cookies("lang_id", "2")) - if err != nil { + id_lang, ok := c.Locals("langID").(uint) + if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) } - err = h.meiliService.CreateIndex(uint(id_lang)) + err := h.meiliService.CreateIndex(id_lang) if err != nil { return c.Status(responseErrors.GetErrorStatus(err)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) @@ -49,13 +47,13 @@ func (h *MeiliSearchHandler) CreateIndex(c fiber.Ctx) error { } func (h *MeiliSearchHandler) Test(c fiber.Ctx) error { - id_lang, err := strconv.Atoi(c.Cookies("lang_id", "2")) - if err != nil { + id_lang, ok := c.Locals("langID").(uint) + if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) } - test, err := h.meiliService.Test(uint(id_lang)) + test, err := h.meiliService.Test(id_lang) if err != nil { return c.Status(responseErrors.GetErrorStatus(err)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) diff --git a/app/delivery/web/api/restricted/menu.go b/app/delivery/web/api/restricted/menu.go index d20cd45..04a4233 100644 --- a/app/delivery/web/api/restricted/menu.go +++ b/app/delivery/web/api/restricted/menu.go @@ -1,8 +1,6 @@ package restricted import ( - "strconv" - "git.ma-al.com/goc_daniel/b2b/app/service/menuService" "git.ma-al.com/goc_daniel/b2b/app/utils/i18n" "git.ma-al.com/goc_daniel/b2b/app/utils/nullable" @@ -31,13 +29,13 @@ func MenuHandlerRoutes(r fiber.Router) fiber.Router { } func (h *MenuHandler) GetMenu(c fiber.Ctx) error { - id_lang, err := strconv.Atoi(c.Cookies("lang_id", "2")) - if err != nil { + id_lang, ok := c.Locals("langID").(uint) + if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) } - menu, err := h.menuService.GetMenu(uint(id_lang)) + menu, err := h.menuService.GetMenu(id_lang) if err != nil { return c.Status(responseErrors.GetErrorStatus(err)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) diff --git a/app/model/product.go b/app/model/product.go index eb63f68..3c8faae 100644 --- a/app/model/product.go +++ b/app/model/product.go @@ -82,18 +82,27 @@ type ProductFilters struct { } type ScannedCategory struct { - CategoryID uint `gorm:"column:ID;primaryKey"` - Name string `gorm:"column:name"` - Active uint `gorm:"column:active"` - Position uint `gorm:"column:position"` - ParentID uint `gorm:"column:id_parent"` - IsRoot uint `gorm:"column:is_root_category"` + CategoryID uint `gorm:"column:ID;primaryKey"` + Name string `gorm:"column:name"` + Active uint `gorm:"column:active"` + Position uint `gorm:"column:position"` + ParentID uint `gorm:"column:id_parent"` + IsRoot uint `gorm:"column:is_root_category"` + LinkRewrite string `gorm:"column:link_rewrite"` + IsoCode string `gorm:"column:iso_code"` } type Category struct { - CategoryID uint `json:"category_id" form:"category_id"` - Name string `json:"name" form:"name"` - Active uint `json:"active" form:"active"` - Subcategories []Category `json:"subcategories" form:"subcategories"` + CategoryID uint `json:"category_id" form:"category_id"` + Label string `json:"label" form:"label"` + // Active bool `json:"active" form:"active"` + Params CategpryParams `json:"params" form:"params"` + Children []Category `json:"children" form:"children"` +} + +type CategpryParams struct { + CategoryID uint `json:"category_id" form:"category_id"` + LinkRewrite string `json:"link_rewrite" form:"link_rewrite"` + Locale string `json:"locale" form:"locale"` } type FeatVal = map[uint][]uint diff --git a/app/model/productDescription.go b/app/model/productDescription.go index e03bbc1..d7c0e2e 100644 --- a/app/model/productDescription.go +++ b/app/model/productDescription.go @@ -19,10 +19,26 @@ type ProductDescription struct { Usage string `gorm:"column:usage;type:text" json:"usage" form:"usage"` } -type MeiliSearchProduct struct { - ProductID uint - Name string - Description string - DescriptionShort string - Usage string +type ProductRow struct { + IDProduct int `gorm:"column:id_product"` + IDShop int `gorm:"column:id_shop"` + Name string `gorm:"column:name"` + Active uint8 `gorm:"column:active"` + Reference string `gorm:"column:reference"` +} + +type MeiliSearchProduct struct { + ProductID uint `gorm:"column:id_product"` + Name string `gorm:"column:name"` + Active uint8 `gorm:"column:active"` + Price float64 `gorm:"column:price"` + Description string `gorm:"column:description"` + DescriptionShort string `gorm:"column:description_short"` + Usage string `gorm:"column:usage"` + EAN13 string `gorm:"column:ean13"` + Reference string `gorm:"column:reference"` + Width float64 `gorm:"column:width"` + Height float64 `gorm:"column:height"` + Depth float64 `gorm:"column:depth"` + Weight float64 `gorm:"column:weight"` } diff --git a/app/repos/categoriesRepo/categoriesRepo.go b/app/repos/categoriesRepo/categoriesRepo.go index 1713441..1556f59 100644 --- a/app/repos/categoriesRepo/categoriesRepo.go +++ b/app/repos/categoriesRepo/categoriesRepo.go @@ -26,15 +26,14 @@ func (repo *CategoriesRepo) GetAllCategories(id_lang uint) ([]model.ScannedCateg ps_category.active AS active, ps_category_shop.position AS position, ps_category.id_parent AS id_parent, - ps_category.is_root_category AS is_root_category + ps_category.is_root_category AS is_root_category, + ps_category_lang.link_rewrite AS link_rewrite, + ps_lang.iso_code AS iso_code FROM ps_category - LEFT JOIN ps_category_lang - ON ps_category_lang.id_category = ps_category.id_category - AND ps_category_lang.id_shop = ? - AND ps_category_lang.id_lang = ? - LEFT JOIN ps_category_shop - ON ps_category_shop.id_category = ps_category.id_category - AND ps_category_shop.id_shop = ?`, + LEFT JOIN ps_category_lang ON ps_category_lang.id_category = ps_category.id_category AND ps_category_lang.id_shop = ? AND ps_category_lang.id_lang = ? + LEFT JOIN ps_category_shop ON ps_category_shop.id_category = ps_category.id_category AND ps_category_shop.id_shop = ? + JOIN ps_lang ON ps_lang.id_lang = ps_category_lang.id_lang + `, constdata.SHOP_ID, id_lang, constdata.SHOP_ID). Scan(&allCategories).Error diff --git a/app/repos/productDescriptionRepo/productDescriptionRepo.go b/app/repos/productDescriptionRepo/productDescriptionRepo.go index ce4ad1b..fece6b8 100644 --- a/app/repos/productDescriptionRepo/productDescriptionRepo.go +++ b/app/repos/productDescriptionRepo/productDescriptionRepo.go @@ -12,6 +12,7 @@ type UIProductDescriptionRepo interface { GetProductDescription(productID uint, productLangID uint) (*model.ProductDescription, error) CreateIfDoesNotExist(productID uint, productLangID uint) error UpdateFields(productID uint, productLangID uint, updates map[string]string) error + GetMeiliProducts(id_lang uint) ([]model.MeiliSearchProduct, error) } type ProductDescriptionRepo struct{} @@ -73,3 +74,35 @@ func (r *ProductDescriptionRepo) UpdateFields(productID uint, productLangID uint return nil } + +// We assume that any user has access to all product descriptions +func (r *ProductDescriptionRepo) GetMeiliProducts(id_lang uint) ([]model.MeiliSearchProduct, error) { + var products []model.MeiliSearchProduct + + err := db.DB. + Select("pl.`usage` AS `usage`"). + Select(` + ps.id_product AS id_product, + pl.name AS name, + ps.active AS active, + ps.price AS price, + pl.description AS description, + pl.description_short AS description_short, + p.ean13 AS ean13, + p.reference AS reference, + p.width AS width, + p.height AS height, + p.depth AS depth, + p.weight AS weight + `). + Table("ps_product_shop AS ps"). + Joins("LEFT JOIN ps_product_lang AS pl ON ps.id_product = pl.id_product AND pl.id_shop = ? AND pl.id_lang = ?", constdata.SHOP_ID, id_lang). + Joins("LEFT JOIN ps_product AS p ON p.id_product = ps.id_product"). + Where("ps.id_shop = ?", constdata.SHOP_ID). + Scan(&products).Error + if err != nil { + return products, fmt.Errorf("database error: %w", err) + } + + return products, nil +} diff --git a/app/service/meiliService/blank.json b/app/service/meiliService/blank.json new file mode 100644 index 0000000..22446a1 --- /dev/null +++ b/app/service/meiliService/blank.json @@ -0,0 +1,8 @@ +{ + "products-openai": { + "source": "openAi", + "model": "text-embedding-3-small", + "apiKey": "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", + "documentTemplate": "{{doc.Name}} is equipment used for {{doc.Description | truncatewords: 20}}" + } +} \ No newline at end of file diff --git a/app/service/meiliService/meiliService.go b/app/service/meiliService/meiliService.go index 24cc106..196d38a 100644 --- a/app/service/meiliService/meiliService.go +++ b/app/service/meiliService/meiliService.go @@ -9,14 +9,14 @@ import ( "strings" "time" - "git.ma-al.com/goc_daniel/b2b/app/db" - "git.ma-al.com/goc_daniel/b2b/app/model" + "git.ma-al.com/goc_daniel/b2b/app/repos/productDescriptionRepo" constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data" "github.com/meilisearch/meilisearch-go" ) type MeiliService struct { - meiliClient meilisearch.ServiceManager + productDescriptionRepo productDescriptionRepo.UIProductDescriptionRepo + meiliClient meilisearch.ServiceManager } func New() *MeiliService { @@ -29,43 +29,52 @@ func New() *MeiliService { ) return &MeiliService{ - meiliClient: client, + meiliClient: client, + productDescriptionRepo: productDescriptionRepo.New(), } } // ==================================== FOR SUPERADMIN ONLY ==================================== func (s *MeiliService) CreateIndex(id_lang uint) error { - var products []model.ProductDescription + products, err := s.productDescriptionRepo.GetMeiliProducts(id_lang) - err := db.DB. - Table("ps_product_lang"). - Where("id_shop = ? AND id_lang = ?", constdata.SHOP_ID, id_lang). - Scan(&products).Error - if err != nil { - return fmt.Errorf("database error: %w", err) - } - - var meiliProducts []model.MeiliSearchProduct for i := 0; i < len(products); i++ { - var nextMeiliProduct model.MeiliSearchProduct + products[i].Description, err = cleanHTML(products[i].Description) + if err != nil { + fmt.Printf("products[i].Description: %v\n", products[i].Description) + fmt.Printf("products[i].ProductID: %v\n", products[i].ProductID) + fmt.Println("failed at description") + fmt.Printf("err: %v\n", err) + return err + } - nextMeiliProduct.ProductID = products[i].ProductID - nextMeiliProduct.Name = products[i].Name - nextMeiliProduct.Description = cleanHTML(products[i].Description) - nextMeiliProduct.DescriptionShort = cleanHTML(products[i].DescriptionShort) - nextMeiliProduct.Usage = cleanHTML(products[i].Usage) + products[i].DescriptionShort, err = cleanHTML(products[i].DescriptionShort) + if err != nil { + fmt.Printf("products[i].DescriptionShort: %v\n", products[i].DescriptionShort) + fmt.Printf("products[i].ProductID: %v\n", products[i].ProductID) + fmt.Println("failed at description short") + fmt.Printf("err: %v\n", err) + return err + } - meiliProducts = append(meiliProducts, nextMeiliProduct) + products[i].Usage, err = cleanHTML(products[i].Usage) + if err != nil { + fmt.Printf("products[i].Usage: %v\n", products[i].Usage) + fmt.Printf("products[i].ProductID: %v\n", products[i].ProductID) + fmt.Println("failed at usage") + fmt.Printf("err: %v\n", err) + return err + } } indexName := "meili_products_shop" + strconv.FormatInt(constdata.SHOP_ID, 10) + "_lang" + strconv.FormatInt(int64(id_lang), 10) - primaryKey := "product_id" + primaryKey := "ProductID" docOptions := &meilisearch.DocumentOptions{ PrimaryKey: &primaryKey, SkipCreation: false, } - task, err := s.meiliClient.Index(indexName).AddDocuments(meiliProducts, docOptions) + task, err := s.meiliClient.Index(indexName).AddDocuments(products, docOptions) if err != nil { return fmt.Errorf("meili AddDocuments error: %w", err) } @@ -123,7 +132,7 @@ func (s *MeiliService) HealthCheck() (*meilisearch.Health, error) { } // remove all tags from HTML text -func cleanHTML(s string) string { +func cleanHTML(s string) (string, error) { r := strings.NewReader(s) d := xml.NewDecoder(r) @@ -137,19 +146,25 @@ func cleanHTML(s string) string { token, err := d.Token() if err == io.EOF { break + } else if err != nil { + return text, err } switch v := token.(type) { case xml.StartElement: - text += "\n" + if len(text) > 0 && text[len(text)-1] != '\n' { + text += " \n " + } case xml.EndElement: case xml.CharData: - text += string(v) + if strings.TrimSpace(string(v)) != "" { + text += string(v) + } case xml.Comment: case xml.ProcInst: case xml.Directive: } } - return text + return text, nil } diff --git a/app/service/menuService/menuService.go b/app/service/menuService/menuService.go index 13a6a89..1244075 100644 --- a/app/service/menuService/menuService.go +++ b/app/service/menuService/menuService.go @@ -64,7 +64,7 @@ func (s *MenuService) createTree(index int, all_categories *([]model.ScannedCate node := s.scannedToNormalCategory((*all_categories)[index]) for i := 0; i < len((*children_indices)[index]); i++ { - node.Subcategories = append(node.Subcategories, s.createTree((*children_indices)[index][i].Index, all_categories, children_indices)) + node.Children = append(node.Children, s.createTree((*children_indices)[index][i].Index, all_categories, children_indices)) } return node @@ -72,10 +72,12 @@ func (s *MenuService) createTree(index int, all_categories *([]model.ScannedCate func (s *MenuService) scannedToNormalCategory(scanned model.ScannedCategory) model.Category { var normal model.Category - normal.Active = scanned.Active + // normal.Active = scanned.Active normal.CategoryID = scanned.CategoryID - normal.Name = scanned.Name - normal.Subcategories = []model.Category{} + normal.Label = scanned.Name + // normal.Active = scanned.Active == 1 + normal.Params = model.CategpryParams{CategoryID: normal.CategoryID, LinkRewrite: scanned.LinkRewrite, Locale: scanned.IsoCode} + normal.Children = []model.Category{} return normal } diff --git a/app/service/productDescriptionService/productDescriptionService.go b/app/service/productDescriptionService/productDescriptionService.go index df137ff..940ea41 100644 --- a/app/service/productDescriptionService/productDescriptionService.go +++ b/app/service/productDescriptionService/productDescriptionService.go @@ -70,7 +70,7 @@ func New() *ProductDescriptionService { log.Fatalf("productDescriptionService: cannot create Translation client: %v", err) } - openAIClient := openai.NewClient(option.WithAPIKey("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"), + openAIClient := openai.NewClient(option.WithAPIKey(os.Getenv("OPENAI_KEY")), option.WithHTTPClient(&http.Client{Timeout: 300 * time.Second})) // five minutes timeout return &ProductDescriptionService{ diff --git a/bo/components.d.ts b/bo/components.d.ts index fe0bbce..d63c5d2 100644 --- a/bo/components.d.ts +++ b/bo/components.d.ts @@ -47,6 +47,7 @@ declare module 'vue' { UInput: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/Input.vue')['default'] UInputNumber: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/InputNumber.vue')['default'] UModal: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/Modal.vue')['default'] + UNavigationMenu: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/NavigationMenu.vue')['default'] UPagination: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/Pagination.vue')['default'] USelect: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/Select.vue')['default'] USelectMenu: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/SelectMenu.vue')['default'] diff --git a/bo/src/layouts/default.vue b/bo/src/layouts/default.vue index d6dfd13..377dade 100644 --- a/bo/src/layouts/default.vue +++ b/bo/src/layouts/default.vue @@ -1,12 +1,55 @@ diff --git a/bo/src/layouts/empty.vue b/bo/src/layouts/empty.vue index e8cfec0..e665e66 100644 --- a/bo/src/layouts/empty.vue +++ b/bo/src/layouts/empty.vue @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/bo/src/views/LoginView.vue b/bo/src/views/LoginView.vue index caf8cf8..eeceb93 100644 --- a/bo/src/views/LoginView.vue +++ b/bo/src/views/LoginView.vue @@ -4,8 +4,8 @@ import { useRouter, useRoute } from 'vue-router' import { useAuthStore } from '@/stores/auth' import { useValidation } from '@/composable/useValidation' import type { FormError } from '@nuxt/ui' -import { useI18n } from 'vue-i18n' import { i18n } from '@/plugins/02_i18n' +import Empty from '@/layouts/empty.vue' const router = useRouter() const route = useRoute() @@ -52,9 +52,11 @@ const PrivacyComponent = computed(() => import(`@/components/terms/${i18n.locale.value}_PrivacyPolicyView.vue`).catch(() => import('@/components/terms/en_PrivacyPolicyView.vue')), ), ) +