Salva um bloco de um idioma do e-mail (edição em equipe)
PUT/api/emails/{id}/versions/{language}/blocks/{blockId}
- Auth
- Requiere token
- Quién puede:
- owner
- admin
- moderator
- finance
- Clave de API:
- reports:write
- X-CommunityId
X-CommunityIdEnvía el X-CommunityId de la comunidad en la que ocurre la operación.
Las descripciones de los endpoints vienen de la especificación de la API y, por ahora, están en portugués. La interfaz alrededor está traducida.
Owner, admin, moderador e financeiro (e-mail de um e-mail padrão: só owner e admin). Grava **um bloco** da versão daquele idioma, achado pelo `id` dele, com as mesmas regras do `PUT /api/emails/{id}/versions/{language}`. Não confere a versão: duas pessoas salvando blocos diferentes nunca recebem 409. Vale para os próximos envios de todos os disparos que usam o e-mail, como a versão inteira.
**Trava de edição (F-174):** bloco aberto por outra pessoa no editor: **423** com o nome dela. Quem está editando recebe o bloco salvo no WebSocket (`block.saved` na sala `item:email:{id}`).
Parámetros
| Nombre | Dónde | Tipo | Descripción |
|---|---|---|---|
idobligatorio | path | string (uuid) | |
languageobligatorio | path | string | |
blockIdobligatorio | path | string | O `id` do bloco (`versions[].blocks[].id` do `GET`). |
Headers
| Nombre | Tipo | Descripción |
|---|---|---|
X-CommunityIdopcional | string (uuid) | ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade. |
Cuerpo de la solicitud application/json
| Nombre | Tipo | Descripción |
|---|---|---|
blockobligatorio | object | Bloco 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.idopcional | string | F-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.typeobligatorio | text | button | image | latestPosts | upcomingEvents | course | event | product | newCourses | newClassifieds | |
block.htmlopcional | string | Só em `text`. HTML rico, sanitizado como nos posts. `{{nome}}` vira o primeiro nome de cada pessoa. |
block.textopcional | string | Só em `button`. · max 80 |
block.urlopcional | string | Em `button` (destino) e `image` (endereço; use o de `POST /api/upload/campaigns/image` ou outro https). Só http ou https. |
block.altopcional | string | Só em `image`. · max 200 |
block.countopcional | integer | Em `latestPosts`, `upcomingEvents`, `newCourses` e `newClassifieds`: quantos itens. · ≥ 1, ≤ 10 |
block.spaceIdopcional | string (uuid) | Em `latestPosts`: o espaço de conteúdo (nulo = todos os abertos). |
block.withinDaysopcional | integer | Em `upcomingEvents`: janela a partir do dia do envio. · ≥ 1, ≤ 90 |
block.headingopcional | string | Em `latestPosts` e `upcomingEvents`: título da seção (padrão traduzido). · max 80 |
block.courseIdsopcional | string (uuid)[] | Em `course`: de 1 a 6 cursos, na ordem em que aparecem. Ver `productIds`. |
block.eventIdsopcional | string (uuid)[] | Em `event`: de 1 a 6 eventos, na ordem em que aparecem. Ver `productIds`. |
block.productIdsopcional | string (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.courseIdopcional | string (uuid) | Em `course`: forma antiga, de um curso só (equivale a `courseIds` com um item). Na resposta, espelha o primeiro de `courseIds`. |
block.eventIdopcional | string (uuid) | Em `event`: forma antiga, de um evento só (equivale a `eventIds` com um item). Na resposta, espelha o primeiro de `eventIds`. |
block.productIdopcional | string (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`. |
Respuestas
| Código | Descripción |
|---|---|
200 | Bloco salvo. |
400 | Requisição inválida — falha de validação. |
401 | Token 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`). |
403 | Autenticado, mas sem permissão para esta operação. |
404 | Recurso não encontrado. |
422 | Bloco inválido (as regras da versão inteira). |
423 | F-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). |
500 | Erro interno do servidor. |
Ejemplo con curl
curl -X PUT "https://api.memberfy.net/api/emails/<id>/versions/<language>/blocks/<blockId>" \
-H "Authorization: Bearer $TOKEN" \
-H "X-CommunityId: $COMMUNITY_ID" \
-H "Content-Type: application/json" \
-d '{"block":{"type":"text"}}'