{
  "openapi": "3.1.0",
  "info": {
    "title": "Esteira Cenbrap",
    "version": "1.0.0",
    "description": "Produção de conteúdo da CENBRAP. Cada FUNIL é um quadro com as suas próprias etapas e os seus temas; comece por GET /api/etapas para descobrir os funis e as etapas de cada um. Regra dura: a partir da etapa apontada em trava_a_partir_de, o tema só anda com val_tecnica e val_regulatoria marcadas — a API recusa (409) e diz o que falta."
  },
  "servers": [
    {
      "url": "https://esteira.cenbrap.edu.br"
    }
  ],
  "security": [
    {
      "chave": []
    }
  ],
  "components": {
    "securitySchemes": {
      "chave": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    },
    "schemas": {
      "Tema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "titulo": {
            "type": "string"
          },
          "publico": {
            "type": "string",
            "description": "Para quem é este conteúdo"
          },
          "funil_id": {
            "type": "string",
            "format": "uuid",
            "description": "Em qual funil (quadro) o tema vive"
          },
          "estagio": {
            "type": "string",
            "enum": [
              "topo",
              "meio",
              "fundo"
            ],
            "description": "Topo, meio ou fundo de funil"
          },
          "objetivo": {
            "type": "string"
          },
          "cta": {
            "type": "string",
            "description": "Chamada para ação desejada"
          },
          "prioridade": {
            "type": "string",
            "enum": [
              "alta",
              "media",
              "baixa"
            ]
          },
          "etapa": {
            "type": "string",
            "description": "Id de uma das etapas DO FUNIL do tema (veja GET /api/etapas)"
          },
          "prazo": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "responsavel": {
            "type": "string"
          },
          "val_tecnica": {
            "type": "boolean",
            "description": "Precisão clínica conferida pelo especialista"
          },
          "val_tecnica_resp": {
            "type": "string"
          },
          "val_regulatoria": {
            "type": "boolean",
            "description": "Publicidade médica e compliance liberados"
          },
          "val_regulatoria_resp": {
            "type": "string"
          },
          "pecas": {
            "type": "array",
            "description": "Enxoval de canais deste tema",
            "items": {
              "type": "object",
              "properties": {
                "canal": {
                  "type": "string"
                },
                "feito": {
                  "type": "boolean"
                }
              }
            }
          },
          "ordem": {
            "type": "number"
          },
          "concluido_em": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "enxoval": {
            "type": "object",
            "properties": {
              "feitas": {
                "type": "integer"
              },
              "total": {
                "type": "integer"
              }
            }
          },
          "dias_para_o_prazo": {
            "type": "integer",
            "nullable": true
          },
          "atrasado": {
            "type": "boolean"
          },
          "vence_em_5_dias": {
            "type": "boolean"
          },
          "liberado_para_copy": {
            "type": "boolean"
          }
        }
      },
      "Acao": {
        "type": "object",
        "description": "A decisão estratégica que ORIGINA um tema. Salvar a ação escreve o card: titulo, objetivo, publico, responsavel, prioridade, prazo e as peças vêm daqui. A etapa NÃO: essa é da esteira, e o status da ação segue a etapa do card.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "titulo": {
            "type": "string"
          },
          "objetivo_final": {
            "type": "string",
            "description": "O resultado de negócio que ela persegue"
          },
          "descricao": {
            "type": "string"
          },
          "conteudo_mae": {
            "type": "string",
            "description": "O texto que origina o enxoval"
          },
          "conteudo_mae_link": {
            "type": "string"
          },
          "conteudo_mae_links": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Vários links do conteúdo-mãe"
          },
          "investimento": {
            "type": "string"
          },
          "prioridade": {
            "type": "string",
            "enum": [
              "alta",
              "media",
              "baixa"
            ]
          },
          "responsavel": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "nao-iniciada",
              "em-andamento",
              "aguardando-validacao",
              "concluida",
              "pausada"
            ],
            "description": "Segue a etapa do card, menos 'bloqueada', que é decisão humana"
          },
          "prazo": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "cursos": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Vira o publico do card"
          },
          "canais": {
            "type": "array",
            "description": "Cada canal vira uma peça do enxoval do card",
            "items": {
              "type": "object",
              "properties": {
                "nome": {
                  "type": "string"
                },
                "modo": {
                  "type": "string",
                  "enum": [
                    "organico",
                    "pago",
                    "ambos"
                  ]
                },
                "formato": {
                  "type": "string",
                  "enum": [
                    "estatico",
                    "video"
                  ]
                },
                "nota": {
                  "type": "string"
                },
                "copy": {
                  "type": "string"
                }
              }
            }
          },
          "validacoes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "item": {
                  "type": "string"
                },
                "feito": {
                  "type": "boolean"
                },
                "por": {
                  "type": "string"
                }
              }
            }
          },
          "links": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "observacoes": {
            "type": "string"
          },
          "funil_id": {
            "type": "string",
            "format": "uuid",
            "description": "Em qual funil o card desta ação vive"
          },
          "card": {
            "type": "object",
            "nullable": true,
            "description": "Onde o trabalho desta ação está na esteira",
            "properties": {
              "id": {
                "type": "string"
              },
              "funil": {
                "type": "string"
              },
              "etapa": {
                "type": "string"
              },
              "etapa_nome": {
                "type": "string"
              },
              "enxoval": {
                "type": "object",
                "properties": {
                  "feitas": {
                    "type": "integer"
                  },
                  "total": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        }
      },
      "Vocabulo": {
        "type": "object",
        "description": "Um item de uma das listas editáveis do Plano de Ação. É a fonte dos nomes usados em responsavel, cursos e canais[].nome de uma ação — prefira estes valores a inventar sinônimos. Remover é arquivar: as ações guardam o nome.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "tipo": {
            "type": "string",
            "enum": [
              "responsavel",
              "canal",
              "curso"
            ]
          },
          "valor": {
            "type": "string",
            "description": "O texto que aparece na tela"
          },
          "ordem": {
            "type": "number",
            "description": "Menor primeiro; POST /api/vocabulario/ordem renumera"
          },
          "arquivado": {
            "type": "boolean"
          }
        }
      },
      "Anexo": {
        "type": "object",
        "description": "Um arquivo. Anexo de ação e anexo de card são a MESMA linha: o arquivo mora no card e escopo diz de qual gaveta ele veio. O upload é em três passos — POST (assina), PUT no upload.url (arquivo cru), PATCH /api/anexos/{id} {pronto:true}.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "nome": {
            "type": "string"
          },
          "tipo": {
            "type": "string",
            "description": "MIME do arquivo"
          },
          "tamanho": {
            "type": "integer",
            "description": "bytes"
          },
          "escopo": {
            "type": "string",
            "enum": [
              "tema",
              "acao",
              "conteudo-mae",
              "canal"
            ],
            "description": "tema = do card; acao e conteudo-mae = do plano"
          },
          "tema_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "acao_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "pronto": {
            "type": "boolean",
            "description": "Só entra nas listagens depois do PATCH de confirmação"
          },
          "url": {
            "type": "string",
            "nullable": true,
            "description": "Link assinado, vale 1 hora"
          },
          "e_imagem": {
            "type": "boolean"
          }
        }
      }
    }
  },
  "paths": {
    "/api/vocabulario": {
      "get": {
        "summary": "As listas editáveis do plano: responsáveis, canais e cursos, de uma vez",
        "description": "Uma chamada devolve as três listas, cada uma na ordem em que a tela mostra.",
        "parameters": [
          {
            "name": "tipo",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Restringe a um ou vários tipos (responsavel, canal, curso), separados por vírgula"
          },
          {
            "name": "arquivados",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true"
              ]
            },
            "description": "Inclui os itens removidos"
          }
        ],
        "responses": {
          "200": {
            "description": "{tipos, total, vocabulario:{responsavel:[],canal:[],curso:[]}}"
          }
        }
      },
      "post": {
        "summary": "Acrescenta um item ao fim de uma lista",
        "description": "Nome já em uso responde 409. Nome que existia e foi removido é restaurado (200, restaurado:true).",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "tipo",
                  "valor"
                ],
                "properties": {
                  "tipo": {
                    "type": "string",
                    "enum": [
                      "responsavel",
                      "canal",
                      "curso"
                    ]
                  },
                  "valor": {
                    "type": "string"
                  },
                  "ordem": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "restaurado"
          },
          "201": {
            "description": "criado"
          },
          "400": {
            "description": "dados inválidos"
          },
          "409": {
            "description": "já está na lista"
          }
        }
      }
    },
    "/api/vocabulario/{id}": {
      "get": {
        "summary": "Um item do vocabulário",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "ok"
          },
          "404": {
            "description": "não existe"
          }
        }
      },
      "patch": {
        "summary": "Renomeia, reposiciona ou restaura um item",
        "description": "O tipo não muda: um item não troca de lista.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Vocabulo"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "ok"
          },
          "400": {
            "description": "dados inválidos"
          },
          "409": {
            "description": "nome repetido"
          }
        }
      },
      "delete": {
        "summary": "Arquiva o item (nada é apagado)",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "arquivado"
          },
          "404": {
            "description": "não existe"
          }
        }
      }
    },
    "/api/vocabulario/ordem": {
      "post": {
        "summary": "Reordena uma lista inteira de uma vez",
        "description": "Mande os ids na ordem desejada; a API renumera. O que não vier fica no fim, como estava.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "tipo",
                  "ids"
                ],
                "properties": {
                  "tipo": {
                    "type": "string",
                    "enum": [
                      "responsavel",
                      "canal",
                      "curso"
                    ]
                  },
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{tipo, lista}"
          },
          "400": {
            "description": "dados inválidos"
          },
          "404": {
            "description": "id que não está nessa lista"
          }
        }
      }
    },
    "/api/temas/{id}/anexos": {
      "get": {
        "summary": "Os arquivos de um card — inclusive os que a ação dele subiu",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "escopo",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Restringe a gaveta (tema, acao, conteudo-mae, canal), separadas por vírgula"
          }
        ],
        "responses": {
          "200": {
            "description": "{total, anexos}"
          },
          "404": {
            "description": "tema não existe"
          }
        }
      },
      "post": {
        "summary": "Prepara o upload de um arquivo no card",
        "description": "Devolve o registro e upload.url. Suba o arquivo cru com PUT lá e confirme em PATCH /api/anexos/{id}.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "nome"
                ],
                "properties": {
                  "nome": {
                    "type": "string"
                  },
                  "tipo": {
                    "type": "string"
                  },
                  "tamanho": {
                    "type": "integer"
                  },
                  "escopo": {
                    "type": "string",
                    "enum": [
                      "tema",
                      "acao",
                      "conteudo-mae",
                      "canal"
                    ],
                    "default": "tema"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "{anexo, upload}"
          },
          "400": {
            "description": "dados inválidos"
          }
        }
      }
    },
    "/api/acoes/{id}/anexos": {
      "get": {
        "summary": "Os arquivos de uma ação, separados por gaveta",
        "description": "É a mesma tabela do card: por_escopo traz acao e conteudo-mae.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "{acao_id, tema_id, total, anexos, por_escopo}"
          },
          "404": {
            "description": "ação não existe"
          }
        }
      },
      "post": {
        "summary": "Prepara o upload de um arquivo da ação",
        "description": "escopo aceita acao (padrão) ou conteudo-mae. O arquivo aparece também no card da ação.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "nome"
                ],
                "properties": {
                  "nome": {
                    "type": "string"
                  },
                  "tipo": {
                    "type": "string"
                  },
                  "tamanho": {
                    "type": "integer"
                  },
                  "escopo": {
                    "type": "string",
                    "enum": [
                      "acao",
                      "conteudo-mae"
                    ],
                    "default": "acao"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "{anexo, upload, tema_id}"
          },
          "400": {
            "description": "dados inválidos"
          },
          "409": {
            "description": "ação sem card e sem funil para criar um"
          }
        }
      }
    },
    "/api/anexos/{id}": {
      "patch": {
        "summary": "Confirma que o arquivo subiu",
        "description": "Sem isto o anexo não aparece em listagem nenhuma.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "pronto"
                ],
                "properties": {
                  "pronto": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "ok"
          },
          "404": {
            "description": "anexo não existe"
          }
        }
      },
      "delete": {
        "summary": "Apaga o arquivo e o registro",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "removido"
          },
          "404": {
            "description": "anexo não existe"
          }
        }
      }
    },
    "/api/acoes": {
      "get": {
        "summary": "O plano de ação: as decisões que comandam a esteira",
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      },
      "post": {
        "summary": "Cria uma ação — e, com ela, o card dela na esteira",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Acao"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "criada"
          },
          "400": {
            "description": "dados inválidos"
          }
        }
      }
    },
    "/api/acoes/{id}": {
      "get": {
        "summary": "Uma ação e onde o card dela está",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      },
      "patch": {
        "summary": "Altera a ação; o card acompanha na mesma chamada",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Acao"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "ok"
          },
          "400": {
            "description": "dados inválidos"
          }
        }
      },
      "delete": {
        "summary": "Arquiva a ação e tira o card do quadro",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "arquivada"
          }
        }
      }
    },
    "/api/etapas": {
      "get": {
        "summary": "Vocabulário da esteira e quem é você",
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      }
    },
    "/api/funis": {
      "get": {
        "summary": "Lista os funis (quadros), com as etapas e a contagem de temas",
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      },
      "post": {
        "summary": "Cria um funil",
        "description": "Sem `etapas`, o funil nasce com as seis padrão. `trava_a_partir_de` é o id da etapa onde a validação passa a ser obrigatória (\"\" desliga a trava).",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "nome"
                ],
                "properties": {
                  "nome": {
                    "type": "string"
                  },
                  "descricao": {
                    "type": "string"
                  },
                  "etapas": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "nome": {
                          "type": "string"
                        },
                        "hint": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "trava_a_partir_de": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "criado"
          }
        }
      }
    },
    "/api/funis/{id}": {
      "get": {
        "summary": "Um funil com todos os seus temas",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      },
      "patch": {
        "summary": "Renomeia o funil, troca as etapas ou a trava",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      },
      "delete": {
        "summary": "Exclui o funil",
        "description": "Apaga junto os temas dele; exige ?confirmar=true quando houver algum.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "confirmar",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "removido"
          },
          "409": {
            "description": "tem temas dentro"
          }
        }
      }
    },
    "/api/temas": {
      "get": {
        "summary": "Lista temas",
        "parameters": [
          {
            "name": "funil_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "restringe a um funil"
          },
          {
            "name": "etapa",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "uma ou várias, separadas por vírgula"
          },
          {
            "name": "responsavel",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "prioridade",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "alta",
                "media",
                "baixa"
              ]
            }
          },
          {
            "name": "busca",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "trecho do título"
          },
          {
            "name": "atrasados",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true"
              ]
            }
          },
          {
            "name": "ativos",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "true"
              ]
            }
          },
          {
            "name": "limite",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "lista com resumo"
          }
        }
      },
      "post": {
        "summary": "Cria um tema",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Tema"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "criado"
          },
          "400": {
            "description": "dados inválidos"
          }
        }
      }
    },
    "/api/temas/{id}": {
      "get": {
        "summary": "Um tema com seu histórico",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "ok"
          },
          "404": {
            "description": "não existe"
          }
        }
      },
      "patch": {
        "summary": "Atualiza campos do tema",
        "description": "Pode marcar as validações e mover na mesma chamada; a trava avalia o resultado.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Tema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "ok"
          },
          "409": {
            "description": "validação pendente"
          }
        }
      },
      "delete": {
        "summary": "Exclui o tema",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "removido"
          }
        }
      }
    },
    "/api/temas/{id}/mover": {
      "post": {
        "summary": "Move o tema de etapa",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "etapa"
                ],
                "properties": {
                  "etapa": {
                    "type": "string",
                    "description": "Id de uma etapa DO FUNIL deste tema — cada funil tem as suas. Veja GET /api/etapas"
                  },
                  "ordem": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "movido"
          },
          "409": {
            "description": "validação pendente: o corpo diz o que falta"
          }
        }
      }
    },
    "/api/temas/{id}/peca": {
      "post": {
        "summary": "Marca uma peça do enxoval como pronta",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "canal"
                ],
                "properties": {
                  "canal": {
                    "type": "string"
                  },
                  "feito": {
                    "type": "boolean"
                  },
                  "criar_se_nao_existir": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "ok"
          },
          "404": {
            "description": "o tema não tem essa peça"
          }
        }
      }
    }
  }
}