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-CommunityIdEnvoyez le X-CommunityId de la communauté où l’opération a lieu.
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
| Nom | Emplacement | Type | Description |
|---|---|---|---|
idobligatoire | path | string (uuid) |
En-têtes
| Nom | Type | Description |
|---|---|---|
If-Unmodified-Sincefacultatif | string | Opcional: 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-CommunityIdfacultatif | string (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
| Nom | Type | Description |
|---|---|---|
updatedAtfacultatif | string (date-time) | Opcional: a versão lida (`updatedAt` do `GET`). Diferente da atual responde 409; sem ela grava sem conferir. |
slugfacultatif | string | |
titlefacultatif | string | max 255 |
descriptionfacultatif | string | |
levelfacultatif | beginner | intermediate | advanced | |
statusfacultatif | draft | published | archived | |
bannerUrlfacultatif | string | URL http ou https, até 2048 caracteres; outro esquema (`javascript:`, `data:`) ou texto longo, 400 em `bannerUrl`. Vazio ou `null` limpa. · max 2048 |
coverFormatfacultatif | BANNER | POSTER | VIDEO | Proporçã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`. |
isFeaturedfacultatif | boolean | |
tagsJsonfacultatif | string[] | |
requiredPlanTierfacultatif | string | Guardado, mas ignorado. |
certificateMinGradefacultatif | integer | Nota 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 |
requireSequentialfacultatif | boolean | Liga 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. |
instructorMemberIdfacultatif | string (uuid) | Ver `CourseCommunityFieldsInput`. |
learningPointsfacultatif | string[] | Ver `CourseCommunityFieldsInput`. |
leaderboardEnabledfacultatif | boolean | Ver `CourseCommunityFieldsInput`. |
certificatefacultatif | object | Certificado 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.enabledfacultatif | boolean | Liga ou desliga. Ausente mantém o estado atual (desligado num curso novo). |
certificate.templateIdfacultatif | string (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.textfacultatif | string | Texto 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 |
completionBadgeIdfacultatif | string (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
| Statut | Description |
|---|---|
200 | Curso atualizado. |
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. |
409 | Outra 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`). |
500 | Erro 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 '{}'