EdeeShop · Implementace
Upraveno

ProductVisibilityResolver

Co to je a k čemu slouží

ProductVisibilityResolver je rozšiřitelné rozhraní, které zapouzdřuje obchodní pravidla pro vyhodnocování viditelnosti produktů v seznamech katalogu, feedech apod.

Resolver je používán aplikační službou ProductVisibilityService, která si jej vyžádá ze Spring kontextu. Pokud žádný vlastní resolver nenajde, použije výchozí implementaci ProductVisibilityResolverImpl.

Relevantní třídy:

  • ProductVisibilityResolver — rozhraní rozšiřitelného resolveru
  • ProductVisibilityResolverImpl — výchozí implementace pravidel
  • ProductVisibilityService — služba, která resolver používá pro hromadné zpracování

Proč a kdy to použít

Použijte vlastní implementaci ProductVisibilityResolver všude, kde potřebujete upravit obchodní pravidla pro vyhodnocování viditelnosti produktů. Typické scénáře:

  • speciální kombinace dostupnosti a viditelnosti
  • kampaňová pravidla pro viditelnost produktů
  • B2B pravidla pro konkrétní zákaznické skupiny
  • specifická logika pro master produkty nebo produktové sety
  • vlastní způsob vyhodnocování produktů s ukončeným prodejem

Resolver se používá prostřednictvím služby ProductVisibilityService, která jej automaticky načte ze Spring kontextu. Pokud potřebujete jen použít standardní logiku, automaticky se aplikuje výchozí chování.

Výchozí chování (ProductVisibilityResolverImpl)

Výchozí resolver implementuje tato pravidla:

  • Produkty se status = TRASHED nebo PRIVATE jsou neviditelné (INVISIBLE).
  • Produkty s ukončeným prodejem (Product#isHasSaleEnded() == true) jsou neviditelné.
  • Je-li viditelnost dostupnosti produktu (ProductAvailability#getVisibility()) INVISIBLE, produkt je neviditelný.
  • Jinak se použije vlastní viditelnost produktu product.getVisibility() s defaultem INVISIBLE, pokud není nastavena.
  • Master produkt je viditelný pouze tehdy, pokud:
    • sám není explicitně INVISIBLE, a
    • existuje alespoň jedna „objevitelná/zařaditelná” varianta (productVariantService.existsAnyDiscoverabilityVariant(masterId)).
  • U produktových setů se pro hodnocení bere dostupnost celého setu (productSetService.getAvailabilityOfSet(product)).

Poznámka: Výchozí implementace předpokládá, že v kontextu jsou k dispozici služby variant a setů (AbstractProductVariantService, AbstractProductSetService). Pokud ve vaší instalaci chybí, zajistěte jejich přítomnost, nebo dodejte vlastní resolver, který s tím počítá.

Jak zaregistrovat vlastní implementaci

Pro použití vlastní implementace stačí zaregistrovat bean typu ProductVisibilityResolver do Spring kontextu. ProductVisibilityService automaticky najde a použije tento resolver. Pokud žádný vlastní resolver neexistuje, použije se výchozí ProductVisibilityResolverImpl.

Možnosti registrace:

  1. Přímá komponenta
java
import com.fg.cps.eshop.product.service.ProductVisibilityResolver;import com.fg.cps.eshop.product.service.ProductVisibilityResolverImpl; // jen pro inspiraci signaturou
public class CustomProductVisibilityResolver implements ProductVisibilityResolver {    @Override    public CatalogEntityVisibility getMasterProductVisibility(@NonNull Product master) {        // vaše pravidla    }
    @Override    public CatalogEntityVisibility getProductVisibility(@NonNull Product product) {        // vaše pravidla    }}
  1. Konfigurační třída s @Bean
java
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.fg.cps.eshop.product.service.ProductVisibilityResolver;
@Configurationpublic class ProjectSpringConfig {    	@Bean    public ProductVisibilityResolver productVisibilityResolver(            AbstractProductVariantService<Product> variantService,            AbstractProductSetService<Product> setService    ) {        return new CustomProductVisibilityResolver(variantService, setService);    }}

Jakmile je bean ProductVisibilityResolver ve Spring kontextu, ProductVisibilityService ji automaticky použije. Není nutná žádná další konfigurace.

Shrnutí

  • ProductVisibilityResolver je rozšiřitelné rozhraní pro obchodní pravidla viditelnosti produktů.
  • Výchozí implementace ProductVisibilityResolverImpl poskytuje standardní logiku.
  • Vlastní implementaci stačí zaregistrovat jako Spring bean — automaticky se použije místo výchozí.
  • Resolver se používá prostřednictvím ProductVisibilityService, která zajišťuje orchestraci a hromadné zpracování.