Vai al contenuto

Salva um bloco do rascunho (edição em equipe)

PUT/api/campaigns/{id}/blocks/{blockId}

Auth
Richiede un token
Chiave API:
campaigns:write
X-CommunityId
X-CommunityId Invia l’X-CommunityId della community in cui avviene l’operazione.
Le descrizioni degli endpoint provengono dalla specifica dell’API e per ora sono in portoghese. L’interfaccia intorno è tradotta.

Owner, admin, moderador e financeiro. Só rascunho manual (automática ou outro estado: 409). Grava **um bloco** do corpo (na língua principal do e-mail do disparo), achado pelo `id` dele, com as mesmas regras do `PUT /api/campaigns/{id}` (o tipo pode mudar). Não confere nem muda o `updatedAt` da campanha: duas pessoas salvando blocos diferentes ao mesmo tempo nunca recebem 409.

**Trava de edição (F-174):** se outra pessoa está com esse bloco aberto no editor, **423** com o nome dela (`data.locks[].editor`, nulo quando o chat da comunidade está desligado). Quem está editando recebe o bloco salvo no WebSocket (`block.saved` na sala `item:campaign:{id}`).

Parametri

NomeDoveTipoDescrizione
idobbligatoriopathstring (uuid)
blockIdobbligatoriopathstringO `id` do bloco (`blocks[].id` do `GET`).

Header

NomeTipoDescrizione
X-CommunityIdfacoltativostring (uuid)ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade.

Corpo della richiesta application/json

NomeTipoDescrizione
blockobbligatorioobjectBloco do corpo, na ordem em que aparece. Estáticos: `text`, `button`, `image`. Dinâmicos (lidos **uma vez por disparo, na hora do envio**, só de conteúdo que todo o público pode ver: aprovado, no ar, em espaço e seção abertos a todos os membros, sem plano, grupo ou produto exigido): `latestPosts`, `upcomingEvents`, `newCourses` (cursos publicados desde o disparo anterior), `newClassifieds` (anúncios novos), `course`, `event` e `product`. Um item que deixou de ser visível some do e-mail; ao salvar, um item fixo que não é visível a todos é recusado (422 em `blocks[i]`). Nunca vai conteúdo pago no corpo: o produto é um cartão com link para a loja.
block.idfacoltativostringF-174: identificador persistido do bloco (a trava de edição e a gravação de um bloco só, `PUT …/blocks/{blockId}`, usam ele). Mande de volta o que veio no `GET`; bloco sem `id` (ou com um repetido na lista) ganha um novo ao salvar. · max 64
block.typeobbligatoriotext | button | image | latestPosts | upcomingEvents | course | event | product | newCourses | newClassifieds
block.htmlfacoltativostringSó em `text`. HTML rico, sanitizado como nos posts. `{{nome}}` vira o primeiro nome de cada pessoa.
block.textfacoltativostringSó em `button`. · max 80
block.urlfacoltativostringEm `button` (destino) e `image` (endereço; use o de `POST /api/upload/campaigns/image` ou outro https). Só http ou https.
block.altfacoltativostringSó em `image`. · max 200
block.countfacoltativointegerEm `latestPosts`, `upcomingEvents`, `newCourses` e `newClassifieds`: quantos itens. · ≥ 1, ≤ 10
block.spaceIdfacoltativostring (uuid)Em `latestPosts`: o espaço de conteúdo (nulo = todos os abertos).
block.withinDaysfacoltativointegerEm `upcomingEvents`: janela a partir do dia do envio. · ≥ 1, ≤ 90
block.headingfacoltativostringEm `latestPosts` e `upcomingEvents`: título da seção (padrão traduzido). · max 80
block.courseIdsfacoltativostring (uuid)[]Em `course`: de 1 a 6 cursos, na ordem em que aparecem. Ver `productIds`.
block.eventIdsfacoltativostring (uuid)[]Em `event`: de 1 a 6 eventos, na ordem em que aparecem. Ver `productIds`.
block.productIdsfacoltativostring (uuid)[]Em `product`: de 1 a 6 produtos, sem repetidos, na ordem em que aparecem. Um item mostra o cartão de largura inteira; dois ou mais viram uma grade de 2 por linha no computador e 1 por linha no celular. Ao salvar, todos precisam ser visíveis a todos (senão 422 em `blocks[i]`); no envio, o que deixou de ser visível some e o bloco sem nenhum item some inteiro. Lista inválida (vazia, mais de 6, repetida, id malformado) devolve 422 em `blocks[i].productIds`. Vale igual para `eventIds` e `courseIds`.
block.courseIdfacoltativostring (uuid)Em `course`: forma antiga, de um curso só (equivale a `courseIds` com um item). Na resposta, espelha o primeiro de `courseIds`.
block.eventIdfacoltativostring (uuid)Em `event`: forma antiga, de um evento só (equivale a `eventIds` com um item). Na resposta, espelha o primeiro de `eventIds`.
block.productIdfacoltativostring (uuid)Em `product`: forma antiga, de um produto só (equivale a `productIds` com um item). Se `productIds` vier junto, vale a lista. Na resposta, espelha o primeiro de `productIds`.

Risposte

CodiceDescrizione
200Bloco salvo.
400Requisição inválida — falha de validação.
401Token ausente, inválido ou expirado; token de outra comunidade (o `X-CommunityId` ou o `communityId` do corpo não é o do token); token antigo ou de uma sessão encerrada (troca de senha, convite aceito). Nesses casos a mensagem pede para entrar de novo (`auth.signInAgain`).
403Autenticado, mas sem permissão para esta operação.
404Recurso não encontrado.
409Conflito com o estado atual do recurso.
422Bloco inválido.
423F-174: outra pessoa da equipe está editando o que esta gravação mexe (trava de edição). `errors[0].code` é `locked`; `data.locks` lista o que está travado e quem edita (`editor` nulo quando o chat da comunidade está desligado ou há bloqueio no chat entre as duas pessoas: "outra pessoa da equipe"). Tente de novo quando a pessoa sair do bloco (a trava some sozinha 30 s depois do último sinal dela).
500Erro interno do servidor.

Esempio con curl

curl -X PUT "https://api.memberfy.net/api/campaigns/<id>/blocks/<blockId>" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-CommunityId: $COMMUNITY_ID" \
  -H "Content-Type: application/json" \
  -d '{"block":{"type":"text"}}'