diff --git a/api/openapi.yaml b/api/openapi.yaml index 0159d5ee82f44caf0bfa852a43a0908f5399dc33..a11befff1ca3405698be8e33ade32d240e611f99 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -178,6 +178,9 @@ paths: type: number format: double description: Минимальная цена товара. + photo_url: + type: string + description: Ссылка на фото товара. '400': description: Неверный запрос diff --git a/internal/domain/parsed_product.go b/internal/domain/parsed_product.go index d36ab2e829b51370f4247a246627dd14ed3b8b82..a7de59ea128f92c7e88d83172e5e8dbde2413ba0 100644 --- a/internal/domain/parsed_product.go +++ b/internal/domain/parsed_product.go @@ -7,5 +7,5 @@ type ParsedProduct struct { Price float64 `json:"price"` ProductURL string `json:"product_url"` MarketName string `json:"market_name,omitempty"` - PhotoUrl []string `json:"photo_urls,omitempty"` + PhotoUrls []string `json:"photo_urls,omitempty"` } diff --git a/internal/productassistant/server.go b/internal/productassistant/server.go index 06143e9c43301071fa1d776cd85bbf81dcd7cdf8..37128badb7ba4baaa71a698de5829354277d6bce 100644 --- a/internal/productassistant/server.go +++ b/internal/productassistant/server.go @@ -294,7 +294,7 @@ func (s *Server) GetGetParsedProducts(ctx context.Context, req GetGetParsedProdu Price: &pp.Price, ProductUrl: helper.PtrFromString(pp.ProductURL), Market: helper.PtrFromString(pp.MarketName), - PhotoUrl: &pp.PhotoUrl, + PhotoUrl: &pp.PhotoUrls, }) } @@ -323,7 +323,9 @@ func (s *Server) PostLlmRequest(ctx context.Context, req PostLlmRequestRequestOb Content *map[string]interface{} `json:"content,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` Id *string `json:"id,omitempty"` + MinPrice *float64 `json:"min_price,omitempty"` Name *string `json:"name,omitempty"` + PhotoUrl *string `json:"photo_url,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` } for _, p := range products { @@ -331,11 +333,19 @@ func (s *Server) PostLlmRequest(ctx context.Context, req PostLlmRequestRequestOb if err := json.Unmarshal([]byte(p.Content), &cnt); err != nil { cnt = make(map[string]interface{}) } + parsedProducts, _ := s.ProductService.GetParsedProductsByAbstractID(ctx, p.ID) + minPrice := parsedProducts[0].Price + firstPhoto := parsedProducts[0].PhotoUrls[0] + for _, pp := range parsedProducts { + minPrice = min(minPrice, pp.Price) + } details = append(details, struct { Content *map[string]interface{} `json:"content,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` Id *string `json:"id,omitempty"` + MinPrice *float64 `json:"min_price,omitempty"` Name *string `json:"name,omitempty"` + PhotoUrl *string `json:"photo_url,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` }{ Id: &p.ID, @@ -343,6 +353,8 @@ func (s *Server) PostLlmRequest(ctx context.Context, req PostLlmRequestRequestOb Content: &cnt, CreatedAt: &p.CreatedAt, UpdatedAt: &p.UpdatedAt, + MinPrice: &minPrice, + PhotoUrl: &firstPhoto, }) } return PostLlmRequest200JSONResponse{ diff --git a/internal/productassistant/server_gen.go b/internal/productassistant/server_gen.go index 5c352dfffd2e6431b596cf255dfc4e8e8f2e247a..6d7775ccad23a53408aa395f07c0e40f92289cd6 100644 --- a/internal/productassistant/server_gen.go +++ b/internal/productassistant/server_gen.go @@ -736,7 +736,7 @@ type GetGetParsedProducts200JSONResponse struct { Id *string `json:"id,omitempty"` Market *string `json:"market,omitempty"` - // PhotoUrl Список фоток. + // PhotoUrls Список фоток. PhotoUrl *[]string `json:"photo_url,omitempty"` Price *float64 `json:"price,omitempty"` ProductUrl *string `json:"product_url,omitempty"` @@ -781,9 +781,15 @@ type PostLlmRequest200JSONResponse struct { // Id UUID абстрактного товара. Id *string `json:"id,omitempty"` + // MinPrice Минимальная цена товара. + MinPrice *float64 `json:"min_price,omitempty"` + // Name Наименование товара. Name *string `json:"name,omitempty"` + // PhotoUrls Ссылка на фото товара. + PhotoUrl *string `json:"photo_url,omitempty"` + // UpdatedAt Дата последнего обновления товара. UpdatedAt *time.Time `json:"updated_at,omitempty"` } `json:"products,omitempty"` @@ -1154,33 +1160,34 @@ func (sh *strictHandler) PostPriceChange(w http.ResponseWriter, r *http.Request) // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+xZX2sbRxD/Ksc9JSDL7r8Xv7k1DSpuatrmKQRz1q2tS3R/crtKMcFgSWkScKjbEmgp", - "NGkIfT/JEj7L0ekrzH6jMrt30ur+yFIipyn0ydbd7szszG9+Mzv3ULecPVdff6gzi9WJvq5v+67ZqDJt", - "g1KLMsNh2sZ2RS/pD4hPLdfR1/WPymv6YUl3PeIYnqWv65+U18prekn3DFajKGvVaLDaKiN1su8bNj7x", - "XMrwr+sR32CW61RM1OVSttFgte+TlSXdJ/cbhLLPXfMA11ddhxFHbDU8r25VxebVuxQteajTao3YhlDg", - "o2hmEWEA6t8xDUbEyQ48PJjlMLJPfDR9z/Ip23EMW31PmW85+/i6ZtBa7gvLzJdXN2aJ82ouc3cafj33", - "bYMSv2DroXSH5RNTX7+N2qdMLynHjI2+U0pkuLt3SZXph9NCmN8g4gH1XIdKX328tvYOnrYJpcZ+/sGZ", - "e484+efKsdIktOpbHpMgg9e8CSPo86cwhICfaBBAl7cg4kcQwhkE/DGE/ATVfCoPkNr/gj+FEDowgCB3", - "L4TCENqwbcM/wB0/5ynQ+BPo8yPow5k2hiluXN0zHrgN32KErhqmORvkX47Xbpjm0lDuyVTdmYJlAXiU", - "tR8SSOaCwkt+BBH0eBsGvKVBDyLoYEjhAvow1KCriYh1+BEEMIQhRNAvBsaf0IeuiOmQH8O5hrGGEarg", - "zTQkno9VhbzFn2ly3cSUfM0pdJikTiQTTf6bhsimeD4BifwtGNU3bMKIT/X12+mTVDZT9iDSe3CBoG1D", - "DwLpH4FiNDNr6ylEekm3UNj9BvEP9JIuqUiFSxoaJSXM6Wje+XBhk7iE/4KQKXRHCgCvYz/mh3+mFBUC", - "+0QcPv4zHfwbRKGHG4S9Rdg/5CDGRmRfKPJSsUwV2klBmV1ihVSLEZvmVyP5wPB940Ds8a0qmd6Tgp/h", - "3yMsXx/uVd44DXtXtgL5ZT6L17Q9OYieB+PPJez4MfRzkZiFylJ48SVEcMHb/EmSGFOq5fYpxZmMqFt0", - "zpTYwpVLheTEjBnR/x+es+E5B4CzcH0FIwh5EyIYZDDDf0yDNYLu1cBVtJYL2oH43SdsxdilzDeqbEUh", - "tiIQ3yBsI14eX6vmIfcAOrzJW8IiVJ+ksrQEAnyhXbt1q7J5vYD4/3uEX/WJwYi5Y4jXe65v43863m1W", - "mCUuO7NvY3NkYcMzF9SxDFKeJ5pXRspD/khcaN7E15mfNGxo8416o5rU12AEkVbZnADfM3xKzAT29BLc", - "b4vV28ni9wL7JDUr/yr8pw9ezN8F8J1F6+ogYQaziqCj1wZl9NRiJWc6N9zGbl1JjEkhSXrLJfY7l5SL", - "EUKAN8WVJqZpiYoQ002i5D1k1XTtWNioJK/mJQbMvnrdXoknBrPHDFt1+9t43bJmDDLFsi6UbnkGZ7Gx", - "Lejjb96EAYQpl5ZzmVWdTkgtdxYmV0XJ5PKLHoYedATzBao/I+iW9asddVRd2463pQz/AzkW3iBUsBEX", - "GDkvIZ5OBXwQjqE0Um2jh9CHc/F4CAOI4LycVwtVVp6VRBnQCcxmXXR5U5zS8rcErBAqT9LkLQgRDSn8", - "dzWlKLWgr3313Tc3lUMVNQVZHIiJhzjZmbimy1GHqg3FLtJMTOvAWjNfnubGJGlEMuQTQChxMI51CP3L", - "5U33LwXuQPDzppj89AR2xCUwgk6sbTISehs/LYnX/4I+nPG2IAxMhRY/zuTyQNva+no5FP7b5FUsdy6q", - "kOQriuJKtWY4chJVzL7buPILuXBZ9Cu7gZu5SLoGL2AkRtnIDYGg4yFE1zUBsTMFWphqcCoehri0pMEp", - "9JKRgYRiCBcQ8CZWuMfiQQGoyQ/bSZuQCYl03slYQhGmlU8nbt0skvcqpskFJcZUWMlJaPgdTy34N+SP", - "BDsFcuRfnObpAcrlxWxigHI8xXOLl7nxULcr0hrriDLaFR39JJAymGHsMn581RXvHae0r7OHQjJsK59/", - "BIGNeBs6cCGCltBmVJ5NEAMMrfh4E9e6TGNyWNI/y93+Kwx5W8BBtnYnwtPKNyVs+vhRzEFBOdM2KuaO", - "PyW9XQDRbYf/BAAA///Pcu0CqR0AAA==", + "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", + "AAA=", } // GetSwagger returns the content of the embedded swagger specification file