Aller au contenu

Edita, publica ou arquiva um curso

PUT/api/courses/{id}

Auth
Jeton requis
Qui peut l’appeler:
owner
admin
Clé d’API:
courses:write
X-CommunityId
X-CommunityId Envoyez le X-CommunityId de la communauté où l’opération a lieu.
Les descriptions des endpoints viennent directement de la spécification de l’API et sont en portugais pour l’instant. L’interface autour est traduite.

Só owner e admin; o curso é o da comunidade do `X-CommunityId` (outro, 404). Todos os campos são opcionais. **Publicar** é `status: published`; **arquivar** é `status: archived`, que remove o curso do membro e **preserva as matrículas e o progresso** (quem tinha matrícula a mantém, e ela volta a valer se o curso for publicado de novo). `status` aceita `draft`, `published` e `archived`. Erros no campo (400): `title` vazio, `level` ou `status` inválidos, `slug` inválido ou já usado por outro curso da comunidade. O espaço do curso não muda por aqui.

**Certificado:** `certificate` `{ enabled, templateId?, text? }` é opcional e **mescla**: ausente não mexe em nada (gravar título, status etc. nunca muda o certificado); `enabled` ausente mantém o estado. O servidor grava `certificateEnabledAt` na virada de desligado para ligado e o zera ao desligar (modelo e texto ficam). Ligar já ligado não regrava. Regras do `templateId` e do `text` em `CourseCertificateInput`. A resposta traz `data.certificate` (`CourseCertificateConfig`).

**Badge ao concluir:** `completionBadgeId` grava a regra; quem concluir dali em diante ganha o badge (uma vez só: quem já tem não ganha de novo). Perder o certificado não tira o badge.

**Aviso por e-mail:** a primeira passagem de rascunho a `published` agenda o aviso da categoria "Cursos" para quem tem acesso ao espaço (`notifyByEmail`, padrão ligado; 10 minutos depois). Arquivar e publicar de novo não reenvia. A resposta dessa publicação traz `data.emailNotice`.

Paramètres

NomEmplacementTypeDescription
idobligatoirepathstring (uuid)

En-têtes

NomTypeDescription
If-Unmodified-SincefacultatifstringOpcional: a versão lida (`updatedAt` do `GET`), como data HTTP, se não vier `updatedAt` no corpo. Outra gravação depois dela responde 409.
X-CommunityIdfacultatifstring (uuid)ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade.

Corps de la requête application/json

NomTypeDescription
updatedAtfacultatifstring (date-time)Opcional: a versão lida (`updatedAt` do `GET`). Diferente da atual responde 409; sem ela grava sem conferir.
slugfacultatifstring
titlefacultatifstringmax 255
descriptionfacultatifstring
levelfacultatifbeginner | intermediate | advanced
statusfacultatifdraft | published | archived
bannerUrlfacultatifstringURL http ou https, até 2048 caracteres; outro esquema (`javascript:`, `data:`) ou texto longo, 400 em `bannerUrl`. Vazio ou `null` limpa. · max 2048
coverFormatfacultatifBANNER | POSTER | VIDEOProporção da capa: `BANNER` (3:1, padrão), `POSTER` (2:3) ou `VIDEO` (16:9). Opcional; ausente, não muda (na criação, `BANNER`). Outro valor, 400 em `coverFormat`.
isFeaturedfacultatifboolean
tagsJsonfacultatifstring[]
requiredPlanTierfacultatifstringGuardado, mas ignorado.
certificateMinGradefacultatifintegerNota final mínima para o certificado de conclusão; `null` remove. Vale para as próximas emissões, nunca revoga certificado já emitido. Fora de 0 a 100, 400. · ≥ 0, ≤ 100
requireSequentialfacultatifbooleanLiga ou desliga as aulas em sequência (só owner e admin, os demais 403). Ligar com alunos em andamento não fecha aula já concluída; desligar abre tudo na hora. Valor não booleano, 400.
instructorMemberIdfacultatifstring (uuid)Ver `CourseCommunityFieldsInput`.
learningPointsfacultatifstring[]Ver `CourseCommunityFieldsInput`.
leaderboardEnabledfacultatifbooleanVer `CourseCommunityFieldsInput`.
certificatefacultatifobjectCertificado na conclusão do curso. Bloco opcional de `POST` e `PUT /api/courses` (e de `course` em `POST /api/spaces`, no modo "Um curso só"). **Ausente** não mexe em nada: gravar outros campos do curso nunca muda o certificado, e curso novo sem o bloco nasce desligado. `certificateEnabledAt` é do servidor e **não** é enviado: ele grava na virada de desligado para ligado (religar grava de novo) e zera ao desligar; só quem conclui o curso a partir dele tem direito, sem emissão retroativa. Desligar mantém o modelo e o texto. Só owner e admin gravam.
certificate.enabledfacultatifbooleanLiga ou desliga. Ausente mantém o estado atual (desligado num curso novo).
certificate.templateIdfacultatifstring (uuid)Modelo do módulo Certificados. Tem de ser ATIVO e da mesma comunidade: de outra comunidade, 404; rascunho, arquivado ou apagado, 400 (`errors[].param = certificate.templateId`). Ausente mantém; `null` ou sem modelo vale o padrão do sistema (criado sob demanda, com o espaço Certificados se a comunidade não tem um).
certificate.textfacultatifstringTexto do certificado: texto simples (sem HTML), com as variáveis `{nome}`, `{assunto}` (o título do curso) e `{cargaHoraria}`; `[...]` entre colchetes some quando a variável dentro está vazia. Vazio ou `null` usa `config.defaultText`. · max 5000
completionBadgeIdfacultatifstring (uuid)"Badge ao concluir": um badge do catálogo da comunidade (só owner e admin); quem conclui o curso recebe o badge (origem `rule`, `sourceRef` `course:<id>`), sem workflow. `null` tira. Badge que não existe ou de outra comunidade, 422 no campo. A resposta traz `data.completionBadge`.

Réponses

StatutDescription
200Curso atualizado.
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.
409Outra gravação veio antes da versão enviada (`updatedAt` no corpo ou `If-Unmodified-Since`); `data.updatedAt` é a versão atual: recarregue e repita. Cada gravação avisa os editores abertos (`item.saved`, ver `POST /api/realtime/ticket`).
500Erro interno do servidor.

Exemple curl

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