From cefb13f4fdd15b934a79c5f2969052246a29e7ba Mon Sep 17 00:00:00 2001 From: "Lukas Schneider (Neo Reply)" <131265055+neo-reply-lukas@users.noreply.github.com> Date: Thu, 12 Mar 2026 16:52:55 +0100 Subject: [PATCH 1/2] feat(mediaurls): option to add revision query param to media URLs in Release (#243) --- src/modules/CaaSMapper.spec.ts | 14 ++++++++++++++ src/modules/CaaSMapper.ts | 7 ++++++- src/modules/FSXARemoteApi.ts | 20 ++++++++++++++++++++ src/types.ts | 1 + 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/modules/CaaSMapper.spec.ts b/src/modules/CaaSMapper.spec.ts index 88ab340..ef68dc7 100644 --- a/src/modules/CaaSMapper.spec.ts +++ b/src/modules/CaaSMapper.spec.ts @@ -163,6 +163,20 @@ describe('CaaSMapper', () => { `${url}?prev&rev=5593` ) }) + + it('should append the revision as a query param if addRevisionToMediaUrlsInRelease is true and content mode is release', () => { + const api = createApi() + api.contentMode = FSXAContentMode.RELEASE + api.addRevisionToMediaUrlsInRelease = true + const mapper = new CaaSMapper(api, 'de', {addRevisionToMediaUrlsInRelease: true}, createLogger()) + const url = 'https://e-spirit.local/some/resource' + expect(mapper.buildMediaUrl(url)).toEqual(url) + expect(mapper.buildMediaUrl(url, 5593)).toEqual(`${url}?rev=5593`) + // check media string construction + expect(mapper.buildMediaUrl(`${url}?prev`, 5593)).toEqual( + `${url}?prev&rev=5593` + ) + }) }) describe('mapDataEntry', () => { diff --git a/src/modules/CaaSMapper.ts b/src/modules/CaaSMapper.ts index b80d3ac..162b613 100644 --- a/src/modules/CaaSMapper.ts +++ b/src/modules/CaaSMapper.ts @@ -106,6 +106,9 @@ export class CaaSMapper { // just started, when we need to keep track of them. _processedItems: Record = {} + // Add Revision query param to media urls in release case + addRevisionToMediaUrlsInRelease: boolean = false + constructor( api: FSXARemoteApi, locale: string | undefined, @@ -113,6 +116,7 @@ export class CaaSMapper { customMapper?: CustomMapper referenceDepth?: number maxReferenceDepth?: number + addRevisionToMediaUrlsInRelease?: boolean }, logger: Logger ) { @@ -129,6 +133,7 @@ export class CaaSMapper { utils.maxReferenceDepth ?? DEFAULT_MAX_REFERENCE_DEPTH this.logger.debug('Created new CaaSMapper') + this.addRevisionToMediaUrlsInRelease = utils.addRevisionToMediaUrlsInRelease ?? false } addToResolvedReferences( @@ -231,7 +236,7 @@ export class CaaSMapper { } buildMediaUrl(url: string, rev?: number) { - if (rev && this.api.contentMode === FSXAContentMode.PREVIEW) { + if (rev && (this.api.contentMode === FSXAContentMode.PREVIEW || this.addRevisionToMediaUrlsInRelease)) { url += `${url.includes('?') ? '&' : '?'}rev=${rev}` } return url diff --git a/src/modules/FSXARemoteApi.ts b/src/modules/FSXARemoteApi.ts index b555d08..e083748 100644 --- a/src/modules/FSXARemoteApi.ts +++ b/src/modules/FSXARemoteApi.ts @@ -74,6 +74,7 @@ export class FSXARemoteApi implements FSXAApi { private _caasItemFilter?: CaasItemFilter private _logLevel: LogLevel private _enableEventStream: boolean = false + private _addRevisionToMediaUrlsInRelease: boolean = false /** * The constructor of this class initializes the configuration for the api. @@ -90,6 +91,7 @@ export class FSXARemoteApi implements FSXAApi { * @param config.customMapper optional {@link CustomMapper CustomMapper} * @param config.filterOptions optional {@link RemoteApiFilterOptions RemoteApiFilterOptions} (EXPERIMENTAL) * @param config.logLevel the used {@link LogLevel LogLevel} for the API `(default LogLevel.ERROR)` - optional + * @param config.addRevisionToMediaUrlsInRelease sets flag if revision query param should be added to media urls in release. */ constructor({ apikey, @@ -103,6 +105,7 @@ export class FSXARemoteApi implements FSXAApi { customMapper, filterOptions, logLevel = LogLevel.ERROR, + addRevisionToMediaUrlsInRelease = false }: FSXARemoteApiConfig) { this.apikey = apikey this.caasURL = caasURL @@ -118,6 +121,7 @@ export class FSXARemoteApi implements FSXAApi { this._queryBuilder = new QueryBuilder(this._logger) this._navigationItemFilter = filterOptions?.navigationItemFilter this._caasItemFilter = filterOptions?.caasItemFilter + this._addRevisionToMediaUrlsInRelease = addRevisionToMediaUrlsInRelease this._logger.debug('FSXARemoteApi created', { caasURL, @@ -129,6 +133,7 @@ export class FSXARemoteApi implements FSXAApi { customMapper: this._customMapper, navigationItemFilter: this._navigationItemFilter, caasItemFilter: this._caasItemFilter, + addRevisionToMediaUrlsInRelease }) } @@ -636,6 +641,7 @@ export class FSXARemoteApi implements FSXAApi { { customMapper: this._customMapper, maxReferenceDepth: this._maxReferenceDepth, + addRevisionToMediaUrlsInRelease: this._addRevisionToMediaUrlsInRelease }, new Logger(this._logLevel, 'CaaSMapper') ) @@ -1043,6 +1049,20 @@ export class FSXARemoteApi implements FSXAApi { this._contentMode = value } + /** + * gets flag, if revision should be added to media urls in release + */ + public get addRevisionToMediaUrlsInRelease() { + return this._addRevisionToMediaUrlsInRelease + } + + /** + * Sets flag, if revision should be added to media urls in release + */ + public set addRevisionToMediaUrlsInRelease(value: boolean) { + this._addRevisionToMediaUrlsInRelease = value + } + /** * @returns the configured log level */ diff --git a/src/types.ts b/src/types.ts index 26b5ff8..b1695eb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1033,6 +1033,7 @@ export type FSXARemoteApiConfig = { customMapper?: CustomMapper filterOptions?: RemoteApiFilterOptions enableEventStream?: boolean + addRevisionToMediaUrlsInRelease?: boolean } export type FilterContextProvider = () => unknown | null From 53f6409c4b28f56169c93881d0515443d270ee27 Mon Sep 17 00:00:00 2001 From: jodeleit-es <> Date: Thu, 12 Mar 2026 18:11:20 +0100 Subject: [PATCH 2/2] review changes --- src/modules/CaaSMapper.spec.ts | 14 ++++++++------ src/modules/CaaSMapper.ts | 7 +------ src/modules/FSXARemoteApi.spec.ts | 16 ++++++++++++++++ src/modules/FSXARemoteApi.ts | 27 +++++++++++++-------------- src/types.ts | 2 +- 5 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/modules/CaaSMapper.spec.ts b/src/modules/CaaSMapper.spec.ts index ef68dc7..39dff5a 100644 --- a/src/modules/CaaSMapper.spec.ts +++ b/src/modules/CaaSMapper.spec.ts @@ -144,16 +144,18 @@ describe('CaaSMapper', () => { }) describe('buildMediaUrl', () => { - it('should return the url as-is in release mode', () => { + it('should return the url as-is in release mode when includeRevisionInMediaUrls is false', () => { const api = createApi() api.contentMode = FSXAContentMode.RELEASE + api.includeRevisionInMediaUrls = false const mapper = new CaaSMapper(api, 'de', {}, createLogger()) const url = 'https://e-spirit.local/some/resource' expect(mapper.buildMediaUrl(url)).toEqual(url) + expect(mapper.buildMediaUrl(url, 5593)).toEqual(url) }) - it('should append the revision as a query param if given in preview mode', () => { + it('should append the revision as a query param if given when includeRevisionInMediaUrls is true', () => { const api = createApi() - api.contentMode = FSXAContentMode.PREVIEW + api.includeRevisionInMediaUrls = true const mapper = new CaaSMapper(api, 'de', {}, createLogger()) const url = 'https://e-spirit.local/some/resource' expect(mapper.buildMediaUrl(url)).toEqual(url) @@ -164,11 +166,11 @@ describe('CaaSMapper', () => { ) }) - it('should append the revision as a query param if addRevisionToMediaUrlsInRelease is true and content mode is release', () => { + it('should append the revision as a query param if includeRevisionInMediaUrls is true and content mode is release', () => { const api = createApi() api.contentMode = FSXAContentMode.RELEASE - api.addRevisionToMediaUrlsInRelease = true - const mapper = new CaaSMapper(api, 'de', {addRevisionToMediaUrlsInRelease: true}, createLogger()) + api.includeRevisionInMediaUrls = true + const mapper = new CaaSMapper(api, 'de', {}, createLogger()) const url = 'https://e-spirit.local/some/resource' expect(mapper.buildMediaUrl(url)).toEqual(url) expect(mapper.buildMediaUrl(url, 5593)).toEqual(`${url}?rev=5593`) diff --git a/src/modules/CaaSMapper.ts b/src/modules/CaaSMapper.ts index 162b613..e3e046f 100644 --- a/src/modules/CaaSMapper.ts +++ b/src/modules/CaaSMapper.ts @@ -106,9 +106,6 @@ export class CaaSMapper { // just started, when we need to keep track of them. _processedItems: Record = {} - // Add Revision query param to media urls in release case - addRevisionToMediaUrlsInRelease: boolean = false - constructor( api: FSXARemoteApi, locale: string | undefined, @@ -116,7 +113,6 @@ export class CaaSMapper { customMapper?: CustomMapper referenceDepth?: number maxReferenceDepth?: number - addRevisionToMediaUrlsInRelease?: boolean }, logger: Logger ) { @@ -133,7 +129,6 @@ export class CaaSMapper { utils.maxReferenceDepth ?? DEFAULT_MAX_REFERENCE_DEPTH this.logger.debug('Created new CaaSMapper') - this.addRevisionToMediaUrlsInRelease = utils.addRevisionToMediaUrlsInRelease ?? false } addToResolvedReferences( @@ -236,7 +231,7 @@ export class CaaSMapper { } buildMediaUrl(url: string, rev?: number) { - if (rev && (this.api.contentMode === FSXAContentMode.PREVIEW || this.addRevisionToMediaUrlsInRelease)) { + if (rev && this.api.includeRevisionInMediaUrls) { url += `${url.includes('?') ? '&' : '?'}rev=${rev}` } return url diff --git a/src/modules/FSXARemoteApi.spec.ts b/src/modules/FSXARemoteApi.spec.ts index ef6a620..fa15cf9 100644 --- a/src/modules/FSXARemoteApi.spec.ts +++ b/src/modules/FSXARemoteApi.spec.ts @@ -86,6 +86,22 @@ describe('FSXARemoteAPI', () => { new FSXARemoteApi(config) }).toThrow(FSXAApiErrors.UNKNOWN_CONTENT_MODE) }) + it('should default includeRevisionInMediaUrls to true in preview mode', () => { + config.contentMode = 'preview' + remoteApi = new FSXARemoteApi(config) + expect(remoteApi.includeRevisionInMediaUrls).toBe(true) + }) + it('should default includeRevisionInMediaUrls to false in release mode', () => { + config.contentMode = 'release' + remoteApi = new FSXARemoteApi(config) + expect(remoteApi.includeRevisionInMediaUrls).toBe(false) + }) + it('should allow overriding includeRevisionInMediaUrls in release mode', () => { + config.contentMode = 'release' + config.includeRevisionInMediaUrls = true + remoteApi = new FSXARemoteApi(config) + expect(remoteApi.includeRevisionInMediaUrls).toBe(true) + }) }) describe('buildAuthorizationHeaders', () => { it('should return the correct authorization object', () => { diff --git a/src/modules/FSXARemoteApi.ts b/src/modules/FSXARemoteApi.ts index e083748..984bf53 100644 --- a/src/modules/FSXARemoteApi.ts +++ b/src/modules/FSXARemoteApi.ts @@ -30,7 +30,7 @@ import { removeFromSeoRouteMap, removeFromStructure, } from '../utils' -import { FSXAApiErrors, HttpStatus } from './../enums' +import { FSXAApiErrors, FSXAContentMode, HttpStatus } from './../enums' import { LogLevel } from './Logger' import { denormalizeResolvedReferences } from './MappingUtils' import { ComparisonQueryOperatorEnum, QueryBuilder } from './QueryBuilder' @@ -74,7 +74,7 @@ export class FSXARemoteApi implements FSXAApi { private _caasItemFilter?: CaasItemFilter private _logLevel: LogLevel private _enableEventStream: boolean = false - private _addRevisionToMediaUrlsInRelease: boolean = false + private _includeRevisionInMediaUrls: boolean = false /** * The constructor of this class initializes the configuration for the api. @@ -91,7 +91,7 @@ export class FSXARemoteApi implements FSXAApi { * @param config.customMapper optional {@link CustomMapper CustomMapper} * @param config.filterOptions optional {@link RemoteApiFilterOptions RemoteApiFilterOptions} (EXPERIMENTAL) * @param config.logLevel the used {@link LogLevel LogLevel} for the API `(default LogLevel.ERROR)` - optional - * @param config.addRevisionToMediaUrlsInRelease sets flag if revision query param should be added to media urls in release. + * @param config.includeRevisionInMediaUrls whether to append `rev` query param to media URLs `(default: true in preview, false in release)` */ constructor({ apikey, @@ -105,7 +105,7 @@ export class FSXARemoteApi implements FSXAApi { customMapper, filterOptions, logLevel = LogLevel.ERROR, - addRevisionToMediaUrlsInRelease = false + includeRevisionInMediaUrls = contentMode === FSXAContentMode.PREVIEW, // default to true in preview, false in release }: FSXARemoteApiConfig) { this.apikey = apikey this.caasURL = caasURL @@ -121,7 +121,7 @@ export class FSXARemoteApi implements FSXAApi { this._queryBuilder = new QueryBuilder(this._logger) this._navigationItemFilter = filterOptions?.navigationItemFilter this._caasItemFilter = filterOptions?.caasItemFilter - this._addRevisionToMediaUrlsInRelease = addRevisionToMediaUrlsInRelease + this._includeRevisionInMediaUrls = includeRevisionInMediaUrls this._logger.debug('FSXARemoteApi created', { caasURL, @@ -133,7 +133,7 @@ export class FSXARemoteApi implements FSXAApi { customMapper: this._customMapper, navigationItemFilter: this._navigationItemFilter, caasItemFilter: this._caasItemFilter, - addRevisionToMediaUrlsInRelease + includeRevisionInMediaUrls: this._includeRevisionInMediaUrls }) } @@ -640,8 +640,7 @@ export class FSXARemoteApi implements FSXAApi { mapperLocale, { customMapper: this._customMapper, - maxReferenceDepth: this._maxReferenceDepth, - addRevisionToMediaUrlsInRelease: this._addRevisionToMediaUrlsInRelease + maxReferenceDepth: this._maxReferenceDepth }, new Logger(this._logLevel, 'CaaSMapper') ) @@ -1050,17 +1049,17 @@ export class FSXARemoteApi implements FSXAApi { } /** - * gets flag, if revision should be added to media urls in release + * @returns whether revision query parameter `rev` is appended to media URLs */ - public get addRevisionToMediaUrlsInRelease() { - return this._addRevisionToMediaUrlsInRelease + public get includeRevisionInMediaUrls() { + return this._includeRevisionInMediaUrls } /** - * Sets flag, if revision should be added to media urls in release + * Sets whether revision query parameter `rev` is appended to media URLs */ - public set addRevisionToMediaUrlsInRelease(value: boolean) { - this._addRevisionToMediaUrlsInRelease = value + public set includeRevisionInMediaUrls(value: boolean) { + this._includeRevisionInMediaUrls = value } /** diff --git a/src/types.ts b/src/types.ts index b1695eb..c543e9f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1033,7 +1033,7 @@ export type FSXARemoteApiConfig = { customMapper?: CustomMapper filterOptions?: RemoteApiFilterOptions enableEventStream?: boolean - addRevisionToMediaUrlsInRelease?: boolean + includeRevisionInMediaUrls?: boolean } export type FilterContextProvider = () => unknown | null