Skip to content

Commit

Permalink
Adds support for types model in linkedItems (modular_content)
Browse files Browse the repository at this point in the history
  • Loading branch information
Enngage committed Feb 6, 2025
1 parent c26915a commit 4560adf
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 51 deletions.
10 changes: 5 additions & 5 deletions lib/mappers/element.mapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export class ElementMapper<TClientTypes extends ClientTypes> {

mapElements<TContentItem extends IContentItem = TClientTypes['contentItemType']>(data: {
dataToMap: IContentItemWithRawElements;
processedItems: IContentItemsContainer;
processedItems: IContentItemsContainer<TClientTypes['contentItemType']>;
processingStartedForCodenames: string[];
preparedItems: IContentItemWithRawDataContainer;
}): IMapElementsResult<TContentItem> | undefined {
Expand Down Expand Up @@ -84,7 +84,7 @@ export class ElementMapper<TClientTypes extends ClientTypes> {
private mapElement(data: {
elementWrapper: ElementModels.IElementWrapper;
item: IContentItem;
processedItems: IContentItemsContainer;
processedItems: IContentItemsContainer<TClientTypes['contentItemType']>;
processingStartedForCodenames: string[];
preparedItems: IContentItemWithRawDataContainer;
}): ElementModels.IElement<any> {
Expand Down Expand Up @@ -147,7 +147,7 @@ export class ElementMapper<TClientTypes extends ClientTypes> {

private mapRichTextElement(
elementWrapper: ElementModels.IElementWrapper,
processedItems: IContentItemsContainer,
processedItems: IContentItemsContainer<TClientTypes['contentItemType']>,
processingStartedForCodenames: string[],
preparedItems: IContentItemWithRawDataContainer
): Elements.RichTextElement {
Expand Down Expand Up @@ -337,7 +337,7 @@ export class ElementMapper<TClientTypes extends ClientTypes> {

private mapLinkedItemsElement(data: {
elementWrapper: ElementModels.IElementWrapper;
processedItems: IContentItemsContainer;
processedItems: IContentItemsContainer<TClientTypes['contentItemType']>;
processingStartedForCodenames: string[];
preparedItems: IContentItemWithRawDataContainer;
}): Elements.LinkedItemsElement<any> {
Expand Down Expand Up @@ -372,7 +372,7 @@ export class ElementMapper<TClientTypes extends ClientTypes> {
private getOrSaveLinkedItemForElement(
codename: string,
element: Contracts.IElementContract,
processedItems: IContentItemsContainer,
processedItems: IContentItemsContainer<TClientTypes['contentItemType']>,
mappingStartedForCodenames: string[],
preparedItems: IContentItemWithRawDataContainer
): IContentItem | undefined {
Expand Down
11 changes: 7 additions & 4 deletions lib/models/item-models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ import { Contracts } from '../contracts';
import { ElementModels } from '../elements/element-models';
import { IQueryConfig } from './common/common-models';

export interface IMapElementsResult<TContentItem extends IContentItem = IContentItem> {
export interface IMapElementsResult<
TContentItem extends IContentItem = IContentItem,
TLinkedItemType extends IContentItem = IContentItem
> {
item: TContentItem;
processedItems: IContentItemsContainer;
processedItems: IContentItemsContainer<TLinkedItemType>;
preparedItems: IContentItemWithRawDataContainer;
processingStartedForCodenames: string[];
}
Expand Down Expand Up @@ -145,8 +148,8 @@ export interface IContentItemWithRawDataContainer {
[key: string]: IContentItemWithRawElements;
}

export interface IContentItemsContainer {
[key: string]: IContentItem;
export interface IContentItemsContainer<TLinkedItemType extends IContentItem> {
[key: string]: TLinkedItemType;
}

export interface IRichTextImage {
Expand Down
43 changes: 28 additions & 15 deletions lib/models/responses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,38 +35,51 @@ export namespace Responses {
options: IGenericElementOption[];
}

export interface IListItemsFeedResponse<TContentItem extends IContentItem = IContentItem>
extends IKontentListResponse {
export interface IListItemsFeedResponse<
TContentItem extends IContentItem = IContentItem,
TLinkedItemType extends IContentItem = IContentItem
> extends IKontentListResponse {
items: TContentItem[];
linkedItems: IContentItemsContainer;
linkedItems: IContentItemsContainer<TLinkedItemType>;
}

export interface IListItemsFeedAllResponse<TContentItem extends IContentItem = IContentItem>
extends IKontentListAllResponse {
export interface IListItemsFeedAllResponse<
TContentItem extends IContentItem = IContentItem,
TLinkedItemType extends IContentItem = IContentItem
> extends IKontentListAllResponse {
items: TContentItem[];
responses: IDeliveryNetworkResponse<IListItemsFeedResponse<TContentItem>, Contracts.IItemsFeedContract>[];
responses: IDeliveryNetworkResponse<
IListItemsFeedResponse<TContentItem, TLinkedItemType>,
Contracts.IItemsFeedContract
>[];
}

export interface IListContentItemsResponse<TContentItem extends IContentItem = IContentItem>
extends IKontentListResponse {
export interface IListContentItemsResponse<
TContentItem extends IContentItem = IContentItem,
TLinkedItemType extends IContentItem = IContentItem
> extends IKontentListResponse {
items: TContentItem[];
pagination: IPagination;
linkedItems: IContentItemsContainer;
linkedItems: IContentItemsContainer<TLinkedItemType>;
}

export interface IListContentItemsAllResponse<TContentItem extends IContentItem = IContentItem>
extends IKontentListAllResponse {
export interface IListContentItemsAllResponse<
TContentItem extends IContentItem = IContentItem,
TLinkedItemType extends IContentItem = IContentItem
> extends IKontentListAllResponse {
items: TContentItem[];
responses: IDeliveryNetworkResponse<
IListContentItemsResponse<TContentItem>,
IListContentItemsResponse<TContentItem, TLinkedItemType>,
Contracts.IListContentItemsContract
>[];
}

export interface IViewContentItemResponse<TContentItem extends IContentItem = IContentItem>
extends IKontentResponse {
export interface IViewContentItemResponse<
TContentItem extends IContentItem = IContentItem,
TLinkedItemType extends IContentItem = IContentItem
> extends IKontentResponse {
item: TContentItem;
linkedItems: IContentItemsContainer;
linkedItems: IContentItemsContainer<TLinkedItemType>;
}

export interface IInitializeSyncResponse extends IKontentResponse {
Expand Down
17 changes: 10 additions & 7 deletions lib/query/item/multiple-items-query.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ export class MultipleItemsQuery<
TContentItem extends IContentItem = IContentItem
> extends BaseItemListingQuery<
TClientTypes,
Responses.IListContentItemsResponse<TContentItem>,
Responses.IListContentItemsAllResponse<TContentItem>,
Responses.IListContentItemsResponse<TContentItem, TClientTypes['contentItemType']>,
Responses.IListContentItemsAllResponse<TContentItem, TClientTypes['contentItemType']>,
IItemQueryConfig,
Contracts.IListContentItemsContract
> {
Expand Down Expand Up @@ -113,7 +113,10 @@ export class MultipleItemsQuery<
}

toPromise(): Promise<
IDeliveryNetworkResponse<Responses.IListContentItemsResponse<TContentItem>, Contracts.IListContentItemsContract>
IDeliveryNetworkResponse<
Responses.IListContentItemsResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IListContentItemsContract
>
> {
return this.queryService.getMultipleItems(this.getUrl(), this._queryConfig ?? {});
}
Expand All @@ -130,17 +133,17 @@ export class MultipleItemsQuery<
return super.resolveUrlInternal(action);
}

map(json: any): Responses.IListContentItemsResponse<TContentItem> {
map(json: any): Responses.IListContentItemsResponse<TContentItem, TClientTypes['contentItemType']> {
return this.queryService.mappingService.listContentItemsResponse(json);
}

protected allResponseFactory(
items: any[],
responses: IDeliveryNetworkResponse<
Responses.IListContentItemsResponse<TContentItem>,
Responses.IListContentItemsResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IListContentItemsContract
>[]
): Responses.IListContentItemsAllResponse<TContentItem> {
): Responses.IListContentItemsAllResponse<TContentItem, TClientTypes['contentItemType']> {
this.linkItems(items, responses);

return {
Expand All @@ -152,7 +155,7 @@ export class MultipleItemsQuery<
private linkItems(
items: IContentItem[],
responses: IDeliveryNetworkResponse<
Responses.IListContentItemsResponse<TContentItem>,
Responses.IListContentItemsResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IListContentItemsContract
>[]
): void {
Expand Down
9 changes: 6 additions & 3 deletions lib/query/item/single-item-query.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export class SingleItemQuery<
TContentItem extends IContentItem = IContentItem
> extends BaseQuery<
TClientTypes,
Responses.IViewContentItemResponse<TContentItem>,
Responses.IViewContentItemResponse<TContentItem, TClientTypes['contentItemType']>,
IItemQueryConfig,
Contracts.IViewContentItemContract
> {
Expand Down Expand Up @@ -80,7 +80,10 @@ export class SingleItemQuery<
}

toPromise(): Promise<
IDeliveryNetworkResponse<Responses.IViewContentItemResponse<TContentItem>, Contracts.IViewContentItemContract>
IDeliveryNetworkResponse<
Responses.IViewContentItemResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IViewContentItemContract
>
> {
return this.queryService.getSingleItemAsync(this.getUrl(), this._queryConfig ?? {});
}
Expand All @@ -97,7 +100,7 @@ export class SingleItemQuery<
return super.resolveUrlInternal(action);
}

map(json: any): Responses.IViewContentItemResponse<TContentItem> {
map(json: any): Responses.IViewContentItemResponse<TContentItem, TClientTypes['contentItemType']> {
return this.queryService.mappingService.viewContentItemResponse(json);
}
}
17 changes: 10 additions & 7 deletions lib/query/items-feed/items-feed-query.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ export class ItemsFeedQuery<
TContentItem extends IContentItem = IContentItem
> extends BaseItemListingQuery<
TClientTypes,
Responses.IListItemsFeedResponse<TContentItem>,
Responses.IListItemsFeedAllResponse<TContentItem>,
Responses.IListItemsFeedResponse<TContentItem, TClientTypes['contentItemType']>,
Responses.IListItemsFeedAllResponse<TContentItem, TClientTypes['contentItemType']>,
IItemFeedQueryConfig,
Contracts.IItemsFeedContract
> {
Expand Down Expand Up @@ -94,7 +94,10 @@ export class ItemsFeedQuery<
}

toPromise(): Promise<
IDeliveryNetworkResponse<Responses.IListItemsFeedResponse<TContentItem>, Contracts.IItemsFeedContract>
IDeliveryNetworkResponse<
Responses.IListItemsFeedResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IItemsFeedContract
>
> {
return this.queryService.getItemsFeed(this.getUrl(), this._queryConfig ?? {});
}
Expand All @@ -120,17 +123,17 @@ export class ItemsFeedQuery<
return this;
}

map(json: any): Responses.IListItemsFeedResponse<TContentItem> {
map(json: any): Responses.IListItemsFeedResponse<TContentItem, TClientTypes['contentItemType']> {
return this.queryService.mappingService.itemsFeedResponse(json);
}

protected allResponseFactory(
items: TContentItem[],
responses: IDeliveryNetworkResponse<
Responses.IListItemsFeedResponse<TContentItem>,
Responses.IListItemsFeedResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IItemsFeedContract
>[]
): Responses.IListItemsFeedAllResponse<TContentItem> {
): Responses.IListItemsFeedAllResponse<TContentItem, TClientTypes['contentItemType']> {
if (this.canLinkItems()) {
this.linkFeedItems(items, responses);
}
Expand All @@ -144,7 +147,7 @@ export class ItemsFeedQuery<
private linkFeedItems(
items: TContentItem[],
responses: IDeliveryNetworkResponse<
Responses.IListItemsFeedResponse<TContentItem>,
Responses.IListItemsFeedResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IItemsFeedContract
>[]
): void {
Expand Down
19 changes: 15 additions & 4 deletions lib/services/delivery-query.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,15 @@ export class QueryService<TClientTypes extends ClientTypes> extends BaseDelivery
url: string,
queryConfig: IItemQueryConfig
): Promise<
IDeliveryNetworkResponse<Responses.IViewContentItemResponse<TContentItem>, Contracts.IViewContentItemContract>
IDeliveryNetworkResponse<
Responses.IViewContentItemResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IViewContentItemContract
>
> {
const response = await this.getResponseAsync<Contracts.IViewContentItemContract>(url, queryConfig);

return this.mapNetworkResponse<
Responses.IViewContentItemResponse<TContentItem>,
Responses.IViewContentItemResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IViewContentItemContract
>(this.mappingService.viewContentItemResponse<TContentItem>(response.data), response);
}
Expand All @@ -60,7 +63,12 @@ export class QueryService<TClientTypes extends ClientTypes> extends BaseDelivery
async getItemsFeed<TContentItem extends IContentItem = TClientTypes['contentItemType']>(
url: string,
queryConfig: IItemQueryConfig
): Promise<IDeliveryNetworkResponse<Responses.IListItemsFeedResponse<TContentItem>, Contracts.IItemsFeedContract>> {
): Promise<
IDeliveryNetworkResponse<
Responses.IListItemsFeedResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IItemsFeedContract
>
> {
const response = await this.getResponseAsync<Contracts.IItemsFeedContract>(url, queryConfig);

return this.mapNetworkResponse(this.mappingService.itemsFeedResponse<TContentItem>(response.data), response);
Expand All @@ -75,7 +83,10 @@ export class QueryService<TClientTypes extends ClientTypes> extends BaseDelivery
url: string,
queryConfig: IItemQueryConfig
): Promise<
IDeliveryNetworkResponse<Responses.IListContentItemsResponse<TContentItem>, Contracts.IListContentItemsContract>
IDeliveryNetworkResponse<
Responses.IListContentItemsResponse<TContentItem, TClientTypes['contentItemType']>,
Contracts.IListContentItemsContract
>
> {
const response = await this.getResponseAsync<Contracts.IListContentItemsContract>(url, queryConfig);

Expand Down
12 changes: 6 additions & 6 deletions lib/services/mapping.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ export interface IMappingService<TClientTypes extends ClientTypes> {

itemsFeedResponse<TContentItem extends IContentItem = TClientTypes['contentItemType']>(
data: Contracts.IItemsFeedContract
): Responses.IListItemsFeedResponse<TContentItem>;
): Responses.IListItemsFeedResponse<TContentItem, TClientTypes['contentItemType']>;

viewContentTypeResponse(
data: Contracts.IViewContentTypeContract
): Responses.IViewContentTypeResponse<TClientTypes['contentTypeCodenames']>;

viewContentItemResponse<TContentItem extends IContentItem = TClientTypes['contentItemType']>(
data: Contracts.IViewContentItemContract
): Responses.IViewContentItemResponse<TContentItem>;
): Responses.IViewContentItemResponse<TContentItem, TClientTypes['contentItemType']>;

listContentItemsResponse<TContentItem extends IContentItem = TClientTypes['contentItemType']>(
data: Contracts.IListContentItemsContract
): Responses.IListContentItemsResponse<TContentItem>;
): Responses.IListContentItemsResponse<TContentItem, TClientTypes['contentItemType']>;

viewTaxonomyResponse(
data: Contracts.IViewTaxonomyGroupContract
Expand Down Expand Up @@ -101,7 +101,7 @@ export class MappingService<TClientTypes extends ClientTypes> implements IMappin

itemsFeedResponse<TContentItem extends IContentItem = TClientTypes['contentItemType']>(
data: Contracts.IItemsFeedContract
): Responses.IListItemsFeedResponse<TContentItem> {
): Responses.IListItemsFeedResponse<TContentItem, TClientTypes['contentItemType']> {
const itemsResult = this.itemMapper.mapItems<TContentItem>({
linkedItems: Object.values(data.modular_content),
mainItems: data.items
Expand All @@ -120,7 +120,7 @@ export class MappingService<TClientTypes extends ClientTypes> implements IMappin
*/
viewContentItemResponse<TContentItem extends IContentItem = TClientTypes['contentItemType']>(
data: Contracts.IViewContentItemContract
): Responses.IViewContentItemResponse<TContentItem> {
): Responses.IViewContentItemResponse<TContentItem, TClientTypes['contentItemType']> {
const itemResult = this.itemMapper.mapSingleItemFromResponse<TContentItem>(data);

return {
Expand All @@ -136,7 +136,7 @@ export class MappingService<TClientTypes extends ClientTypes> implements IMappin
*/
listContentItemsResponse<TContentItem extends IContentItem = TClientTypes['contentItemType']>(
data: Contracts.IListContentItemsContract
): Responses.IListContentItemsResponse<TContentItem> {
): Responses.IListContentItemsResponse<TContentItem, TClientTypes['contentItemType']> {
const itemsResult = this.itemMapper.mapMultipleItemsFromResponse<TContentItem>(data);

return {
Expand Down

0 comments on commit 4560adf

Please sign in to comment.