Pular para o conteúdo principal

Produtos digitais — arquitetura, API e análise técnica

Referência do recurso em 02/11/2026, a partir do código do pepper-api, pepper-front, sabine e pepper-mcp. Os caminhos são relativos à raiz de cada repositório. O plano de origem está em pepper-front/PLANO-PRODUTOS-DIGITAIS.md e o andamento em pepper-front/PROGRESSO-PRODUTOS-DIGITAIS.md.

Entidades​

EntidadeCampos / comportamento relevante
Product.digitalformat (course, mentorship, library), totalHours, accessDays (null = vitalício), sequential, previewEnabled, certificate (enabled, minProgress, minScore, template, signatories) e stats calculado pelo servidor.
ProductModuleTítulo, ordem (index), liberação programada (afterDays ou date), exclusão lógica.
ProductItemkind (video, youtube, audio, pdf, image, link, text, survey, session), required, preview, requireFullView, media (caminho privado products/...), survey, session (startsAt, endsAt, joinUrl, location).
EnrollmentCliente, perfil do cliente, produto, origem (order, manual, subscription, voucher), status (active, completed, expired, revoked), expiresAt, progresso por item e consolidado (percent, score), presença.
CertificateCódigo de verificação, snapshot dos dados na emissão, PDF em caminho privado.
Voucher (kind: access)Código AC-XXXXX-XXXXX por unidade vendida no balcão sem conta; redeemedBy e enrollment após o resgate.

Regras no servidor​

RegraOnde
Conclusão de item a partir do snapshot do player (95% / última página / ao abrir)src/domains/Enrollment/progress.js
Cadeados: ordem, liberação programada, acesso encerradosrc/domains/Enrollment/gate.js
Nota dos questionáriossrc/domains/Enrollment/grade.js
Liberação/reativação de acessosrc/domains/Enrollment/grant.js
Pedido pago → matrículas e códigos; pedido inválido → revogaçãosrc/domains/Order/on-paid.js
Códigos de acessosrc/domains/Voucher/access.js, access.controller.js
Acesso por assinaturasrc/domains/Subscription/digital-access.js
Encontros e presençasrc/domains/ProductModule/sessions.js
Elegibilidade e emissão do certificadosrc/domains/Certificate/eligibility.js, issue.js
Limites de upload e URLs assinadassrc/libs/storage/upload-rules.js, signed-urls.js

Rotas​

GrupoRotasPermissão
ConteúdoGET /product-content/product/:productId; módulos e itens (criar, editar, remover, reordenar); POST /product-content/items/:itemId/upload-urlproductContent
EncontrosGET /product-content/business/:businessId/sessions?start&end (até 93 dias); GET/PUT /product-content/items/:itemId/attendanceproductContent
ParticipantesGET/POST /enrollment/product/:productId; GET .../report; PUT /enrollment/:enrollmentId; PUT .../items/:itemId/completeenrollment
CertificadosGET /certificate/:id, GET .../pdf, POST /certificate/enrollment/:enrollmentId, POST /certificate/product/:productId/previewcertificate
Aluno/customer/me/enrollments (lista, trilha, item, progresso, respostas, certificado); POST /customer/me/vouchers/:code/redeem-access (10/min)conta do cliente
PúblicoGET /public/product/:productId/syllabus; GET /public/certificate/:code—

A documentação OpenAPI de cada domínio está em src/domains/<Domínio>/swagger.js.

Armazenamento​

  • Conteúdo pago fica em products/**, fechado nas storage.rules: o envio e a leitura só acontecem por URL assinada emitida pela API, depois de checar permissão ou matrícula.
  • Anexos e imagens comuns (attachments/**, images/**) só podem ser apagados pela API (DELETE /storage/files, com login). A regra nova do storage.rules ainda não foi publicada: publique depois da API e dos fronts.
  • O bucket precisa de CORS de envio (PUT) e leitura para o upload pelo navegador e o PDF no app.

Frontends​

FluxoEvidência
Cadastro/edição e certificadopepper-front/src/app/product/new, edit, product-digital.ts
Aba Conteúdo, itens e questionáriospepper-front/src/app/product/view/product-content, product-item-modal, product-quiz-modal
Participantes e presençapepper-front/src/app/product/view/product-participants
Meus Conteúdos (web)pepper-front/src/app/learn
Verificação públicapepper-front/src/app/public/certificate
App: dados, matrícula e playersabine/src/app/providers/product.service.ts, enrollment.service.ts, components/content-player, components/pdf-viewer
App: páginassabine/src/app/pages/learn-list, learn-course, learn-item
App: links e notificaçõessabine/src/app/providers/deep-link.ts, push-routing.ts

Agentes (MCP)​

O pepper-mcp expõe o recurso para agentes, agindo em nome de um usuário real (as permissões acima continuam valendo):

ToolUso
pepper_get_product_content, pepper_get_product_syllabusConteúdo e ementa pública.
pepper_list_product_enrollments, pepper_get_product_enrollment_reportParticipantes e funil.
pepper_list_content_sessions, pepper_get_session_attendanceAgenda de encontros e presença.
pepper_get_certificate, pepper_verify_certificateCertificado emitido e verificação pública.
pepper_grant_enrollment, pepper_set_session_attendance, pepper_issue_certificateEscritas, só com PEPPER_MCP_ALLOW_WRITE=1.
pepper_digital_product_overviewPanorama: conteúdo quebrado, funil, participantes parados, próximos encontros.

Pendências técnicas​

  • Migração aditiva das três permissões novas para perfis existentes.
  • Envio de notificações (acesso, certificado, encontro) pela API.
  • Campo de liberação programada de módulos e botão de emissão de certificado na interface.
  • Sincronizar o acesso por assinatura no pagamento automático da mensalidade.
  • Fase de escala (HLS, CDN, relatórios de consumo, offline, cotas), dependente do provedor de vídeo.