Zum Hauptinhalt springen
Nach der Durchführung einer Auktion für Listings möchten Sie die Gewinner oft mit organischen Ergebnissen kombinieren. Angenommen, Sie erstellen einen Kategoriebereich eines Online-Shops, der auch eine Anzahl gesponserter Produkte anzeigt. Sie benötigen eine Möglichkeit, Ihre Auktionsgewinner in die regulären Kategorieergebnisse “einzufügen”. Diese Seite zeigt die Schritte, die beim Aufbau eines solchen Kategoriebereichs erforderlich sind, aber ähnliche Überlegungen gelten für andere Seiten oder Widgets.

Szenario

Der Kategoriebereich muss Paginierung unterstützen und 3 Produkte pro Seite anzeigen. Wenn möglich, wird das erste Produkt auf jeder Seite ein gesponsertes Produkt sein. Die Produkte auf dieser Kategorieseite haben folgende Struktur:
{
  "id": "sku-367",
  "categoryId": "Shoes",
  "name": "Running shoes",
  "image": "photo_123.jpg",
  "description": "Beautiful and fast running shoes",
  "resolvedBidId": null
}
Die resolvedBidId ist null, wenn das Produkt nicht beworben wird, und enthält eine String-ID, wenn es beworben wird. Unser Ziel ist es, den Pseudocode für einen Endpoint zu haben, der Listen solcher Produkte erstellen könnte.

1. Abfrage Ihrer organischen Ergebnisse

Der erste Schritt besteht darin, Ihre organischen Ergebnisse abzufragen. Die Produkte, die für eine bestimmte Seite und Kategorie angezeigt werden sollten. Der Code dafür könnte so aussehen:
const pageSize = 3;
let products = queryProductsInCategory(pageSize, cursor, categoryId);

console.log(products);
Nehmen wir an, wir müssten diesen Code für die erste Seite der Kategorie Shoes ausführen, und es sind 3 oder mehr Produkte in dieser Kategorie verfügbar. Dieser Code würde dann etwa Folgendes ausgeben:
[
  {
    "id": "sku-367",
    "categoryId": "Shoes",
    "name": "Running shoes",
    "image": "photo_123.jpg",
    "description": "Beautiful and fast running shoes"
  },
  {
    "id": "sku-897",
    "categoryId": "Shoes",
    "name": "Slippers",
    "image": "slippers.jpg",
    "description": "A pair of comfortable slippers"
  },
  {
    "id": "sku-343",
    "categoryId": "Shoes",
    "name": "Dress shoes",
    "image": "dress_shoe_original.jpg",
    "description": "Elegant dress shoes for formal events"
  }
]
Beachten Sie, dass diese Produkte noch nicht das resolvedBidId-Feld haben. Fügen wir es hinzu.
const pageSize = 3;
let products = queryProductsInCategory(pageSize, cursor, categoryId);
products.forEach((prod) => {
  prod.resolvedBidId = null;
});
Jetzt müssen wir berücksichtigen, was passiert, wenn es keine organischen Ergebnisse für diese Seite und Kategorie gibt. Wir möchten wahrscheinlich einen 404-Fehler zurückgeben und keine Auktionen durchführen. Das gibt uns folgenden Code:
const pageSize = 3;
let products = queryProductsInCategory(pageSize, cursor, categoryId);
if (products.length === 0) {
  throw new NotFoundError("no products found");
}

products.forEach((prod) => {
  prod.resolvedBidId = null;
});
Mit dieser Fehlerbehandlung sind wir bereit, eine Auktion durchzuführen.

2. Durchführung einer Auktion

In unserem Szenario möchten wir eine Auktion für einen einzelnen Slot durchführen:
// skip earlier code...

const slots = 1;
const winners = runAuctionForCategory(slots, categoryId);

console.log(winners);
Sie wissen nicht, wie man eine Auktion für eine Kategorie durchführt? Siehe diese Beispiele.
Wenn es Gewinner gibt, würde die Ausgabe des obigen Codes etwa so aussehen:
[
  {
    "rank": 1,
    "type": "product",
    "id": "sku-444",
    "resolvedBidId": "WyJiX01mazE1IiwiMTJhNTU4MjgtOGVhZC00Mjk5LTgzMjctY2ViYjAwMmEwZmE4IiwibGlzdGluZ3MiLCJkZWZhdWx0IiwiIl0="
  }
]
Wenn Sie sich die Gewinner ansehen, werden Sie feststellen, dass sie keine Produktdaten enthalten, nur eine Reihe von IDs. Wir müssen die Produktdaten für diese Gewinner abfragen. Außerdem ist es möglich, dass es keine Gewinner gibt. Es kann einfach keine geeigneten aktiven Kampagnen für diese Auktion geben, aber es gibt viele andere potenzielle Gründe. Wie auch immer, wir müssen diesen Fall berücksichtigen und geben einfach die verfügbaren organischen Ergebnisse in products zurück.
// skip earlier code...

const slots = 1;
const winners = runAuctionForCategory(slots, categoryId);
if (winners.length === 0) {
  return products;
}

3. Abfrage der Produktdaten für Gewinner

Nun, wenn es Gewinner gibt. Wir müssen die Produktdaten für sie abfragen.
// skip earlier code...

const ids = winners.map((x) => x.id);
const promoProducts = queryProductsByIds(ids);

console.log(promoProducts);
Nach unseren vorherigen Beispielen könnte dies etwa Folgendes protokollieren:
[
  {
    "id": "sku-444",
    "categoryId": "Shoes",
    "name": "Wooden clogs",
    "image": "clogs.jpg",
    "description": "Original wooden clogs."
  }
]
Wieder müssen wir die resolvedBidId hinzufügen, um diese Daten zu vervollständigen. Aber diesmal sollten wir sie nicht auf null setzen, da wir jetzt mit beworbenen Produkten arbeiten. Wenn wir annehmen, dass queryProductsByIds Produkte in der gleichen Reihenfolge wie die bereitgestellten ids zurückgibt, können wir die Auktions-IDs wie folgt hinzufügen:
// skip earlier code...

const ids = winners.map((x) => x.id);
const promoProducts = queryProductsByIds(ids);
promoProducts.forEach((prod, i) => {
  prod.resolvedBidId = winners[i].resolvedBidId;
});
Warum ist diese Auktions-ID erforderlich? Die Auktions-ID ist unerlässlich, damit Topsort Ereignisse Auktionen und Kampagnen zuordnen kann.
Jetzt müssen wir nur noch unsere beworbenen Produkte mit den organischen Ergebnissen zusammenführen.

4. Zusammenführung

Wir möchten die beworbenen Produkte am Anfang der Liste anzeigen. Um dies zu erreichen, müssen wir die promoProducts am Anfang der products hinzufügen. Dies kann jedoch dazu führen, dass products mehr Elemente hat als unsere vorgesehene Seitengröße von 3. Wir müssen es also auf diese Seitengröße zuschneiden.
// skip earlier code...

products.unshift(...promoProducts);
return products.slice(0, pageSize);
Jetzt gibt unser Code maximal 3 Produkte zurück, von denen das erste Produkt ein gesponsertes Produkt sein kann.

Vollständiger Code

// query for organic products.
const pageSize = 3;
let products = queryProductsInCategory(pageSize, cursor, categoryId);
if (products.length === 0) {
  throw new NotFoundError("no products found");
}

products.forEach((prod) => {
  prod.resolvedBidId = null;
});

// run an auction.
const slots = 1;
const winners = runAuctionForCategory(slots, categoryId);
if (winners.length === 0) {
  return products;
}

// query product data for winners.
const ids = winners.map((x) => x.id);
const promoProducts = queryProductsByIds(ids);
promoProducts.forEach((prod, i) => {
  prod.resolvedBidId = winners[i].resolvedBidId;
});

// merge results.
products.unshift(...promoProducts);
return products.slice(0, pageSize);