Shopware 6 | API | Fehler bei Patch auf product

Hallo zusammen,

ich benötige mal wieder eure Hilfe und bin sehr dankbar das es euch gibt.

Wenn ich einen Patch auf Produkte mit folgendem Payload durchführe erhalte ich eine „FRAMEWORK__WRITE_TYPE_INTEND_ERROR“ Fehlermeldung (ganze Fehlermeldung - siehe ganz unten). Wenn ich den gleichen Payload nehme um ein Produkt anzulegen mit dem Endpoint mit Post auf /api/product anzulegen funktioniert dieses Einwandfrei.

Was mache ich falsch. Freue mich über jede Hilfe.

Payload;
https://w3movyaf5t4pcsqse7bdevs.s3.eu-west-1.amazonaws.com/Shopware6-Patch-Product-payload.json

Fehlermdeldung:

{
    "errors": [
        {
            "status": "500",
            "code": "FRAMEWORK__WRITE_TYPE_INTEND_ERROR",
            "title": "Internal Server Error",
            "detail": "Expected command for \"Shopware\\Core\\Content\\Product\\ProductDefinition\" to be \"Shopware\\Core\\Framework\\DataAbstractionLayer\\Write\\Command\\UpdateCommand\". (Got: Shopware\\Core\\Framework\\DataAbstractionLayer\\Write\\Command\\InsertCommand)",
            "meta": {
                "parameters": {
                    "definition": "Shopware\\Core\\Content\\Product\\ProductDefinition",
                    "expectedClass": "Shopware\\Core\\Framework\\DataAbstractionLayer\\Write\\Command\\UpdateCommand",
                    "actualClass": "Shopware\\Core\\Framework\\DataAbstractionLayer\\Write\\Command\\InsertCommand"
                }
            }
        }
    ]
}

Eigentlich steht es ja schon in der Fehlermeldung drin, sprich Du machst ein Insert (also einen HTTP POST) aber eigentlich wird halt ein Update (= HTTP PATCH) erwartet.

Vermutlich lässt Du Dich hier von der Behandlung der IDs fehlleiten. Als MySQL Nutzer ist man eigentlich gewohnt dass die DB selbst die IDs vergibt. Sprich man sendet ein Datenpaket als insert und macht das 100mal und als Ergebnis gibt es 100 Sätze.
Hier ist das aber anders ! Der Client erzeugt die UUID und dann geht das Insert genau 1mal und danach kommt der Fehler oben.

@CarstenHarnisch Vielen Dank für Deine Hilfe. Komisch ich habe bei Postman PATCH eingestellt aber es geht dennoch nicht. Was muss ich ändern damit es funktioniert? Kannst Du mir näher erläutern welche ids ich weglassen muss damit ein PATCH funktioniert? Ich gehe dabei so vor: Ich erstelle beispielsweise die Kategorie ID in dem ich beim jeweiligen Endpunkt die Kategorie erstelle und die dann als response gemeldete ID dann für das POST also das anlegen von Artikeln verwende. Wenn ich jedoch danach per Patch etwas ändern möchte kommt es zur genannten Fehlermeldung. Ich hoffe Du hast noch eine Idee damit es funktioniert.

Dein beschriebenes Vorgehen ist so genau richtig. Aber es geht ja hier um die Änderung an einem Produkt. Also VOR dem Insert/POST für das Produkt eine UUID (Produkt-ID) erzeugen und evtl. auch eine eindeutige Produkt-Nr (SKU). Also letztlich das gleiche Vorgehen, wie bei den Kategorien.

Später dann die Produkt-ID nutzen bei einer Änderung (update/PATCH). Sprich die Daten für einen Patch bestehen minimal aus der UUID und einer Feld-Wert Kombi.

@CarstenHarnisch Nochmals Danke das Du mir hilfst. Ich mache ein POST auf product und dann erhalte ich als response eine ID vom gerade angelegten Produkt. Diese verwende ich auch für den PATCH (in der URL: gebe ich dann die ID an) aber da erhalte ich die genannte Fehlermeldung. Ich hoffe Du oder gerne jemand anderes findest den Fehler. Da ich sonst einfach das Produkt löschen werde um es dann neu anzulegen.

Hmm, was ist das für eine Programmiersprache, die Du nutzt ? Magst Du mal einen Ausschnitt posten von der Update-Routine. Es scheint ja wohl so zu sein, dass der Server die Patch-Methode nicht erkennt !
Ist Content-Type gesetzt im HTTP-Request ?

@CarstenHarnisch Hier nun mein Java Code (OkHttp3) den ich verwende:

String smaUrl = "http://shopware.none/api/product/<idDesProduktes>";

RequestBody body = RequestBody.create(MediaType.parse("application/json"), smaResultForApi);
Request request = new Request.Builder().url(smaUrl)
	.addHeader("Authorization", "Bearer " + smaApiGetToken())
	.addHeader("Accept", "application/vnd.api+json").patch(body).build();
try (Response response = client.newCall(request).execute()) {
        

smaResultForApi beeinhaltet dabei den JSON payload von weiter oben.
Vielen Dank an jeden der mir hilft.

Gruß
Sven

HI,
hast du das Problem damals lösen können? Stecke grad in der selber Situation…

Hallo zusammen

Auch ich reihe mich in die Schlange der wartenden ein. Mit einer älteren Shopwareversion konnte ich über einen Artikel-Patch ein neues Variantenprodukt als Children Array mitgegeben.
Durch das Ausführen des Patches wurde nicht nur der Artikel aktualisiert, vielmehr noch wurde die neue Variante sauber angelegt und mit dem Hauptartikel erfolgreich im Backend & Frontend verknüpft.
Leider funktioniert diese wertvolle Funktion nun nicht mehr, was uns wiederum viel Arbeit beschert.

@Klimax: Hast Du bereits eine Lösung gefunden?
@s-a : Wie sieht Dein Lösungsansatz aus?

Also ich bin heute in den selben Fehler reingerannt :frowning:

Mein Request:

export default async function pathProduct(req, res) {
  let headers = {
    Accept: "application/json",
    "Content-Type": "application/json",
    Authorization: req.body.token,
  };

  const PRODUCT_PARENT_ID = "34be072942d44daf920344f567793f50";
  const STOCK_CHILDREN = 9999;
  const VARIANT_ID_50X150 = "26819a63300b4de8ba49ff30c9cf6b71";
  const VARIANT_ID_20X30 = "b16f551dd20f454484a2c8dd6bee7026";

  const API = process.env.SHOP_ENDPOINT;
  const ENDPOINT = "/api/product/" + PRODUCT_PARENT_ID;
  const apiUrl = new URL(API + ENDPOINT);

  fetch(apiUrl.href, {
    method: "PATCH",
    headers: headers,
    body: JSON.stringify({
      children: [
        {
          productNumber: PRODUCT_PARENT_ID + ".1",
          stock: STOCK_CHILDREN,
          price: [
            {
              currencyId: "b7d2554b0ce847cd82f3ac9bd1c0dfca",
              gross: 1,
              net: 1,
              linked: false,
            },
          ],
          options: [
            { id: VARIANT_ID_50X150 }, // 50x150
          ],
        },
        {
          productNumber: PRODUCT_PARENT_ID + ".2",
          stock: STOCK_CHILDREN,
          price: [
            {
              currencyId: "b7d2554b0ce847cd82f3ac9bd1c0dfca",
              gross: 2,
              net: 2,
              linked: false,
            },
          ],
          options: [
            { id: VARIANT_ID_20X30 }, // 20x30
          ],
        },
      ],
    }),
  })
    .then(async (response) => {
      let resp = await response.json();
      console.log(resp);
      response.json();
    })
    .then((json) => {
      res.status(200).send(json);
    });
}

Fehlermeldung:

{
  errors: [
    {
      status: '500',
      code: 'FRAMEWORK__WRITE_TYPE_INTEND_ERROR',
      title: 'Internal Server Error',
      detail: 'Expected command for "product" to be "Shopware\\Core\\Framework\\DataAbstractionLayer\\Write\\Command\\UpdateCommand". (Got: Shopware\\Core\\Framework\\DataAbstractionLayer\\Write\\Command\\InsertCommand)',
      meta: [Object]
    }
  ]
}

Gibt es hier mittlerweile eine Lösung? Bekomme gerade exakt denselben Fehler beim PATCH zurück. Sehr seltsam. Gestern haben PATCH-Requests bei mir noch funktioniert.

OK, die Lösung: es wurde eine falsche ID übergeben. Die ID stammte aus einem fehlerhaften Feld im ERP. Mit der richtigen productId klappt es wieder.