Pular para o conteúdo principal

Memberships e escritas em lote

Há dois limites de lote, e eles são números diferentes.

LoteLimiteMétodos
Uma ponte de membershipv2.BRIDGE_MAX_IDS (100) idsadd / remove (e link em propriedades de tipo)
Uma escrita em lotev2.BULK_MAX_ITEMS (50) itensbulkCreate / bulkUpdate / bulkDelete

O primeiro é o maxItems do golden nos 24 schemas de add/remove; o segundo, o maxItems nos 21 schemas de create/update/delete em lote. Dimensionar uma chamada de ponte em 50 funciona, mas desperdiça metade de cada ida e volta; dimensionar uma chamada em lote em 100 lança erro no cliente.

Memberships​

Memberships são add/remove num sub-recurso com o nome da coisa adicionada: primeiro os ids do caminho, depois 1..100 ids (BRIDGE_MAX_IDS). Uma lista vazia ou grande demais lança erro antes de qualquer requisição. Cada chamada envia só o próprio verbo e resolve para os ids que o servidor de fato alterou.

const v2ns = client.v2;

await v2ns.workspaces.projects.cycles.workItems.add("acme", "ENG", cycleId, [itemId]); // -> ["<item id>"]
await v2ns.workspaces.projects.modules.workItems.remove("acme", "ENG", moduleId, [itemId]);
await v2ns.workspaces.releases.labels.add("acme", releaseId, [labelId]);
await v2ns.workspaces.initiatives.projects.add("acme", initiativeId, [projectId]);
await v2ns.workspaces.wiki.collections.members.add("acme", collectionId, [{ member_id: userId, access: 1 }]);

Propriedades de um tipo de work item usam link/unlink, como no app web. unlink apaga os valores daquela propriedade em todos os work items do tipo.

await client.v2.workspaces.projects.workItemTypes.properties.link("acme", "ENG", typeId, [propertyId]);
await client.v2.workspaces.projects.workItemTypes.properties.unlink("acme", "ENG", typeId, propertyId);

Escritas em lote​

bulkCreate / bulkUpdate / bulkDelete sempre respondem HTTP 200, mesmo quando algumas linhas falham: o sucesso parcial é o padrão. A resposta conta succeeded e failed e tem uma entrada por linha em results. Chame v2.raiseForFailures(result) para lançar um PlaneApiError com os errors da primeira falha, ou leia as linhas que falharam com v2.bulkFailures(result).

O limite é de 50 itens por chamada (BULK_MAX_ITEMS), não os 100 que uma ponte de membership aceita. Um lote vazio é recusado no cliente em vez de virar uma operação silenciosa que não faz nada.

import { v2 } from "@hoyasumii/plane";

const result = await client.v2.workspaces.projects.states.bulkCreate("acme", "ENG", [{ name: "QA", color: "#ffffff" }]);
v2.raiseForFailures(result);

// Cada item de bulkUpdate é o patch mais o id alvo.
await client.v2.workspaces.projects.states.bulkUpdate("acme", "ENG", [{ id: "state-1", color: "#000000" }]);

Todo método em lote recebe um último argumento allOrNone (padrão false). Passe true para pedir ao servidor que aplique todas as linhas ou nenhuma.

Para escrever mais de 50 linhas, divida-as você mesmo:

import { v2, v2models } from "@hoyasumii/plane";

const rows: v2models.CreateState[] = [{ name: "QA", color: "#ffffff" }];

for (let start = 0; start < rows.length; start += v2.BULK_MAX_ITEMS) {
const chunk = rows.slice(start, start + v2.BULK_MAX_ITEMS);
v2.raiseForFailures(await client.v2.workspaces.projects.states.bulkCreate("acme", "ENG", chunk));
}