Prévia do material em texto
Fluxo de download das
ferramentas
Objetivo
Permitir download dos conteúdos das ferramentas (exceto exercício) em PDF
Fluxo principal
1. Usuário clica "Baixar"
2. Frontend identifica ferramenta:
Summary Chama action diretamente (materialApi)
Outras ferramentas GET ?download=true (tools-api)
3. Backend detecta download=true:
HomeworkHelp → método específico → todas as questões
Outras ferramentas → método normal → todos os dados disponíveis
4. Frontend: formatToPDF
5. Frontend: downloadPDF
6. Arquivo salvo
Implementação
Backend
Nova rota dedicada (reutiliza o método existente getContentHandler
router.get('/tools/:contentId/download', ToolsController.getContentHandler);
Implementação da versão Simplificada (ferramentas sem
paginação):
Alterações no controller getContentHandler :
Detecta rota de download:
Verifica se req.path().includes('/download')
Fluxo de download das ferramentas 1
Mantém fluxo normal:
Chama o método getContentHandler do handler normalmente
Adiciona contexto de download:
Se for rota /download → adiciona no resultado:
downloadContext: true
success: true
toolName
Implementação da versão com HomeworkHelp:
Nova rota dedicada (reutiliza o método existente getContentHandler )
router.get('/tools/:contentId/download', ToolsController.getContentHandler);
Novo método handleGetAllContent() (específico download) para buscar todas as
questões sem paginação no HomeworkHelpHandler
Novo método findAllQuestionsByContentId() no repositório SEM LIMIT busca tudo)
Lógica condicional no controller para lidar com rota /download
1. Detecta rota de download
const isDownload = req.path().includes('/download');
2. Escolhe fluxo
if (isDownload && toolName === 'homeworkhelp') {
// DOWNLOAD método específico → busca tudo
result = await (handler as HomeworkHelpHandler).handleGetAllConten
t({ contentId, userId });
} else {
// NAVEGAÇÃO método já usado
result = await handler.getContentHandler({ contentId, userId, hasPermi
Fluxo de download das ferramentas 2
ssion, page, limit });
}
3. Adiciona context
if (downloadMode) {
result.downloadContext = true; // visualizador sabe que é download
result.success = true;
result.toolName = toolName;
}
Frontend
A lógica de download é centralizada no ContentToolsService , que identifica o tipo de
handler e executa o fluxo adequado.
Fluxo geral
Mapeia o handler da ferramenta ( action ou service )
getDownloadHandler(toolName) {
const handlers = {
summary: 'summary/downloadSummary', // action
mindmap: new MindmapService(), // service
flashcards: new FlashcardsService(),
homeworkhelp: new HomeworkHelpService()
};
return handlers[toolName]
}
Executa o método principal downloadToolContent() , que orquestra toda a lógica:
Verifica o tipo do handler;
Se for action, dispara a action no store (ex. Summary);
Fluxo de download das ferramentas 3
Se for service, faz o GET do conteúdo com /download, formata
via formatToPDF
Chama o método downloadPDF que gera e baixa o arquivo.
Exemplo de fluxo:
Summary (action) - material-api
1. Usuário clica "Download"
2. handleDownload() → new ContentToolsService('summary')
3. downloadToolContent() → { type: 'action', action: 'summary/downloadSum
mary' }
4. Frontend dispara: store.dispatch('summary/downloadSummary')
5. Action faz: createSummary() → formatToPDF downloadPDF
Mapeia formatter: 'summary/downloadSummary'
Chama action: store.dispatch('summary/downloadSummary')
Fluxo: createSummary() → formatToPDF → downloadPDF
Formatação:
Remove tags HTML e organiza o texto
Cria PDF com pdf-lib?
→ Mindmap (service) - tools-api
1. Usuário clica "Baixar PDF"
2. handleDownload() → new ContentToolsService('mindmap')
3. downloadToolContent() → getToolContentForDownload() → formatToPDF
→ downloadPDF
4. PDF baixado automaticamente
Mapeia formatter: formatter = new MindmapService()
Fluxo de download das ferramentas 4
Fluxo: getToolContent() → formatToPDF → downloadPDF
Formatação:
Localiza o SVG no HTML do D3.js
Converte o SVG em PNG
Embeda o PNG no PDF (sug, pdf-lib)
Fluxo de download das ferramentas 5