diff --git a/.env-cmdrc b/.env-cmdrc index aeb0f17cde2..bd6d80d2ec3 100644 --- a/.env-cmdrc +++ b/.env-cmdrc @@ -15,7 +15,8 @@ "CX_BASE_URL": "https://api.cg79x9wuu9-eccommerc1-p1-public.model-t.myhybris.cloud" }, "cds": { - "CX_CDS": "true" + "CX_CDS": "true", + "CX_SCI": "false" }, "lighthouse": { "CX_BASE_URL": "https://api.spartacus.rocks" diff --git a/integration-libs/cds/src/cds.module.ts b/integration-libs/cds/src/cds.module.ts index e0a28705772..5fe08751493 100644 --- a/integration-libs/cds/src/cds.module.ts +++ b/integration-libs/cds/src/cds.module.ts @@ -5,8 +5,16 @@ */ import { ModuleWithProviders, NgModule } from '@angular/core'; -import { provideConfigValidator, provideDefaultConfig } from '@spartacus/core'; -import { CdsConfig, cdsConfigValidator, DEFAULT_CDS_CONFIG } from './config'; +import { + provideConfigValidator, + provideDefaultConfig, + provideDefaultConfigFactory, +} from '@spartacus/core'; +import { + CdsConfig, + cdsConfigValidator, + defaultCdsConfigFactory, +} from './config'; import { MerchandisingModule } from './merchandising'; import { ProfileTagModule, @@ -15,7 +23,6 @@ import { } from './profiletag'; import { RecentSearchesModule } from './recent-searches/recent-searches.module'; import { TrendingSearchesModule } from './trending-searches/trending-searches.module'; - @NgModule({ imports: [ ProfileTagModule, @@ -30,7 +37,7 @@ export class CdsModule { return { ngModule: CdsModule, providers: [ - provideDefaultConfig(DEFAULT_CDS_CONFIG), + provideDefaultConfigFactory(defaultCdsConfigFactory), provideDefaultConfig(config), provideConfigValidator(cdsConfigValidator), ProfileTagPushEventsService, diff --git a/integration-libs/cds/src/config/cds-config.ts b/integration-libs/cds/src/config/cds-config.ts index 98db9bb90c1..004a113cfbe 100644 --- a/integration-libs/cds/src/config/cds-config.ts +++ b/integration-libs/cds/src/config/cds-config.ts @@ -23,6 +23,7 @@ export abstract class CdsConfig { endpoints?: CdsEndpoints; merchandising?: MerchandisingConfig; profileTag?: ProfileTagConfig; + sciEnabled?: boolean; }; } diff --git a/integration-libs/cds/src/config/default-cds-config.ts b/integration-libs/cds/src/config/default-cds-config.ts index 3b6e99485d7..fba4b6f7185 100644 --- a/integration-libs/cds/src/config/default-cds-config.ts +++ b/integration-libs/cds/src/config/default-cds-config.ts @@ -6,21 +6,18 @@ import { CdsConfig } from './cds-config'; -export const DEFAULT_CDS_CONFIG: CdsConfig = { - cds: { - tenant: '', - baseUrl: '', - endpoints: { - strategyProducts: '/strategy/${tenant}/strategies/${strategyId}/products', - searchIntelligence: - '/search-intelligence/v1/sites/${cdsSiteId}/trendingSearches', +export function defaultCdsConfigFactory(): CdsConfig { + return { + cds: { + tenant: '', + baseUrl: '', + merchandising: { + defaultCarouselViewportThreshold: 80, + }, + consentTemplateId: 'PROFILE', + profileTag: { + allowInsecureCookies: false, + }, }, - merchandising: { - defaultCarouselViewportThreshold: 80, - }, - consentTemplateId: 'PROFILE', - profileTag: { - allowInsecureCookies: false, - }, - }, -}; + }; +} diff --git a/integration-libs/cds/src/config/profile-tag.config.ts b/integration-libs/cds/src/config/profile-tag.config.ts index 6ad8ef701e0..b99f9084b69 100644 --- a/integration-libs/cds/src/config/profile-tag.config.ts +++ b/integration-libs/cds/src/config/profile-tag.config.ts @@ -9,4 +9,5 @@ export interface ProfileTagConfig { configUrl?: string; allowInsecureCookies?: boolean; gtmId?: string; + sciEnabled?: boolean; } diff --git a/integration-libs/cds/src/merchandising/adapters/strategy/cds-merchandising-strategy.adapter.spec.ts b/integration-libs/cds/src/merchandising/adapters/strategy/cds-merchandising-strategy.adapter.spec.ts index 63e62167976..52e28143651 100644 --- a/integration-libs/cds/src/merchandising/adapters/strategy/cds-merchandising-strategy.adapter.spec.ts +++ b/integration-libs/cds/src/merchandising/adapters/strategy/cds-merchandising-strategy.adapter.spec.ts @@ -7,10 +7,17 @@ import { CdsEndpointsService } from '../../../services/cds-endpoints.service'; import { StrategyProducts } from '../../model/strategy-products.model'; import { CdsMerchandisingStrategyAdapter } from './cds-merchandising-strategy.adapter'; import createSpy = jasmine.createSpy; +import { BaseSiteService } from '@spartacus/core'; +import { of } from 'rxjs'; const STRATEGY_ID = 'test-strategy-id'; const STRATEGY_PRODUCTS_ENDPOINT_KEY = 'strategyProducts'; -const strategyIdObject = { strategyId: STRATEGY_ID }; +const TEST_BASE_SITE = 'testBaseSite'; + +const TEST_URL_PARAMS = { + baseSite: TEST_BASE_SITE, + strategyId: STRATEGY_ID, +}; const expectedProductsFromStrategy: StrategyProducts = { resultCount: 1, @@ -46,7 +53,13 @@ const strategyRequestUndefinedConsentReference = { class MockCdsEndpointsService { getUrl = createSpy('MockCdsEndpointsService.getUrl').and.callFake( - (endpoint) => endpoint + (endpoint: string) => endpoint + ); +} + +class MockBaseSiteService { + getActive = createSpy('MockBaseSiteService.getActive').and.callFake(() => + of(TEST_BASE_SITE) ); } @@ -63,6 +76,10 @@ describe('MerchandisingStrategyAdapter', () => { provide: CdsEndpointsService, useClass: MockCdsEndpointsService, }, + { + provide: BaseSiteService, + useClass: MockBaseSiteService, + }, CdsMerchandisingStrategyAdapter, ], }); @@ -123,7 +140,7 @@ describe('MerchandisingStrategyAdapter', () => { expect(cdsEndpointsService.getUrl).toHaveBeenCalledWith( STRATEGY_PRODUCTS_ENDPOINT_KEY, - strategyIdObject, + TEST_URL_PARAMS, strategyRequest.queryParams ); @@ -156,7 +173,7 @@ describe('MerchandisingStrategyAdapter', () => { expect(cdsEndpointsService.getUrl).toHaveBeenCalledWith( STRATEGY_PRODUCTS_ENDPOINT_KEY, - strategyIdObject, + TEST_URL_PARAMS, strategyRequest.queryParams ); diff --git a/integration-libs/cds/src/merchandising/adapters/strategy/cds-merchandising-strategy.adapter.ts b/integration-libs/cds/src/merchandising/adapters/strategy/cds-merchandising-strategy.adapter.ts index d7f547cc788..9eb5cf88f94 100644 --- a/integration-libs/cds/src/merchandising/adapters/strategy/cds-merchandising-strategy.adapter.ts +++ b/integration-libs/cds/src/merchandising/adapters/strategy/cds-merchandising-strategy.adapter.ts @@ -6,11 +6,12 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; +import { Observable, switchMap, take } from 'rxjs'; import { CdsEndpointsService } from '../../../services/cds-endpoints.service'; import { MerchandisingStrategyAdapter } from '../../connectors/strategy/merchandising-strategy.adapter'; import { StrategyProducts } from '../../model/strategy-products.model'; import { StrategyRequest } from './../../../cds-models/cds-strategy-request.model'; +import { BaseSiteService } from '@spartacus/core'; const STRATEGY_PRODUCTS_ENDPOINT_KEY = 'strategyProducts'; @@ -20,6 +21,7 @@ export class CdsMerchandisingStrategyAdapter { constructor( private cdsEndpointsService: CdsEndpointsService, + private baseSiteService: BaseSiteService, protected http: HttpClient ) {} @@ -34,15 +36,21 @@ export class CdsMerchandisingStrategyAdapter strategyRequest.headers.consentReference ); } - return this.http.get( - this.cdsEndpointsService.getUrl( - STRATEGY_PRODUCTS_ENDPOINT_KEY, - { - strategyId, - }, - strategyRequest.queryParams - ), - { headers } + return this.baseSiteService.getActive().pipe( + take(1), + switchMap((baseSite) => + this.http.get( + this.cdsEndpointsService.getUrl( + STRATEGY_PRODUCTS_ENDPOINT_KEY, + { + baseSite, + strategyId, + }, + strategyRequest.queryParams + ), + { headers } + ) + ) ); } } diff --git a/integration-libs/cds/src/profiletag/model/profile-tag.model.ts b/integration-libs/cds/src/profiletag/model/profile-tag.model.ts index d5433b4635b..fee2e205674 100644 --- a/integration-libs/cds/src/profiletag/model/profile-tag.model.ts +++ b/integration-libs/cds/src/profiletag/model/profile-tag.model.ts @@ -22,6 +22,7 @@ export interface ProfileTagJsConfig { configUrl?: string; allowInsecureCookies?: boolean; gtmId?: string; + sciEnabled?: boolean; } export interface ConsentReferenceEvent extends CustomEvent { @@ -53,14 +54,14 @@ export interface ProfileTagPushEvent { export class NavigatedPushEvent implements ProfileTagPushEvent { name = 'Navigated'; data: any; - constructor(data?) { + constructor(data?: any) { this.data = data; } } export class ConsentChangedPushEvent implements ProfileTagPushEvent { name = 'ConsentChanged'; - data: { granted: boolean } = { granted: undefined }; + data: { granted?: boolean } = { granted: undefined }; constructor(granted: boolean) { this.data.granted = granted; } diff --git a/integration-libs/cds/src/profiletag/services/profiletag-event.service.spec.ts b/integration-libs/cds/src/profiletag/services/profiletag-event.service.spec.ts index 8321bb79a6e..def97822e89 100644 --- a/integration-libs/cds/src/profiletag/services/profiletag-event.service.spec.ts +++ b/integration-libs/cds/src/profiletag/services/profiletag-event.service.spec.ts @@ -26,6 +26,7 @@ const mockCDSConfig: CdsConfig = { configUrl: 'https:tag.static.us.context.cloud.sap', allowInsecureCookies: false, gtmId: 'test-id-1234567', + sciEnabled: false, }, }, }; diff --git a/integration-libs/cds/src/recent-searches/recent-searches.component.spec.ts b/integration-libs/cds/src/recent-searches/recent-searches.component.spec.ts index 79fd8b336dd..a190fbcbc2a 100644 --- a/integration-libs/cds/src/recent-searches/recent-searches.component.spec.ts +++ b/integration-libs/cds/src/recent-searches/recent-searches.component.spec.ts @@ -144,6 +144,6 @@ describe('RecentSearchesComponent', () => { expect(() => { component.shareEvent(ev); - }).toThrowError(); + }).toThrow(); }); }); diff --git a/integration-libs/cds/src/schematics/add-cds/__snapshots__/index_spec.ts.snap b/integration-libs/cds/src/schematics/add-cds/__snapshots__/index_spec.ts.snap index 3e158a7be46..c0513c71843 100644 --- a/integration-libs/cds/src/schematics/add-cds/__snapshots__/index_spec.ts.snap +++ b/integration-libs/cds/src/schematics/add-cds/__snapshots__/index_spec.ts.snap @@ -21,9 +21,6 @@ import { I18nConfig, provideConfig } from "@spartacus/core"; cds: { tenant: 'my-tenant', baseUrl: 'my-base-url.com', - endpoints: { - strategyProducts: '/strategy/\${tenant}/strategies/\${strategyId}/products', - }, merchandising: { defaultCarouselViewportThreshold: 80, }, @@ -67,9 +64,6 @@ import { I18nConfig, provideConfig } from "@spartacus/core"; cds: { tenant: 'my-tenant', baseUrl: 'my-base-url.com', - endpoints: { - strategyProducts: '/strategy/\${tenant}/strategies/\${strategyId}/products', - }, merchandising: { defaultCarouselViewportThreshold: 80, }, diff --git a/projects/schematics/src/shared/lib-configs/integration-libs/cds-schematics-config.ts b/projects/schematics/src/shared/lib-configs/integration-libs/cds-schematics-config.ts index 35a1203697e..a67efe10df0 100644 --- a/projects/schematics/src/shared/lib-configs/integration-libs/cds-schematics-config.ts +++ b/projects/schematics/src/shared/lib-configs/integration-libs/cds-schematics-config.ts @@ -68,9 +68,6 @@ function buildCdsConfig( cds: { tenant: '${options.tenant || 'TENANT_PLACEHOLDER'}', baseUrl: '${options.baseUrl || 'BASE_URL_PLACEHOLDER'}', - endpoints: { - strategyProducts: '/strategy/\${tenant}/strategies/\${strategyId}/products', - }, merchandising: { defaultCarouselViewportThreshold: 80, }, diff --git a/projects/storefrontapp/src/app/spartacus/features/cds/cds-feature.module.ts b/projects/storefrontapp/src/app/spartacus/features/cds/cds-feature.module.ts index c073c636b47..0ea1b669144 100644 --- a/projects/storefrontapp/src/app/spartacus/features/cds/cds-feature.module.ts +++ b/projects/storefrontapp/src/app/spartacus/features/cds/cds-feature.module.ts @@ -16,6 +16,16 @@ import { cdsTranslationChunksConfig, cdsTranslations, } from '@spartacus/cds/assets'; +import { environment } from '../../../../environments/environment'; + +/** + * Only differences to the default cds config, they are merged together. + * + * @see defaultCdsConfigFactory + * @see CdsModule.forRoot + */ + +const sciEnabled = environment.sciEnabled; const cds1: CdsConfig = { cds: { @@ -23,24 +33,31 @@ const cds1: CdsConfig = { tenant: 'argotest', baseUrl: 'https://api.stage.context.cloud.sap', endpoints: { - strategyProducts: '/strategy/${tenant}/strategies/${strategyId}/products', + strategyProducts: sciEnabled + ? '/strategy/v1/sites/${baseSite}/strategies/${strategyId}/products' + : '/strategy/${tenant}/strategies/${strategyId}/products', searchIntelligence: '/search-intelligence/v1/sites/${cdsSiteId}/trendingSearches', }, - merchandising: { - defaultCarouselViewportThreshold: 80, - }, profileTag: { javascriptUrl: 'https://tag.static.stage.context.cloud.sap/js/profile-tag.js', - configUrl: - 'https://tag.static.stage.context.cloud.sap/config/mytenant-main-default', + configUrl: sciEnabled + ? 'https://tag.static.stage.context.cloud.sap/config/profiletag-default-config' + : 'https://tag.static.stage.context.cloud.sap/config/mytenant-main-default', allowInsecureCookies: true, + sciEnabled: sciEnabled, }, }, }; -const cds2 = { +/** + * Only differences to the default cds config, they are merged together. + * + * @see defaultCdsConfigFactory + * @see CdsModule.forRoot + */ +const cds2: CdsConfig = { cds: { baseSite: [ 'apparel-de', @@ -51,24 +68,26 @@ const cds2 = { tenant: 'A_CDS_TENANT', baseUrl: 'A_CDS_BASE_URL', endpoints: { - strategyProducts: '/strategy/${tenant}/strategies/${strategyId}/products', + strategyProducts: sciEnabled + ? '/strategy/v1/sites/${baseSite}/strategies/${strategyId}/products' + : '/strategy/${tenant}/strategies/${strategyId}/products', searchIntelligence: '/search-intelligence/v1/sites/${cdsSiteId}/trendingSearches', }, - merchandising: { - defaultCarouselViewportThreshold: 80, - }, profileTag: { javascriptUrl: 'A_CDS_PROFILE_TAG_LOAD_URL', - configUrl: 'A_CDS_PROFILE_TAG_CONFIG_URL', + configUrl: sciEnabled + ? 'https://tag.static.stage.context.cloud.sap/config/profiletag-default-config' + : 'A_CDS_PROFILE_TAG_CONFIG_URL', allowInsecureCookies: true, + sciEnabled: sciEnabled, }, }, }; -const cdsConfigArray = [cds1, cds2]; +function cdsConfigFactory(windowRef: WindowRef): CdsConfig { + const cdsConfigArray = [cds1, cds2]; -const cdsConfig = (windowRef: WindowRef): CdsConfig => { if (!windowRef.isBrowser()) { return cds1; } @@ -78,7 +97,7 @@ const cdsConfig = (windowRef: WindowRef): CdsConfig => { ); }); return cds ?? cds1; -}; +} @NgModule({ imports: [CdsModule.forRoot()], @@ -90,7 +109,7 @@ const cdsConfig = (windowRef: WindowRef): CdsConfig => { fallbackLang: 'en', }, }), - provideConfigFactory(cdsConfig, [WindowRef]), + provideConfigFactory(cdsConfigFactory, [WindowRef]), ], }) export class CdsFeatureModule {} diff --git a/projects/storefrontapp/src/environments/environment.prod.ts b/projects/storefrontapp/src/environments/environment.prod.ts index 6037371c0e8..5e273ae1df7 100644 --- a/projects/storefrontapp/src/environments/environment.prod.ts +++ b/projects/storefrontapp/src/environments/environment.prod.ts @@ -11,6 +11,7 @@ export const environment: Environment = { occBaseUrl: buildProcess.env.CX_BASE_URL, occApiPrefix: '/occ/v2/', cds: buildProcess.env.CX_CDS, + sciEnabled: buildProcess.env.CX_SCI, b2b: buildProcess.env.CX_B2B, cdc: buildProcess.env.CX_CDC, cdp: buildProcess.env.CX_CDP, diff --git a/projects/storefrontapp/src/environments/environment.ts b/projects/storefrontapp/src/environments/environment.ts index be90972448d..928c00350e2 100644 --- a/projects/storefrontapp/src/environments/environment.ts +++ b/projects/storefrontapp/src/environments/environment.ts @@ -24,6 +24,7 @@ export const environment: Environment = { occBaseUrl: buildProcess.env.CX_BASE_URL, occApiPrefix: '/occ/v2/', cds: buildProcess.env.CX_CDS ?? false, + sciEnabled: buildProcess.env.CX_SCI ?? false, b2b: buildProcess.env.CX_B2B ?? false, cdc: buildProcess.env.CX_CDC ?? false, cdp: buildProcess.env.CX_CDP ?? false, diff --git a/projects/storefrontapp/src/environments/models/build.process.env.d.ts b/projects/storefrontapp/src/environments/models/build.process.env.d.ts index 344f31b0ffa..f7dee503fd7 100644 --- a/projects/storefrontapp/src/environments/models/build.process.env.d.ts +++ b/projects/storefrontapp/src/environments/models/build.process.env.d.ts @@ -13,6 +13,7 @@ interface BuildProcess { interface Env { CX_BASE_URL: string; CX_CDS: boolean; + CX_SCI: boolean; CX_CDC: boolean; CX_CDP: boolean; CX_B2B: boolean; diff --git a/projects/storefrontapp/src/environments/models/environment.model.ts b/projects/storefrontapp/src/environments/models/environment.model.ts index bfd0088e6d8..6d603752425 100644 --- a/projects/storefrontapp/src/environments/models/environment.model.ts +++ b/projects/storefrontapp/src/environments/models/environment.model.ts @@ -10,6 +10,7 @@ export interface Environment { occApiPrefix: string; b2b: boolean; cds: boolean; + sciEnabled: boolean; cdc: boolean; cdp: boolean; cpq: boolean;