1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/**
Data Fetching for Sponsored Search.
*/
import { ads } from "../../api/typings/constants";
import { asString, isNullOrEmpty } from "../../foundation/json-parsing/server-data";
import { attributeAsDictionary } from "../../foundation/media/attributes";
import { dataCollectionFromDataContainer, } from "../../foundation/media/data-structure";
import { allProductVariantIdsForData, productVariantDataForData, productVariantIDForVariantData, } from "../product-page/product-page-variants";
import { adLogger } from "./search-ads";
import * as content from "../content/content";
// region exports
/**
* Fetch the set of processed search ads with the raw adverts in the sequential response.
* @param sponsoredSearchRequestData The request data to fetch processed ads for.
* @param searchTerm The search term to fetch processed adverts for.
* @param fetchResponse The promise that will resolve to the response.
* @returns A promise that will provide `SponsoredSearchNativeAdvertData`. Note that even error conditions are represented in the result for instrumentation purposes.
*/
export async function fetchSponsoredSearchNativeAdvertData(objectGraph, sponsoredSearchRequestData, searchTerm, fetchResponse) {
var _a;
if (!sponsoredSearchRequestData.validAdRequest()) {
adLogger(objectGraph, `ODML fetch skipped - Malformed request`);
return {
adverts: [],
odmlSuccess: false,
};
}
/**
* This is a weird path where we:
* 1. Fetch response from search
* 2. Pass parts of the response back to native to be modified by SearchAds.
*/
const response = await fetchResponse;
const adverts = sponsoredSearchAdvertsFromResponse(objectGraph, response);
const organics = sponsoredSearchOrganicsFromResponse(objectGraph, response, 1); // per POR, only 1 organic for now.
try {
if (!objectGraph.isAvailable(ads)) {
adLogger(objectGraph, `ODML fetch skipped - Unsupported client`);
return {
adverts: adverts,
odmlSuccess: false,
};
}
else {
const processedAdverts = await objectGraph.ads.processAdvertsForSponsoredSearch(adverts, organics, searchTerm, objectGraph.bag.sponsoredSearchODMLTimeout, objectGraph.client.isPhone || objectGraph.client.isPad);
if (!processedAdverts.odmlSuccess) {
adLogger(objectGraph, `ODML processing failed`);
}
else {
adLogger(objectGraph, `ODML processing completed`);
}
return {
adverts: (_a = processedAdverts.adverts) !== null && _a !== void 0 ? _a : adverts,
odmlSuccess: processedAdverts.odmlSuccess,
installedStates: processedAdverts.installedStates,
appliedPolicy: processedAdverts.appliedPolicy,
appStates: processedAdverts.appStates,
};
}
}
catch (e) {
adLogger(objectGraph, `ODML fetch failed - ${e}`);
return {
adverts: adverts,
odmlSuccess: false,
};
}
}
// endregion
// region internals
/**
* Build the search advert models from the response.
*/
function sponsoredSearchAdvertsFromResponse(objectGraph, response) {
const adverts = dataCollectionFromDataContainer(response.results["ads-result"]);
const bridgedAdverts = [];
for (const ad of adverts) {
const id = asString(ad, "id");
const adData = attributeAsDictionary(ad, "iads");
if (isNullOrEmpty(id) || isNullOrEmpty(adData)) {
continue;
}
let productVariantId = null;
let allProductVariantIds = null;
if (objectGraph.bag.enableCPPInSearchAds) {
const productVariantData = productVariantDataForData(objectGraph, ad);
productVariantId = productVariantIDForVariantData(productVariantData);
allProductVariantIds = allProductVariantIdsForData(objectGraph, ad);
}
bridgedAdverts.push({
instanceId: objectGraph.random.nextUUID(),
adamId: id,
assetInformation: {},
adData: adData,
cppIds: allProductVariantIds,
serverCppId: productVariantId,
selectedCppId: productVariantId,
appBinaryTraits: content.appBinaryTraitsFromData(objectGraph, ad),
});
}
return bridgedAdverts;
}
/**
* Build the search organic models from the response, up to `limit`.
*/
function sponsoredSearchOrganicsFromResponse(objectGraph, response, limit) {
const organics = dataCollectionFromDataContainer(response.results.search);
const bridgedOrganics = [];
for (const result of organics) {
const id = asString(result, "id");
if (isNullOrEmpty(id)) {
continue;
}
bridgedOrganics.push({
adamId: id,
assetInformation: {},
});
}
return bridgedOrganics;
}
// endregion
//# sourceMappingURL=sponsored-search-fetching.js.map
|