add history to shop search

This commit is contained in:
team 1
2026-04-17 12:59:21 +02:00
parent bab3682975
commit ae2b52ad18
8 changed files with 630 additions and 172 deletions

View File

@@ -15,12 +15,12 @@ use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
final readonly class ShopSearchService
{
public function __construct(
private CommerceQueryParser $queryParser,
private CommerceQueryParser $queryParser,
private ShopwareCriteriaBuilder $criteriaBuilder,
private StoreApiClient $storeApiClient,
private bool $enabled = true,
private int $maxResults = 25,
private string $baseUrl
private StoreApiClient $storeApiClient,
private bool $enabled = true,
private int $maxResults = 25,
private string $baseUrl
)
{
}
@@ -28,21 +28,33 @@ final readonly class ShopSearchService
/**
* @return ShopProductResult[]
*/
public function search(string $originalPrompt, string $commerceIntent): array
{
public function search(
string $originalPrompt,
string $commerceIntent,
string $commerceHistoryContext = ''
): array {
if (!$this->enabled) {
return [];
}
$response = [];
$query = $this->queryParser->parse($originalPrompt, $commerceIntent);
$query = $this->queryParser->parse(
$originalPrompt,
$commerceIntent,
$commerceHistoryContext
);
$criteria = $this->criteriaBuilder->build($query, $this->maxResults);
try {
$response = $this->storeApiClient->searchProducts($criteria);
} catch (ClientExceptionInterface|RedirectionExceptionInterface|ServerExceptionInterface|TransportExceptionInterface $e) {
} catch (
ClientExceptionInterface
| RedirectionExceptionInterface
| ServerExceptionInterface
| TransportExceptionInterface $e
) {
}
return $this->mapProducts($response);
@@ -66,12 +78,12 @@ final readonly class ShopSearchService
}
$results[] = new ShopProductResult(
id: (string)($row['id'] ?? ''),
name: trim((string)($row['translated']['name'] ?? '')),
productNumber: isset($row['productNumber']) ? (string)$row['productNumber'] : null,
id: (string) ($row['id'] ?? ''),
name: trim((string) ($row['translated']['name'] ?? '')),
productNumber: isset($row['productNumber']) ? (string) $row['productNumber'] : null,
manufacturer: $this->extractManufacturer($row),
price: $this->extractPrice($row),
available: isset($row['available']) ? (bool)$row['available'] : null,
available: isset($row['available']) ? (bool) $row['available'] : null,
url: $this->baseUrl . $this->extractUrl($row),
highlights: $this->extractHighlights($row),
description: $this->cleanUpDescription($row),
@@ -98,11 +110,11 @@ final readonly class ShopSearchService
private function cleanUpDescription(array $description): string
{
if (isset($description['translated']['description'])) {
$newDesc = strip_tags((string)$description['translated']['description']);
$newDesc = strip_tags((string) $description['translated']['description']);
$newDesc = html_entity_decode($newDesc);
$newDesc = preg_replace('/^[ \t]*\R/m', '', $newDesc);
$newDesc = preg_replace('/[ \t]{2,}/', ' ', $newDesc);
$result = trim((string)$newDesc);
$result = trim((string) $newDesc);
return mb_substr($result, 0, 1500);
}
@@ -142,7 +154,7 @@ final readonly class ShopSearchService
return null;
}
return number_format((float)$unitPrice, 2, ',', '.') . ' €';
return number_format((float) $unitPrice, 2, ',', '.') . ' €';
}
private function extractUrl(array $row): ?string
@@ -175,7 +187,7 @@ final readonly class ShopSearchService
$highlights = [];
if (isset($row['available'])) {
$highlights[] = (bool)$row['available'] ? 'Verfügbar' : 'Nicht verfügbar';
$highlights[] = (bool) $row['available'] ? 'Verfügbar' : 'Nicht verfügbar';
}
if (isset($row['productNumber']) && is_string($row['productNumber']) && trim($row['productNumber']) !== '') {