MODULO 3.7 EXERCICIO FINAL

๐Ÿš€ SaaS Funcional (Exercicio Integrador)

Este e o modulo final da Trilha 3. Tudo que voce aprendeu -- auth, dashboard, IA, upload, estados, historico -- se junta aqui em um produto funcional. O objetivo: sair com um SaaS que um usuario real consegue usar do login ao historico.

6
Topicos
60 min
Duracao
Intermediario
Nivel
Pratica
Tipo
1

๐Ÿ”— Integrando Auth + Dashboard + AI

Ate agora, cada peca foi construida separadamente. Auth funciona. Dashboard renderiza. IA responde. Upload processa. O desafio agora e diferente: fazer tudo conversar. O login alimenta o dashboard, o dashboard mostra conversas, as conversas usam o pipeline de IA. Nenhuma peca funciona isolada num produto real.

๐ŸŽฏ Conceito Principal

A integracao segue um fluxo linear que precisa ser bulletproof: se qualquer elo da corrente quebra, o usuario fica preso. O fluxo e:

  • โ€ข Auth โ†’ Session: Login com Supabase retorna JWT. Esse token e armazenado e enviado em todo request subsequente. Sem token valido, nenhuma rota funciona
  • โ€ข Session โ†’ Dashboard: O token carrega o user_id. O dashboard busca conversas WHERE user_id = token.sub. Sidebar popula automaticamente. Row Level Security (RLS) no Supabase garante que usuario A nunca ve dados de B
  • โ€ข Dashboard โ†’ AI Pipeline: Quando o usuario envia mensagem, o frontend passa o token + conversation_id + message. O backend valida o token, busca o historico da conversa, monta o array de messages com system prompt, e chama a API da LLM
  • โ€ข AI Pipeline โ†’ Storage: A resposta e salva no banco (messages table) e streamada para o frontend. Anexos vao para o Supabase Storage com referencia na tabela attachments

๐Ÿ—๏ธ Arquitetura de Integracao

Fluxo completo de um request:
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” JWT โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” query โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Login โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ โ”‚ Session โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ โ”‚Dashboardโ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚ msg
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” stream โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” messages โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚Response โ”‚ โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ LLM API โ”‚ โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ Backend โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚ save
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Supabase โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ’ป Middleware de Auth para API Routes

// middleware/auth.ts - protege todas as rotas da API
export async function requireAuth(req, res, next) {
const token = req.headers.authorization?.split('Bearer ')[1];
if (!token) return res.status(401).json({
error: 'Voce precisa estar logado para acessar isso.'
});
const { data: { user }, error } = await supabase.auth.getUser(token);
if (error || !user) return res.status(401).json({
error: 'Sessao expirada. Faca login novamente.'
});
req.user = user; // disponivel em todas as rotas
next();
}

๐Ÿ’ก Dica Pratica

Teste o fluxo completo em sequencia, nao cada peca isolada. Crie uma conta nova, faca login, crie uma conversa, envie uma mensagem com arquivo, receba a resposta, feche o browser, reabra e veja se tudo esta la. Se qualquer etapa falhar, e um bug de integracao que testes unitarios nunca pegam.

2

๐Ÿ”€ Fluxo Completo do Usuario

O fluxo end-to-end e o teste definitivo do seu SaaS. Cada etapa precisa funcionar perfeitamente e transicionar para a proxima sem friccao. Se o usuario sentir um "bump" entre o registro e o primeiro uso, voce esta perdendo gente.

๐ŸŽฏ O Fluxo End-to-End

Cada etapa tem seus proprios desafios de UX e pontos de falha. Mapeie todos antes de comecar a implementar:

1

Register

Formulario com email + senha ou OAuth (Google). Validacao em tempo real (email valido, senha forte). Enviar email de confirmacao. Redirecionar para onboarding apos confirmar.

Ponto critico: 40% de abandono se pedir mais de 3 campos
2

Onboard

Coletar nome, caso de uso principal, preferencias. Pode ser 1-3 telas com progress bar. Mostrar o valor do produto imediatamente. "Qual e seu primeiro projeto?" ja cria uma conversa automaticamente.

Ponto critico: Nao pedir info que nao sera usada nas proximas 24 horas
3

Create Conversation

Botao "Nova Conversa" cria registro no banco e abre a area de chat. Auto-titulo gerado apos a primeira interacao. Conversa aparece imediatamente na sidebar.

Ponto critico: A primeira conversa pode ser criada automaticamente no onboarding
4

Send Message

Usuario digita e envia. Mensagem aparece no chat imediatamente (optimistic update). State transiciona para loading. Input e desabilitado. Typing indicator aparece.

Ponto critico: Optimistic update faz parecer instantaneo mesmo em conexao lenta
5

Get AI Response

Backend monta messages array, chama LLM com streaming, tokens chegam ao frontend em tempo real. Resposta completa e salva no banco. State transiciona para success e depois idle.

Ponto critico: Streaming e obrigatorio. Sem ele, 5-15s de tela parada
6

View History

Sidebar lista todas as conversas. Clicar carrega as mensagens com paginacao. Busca por texto. Fechar e reabrir o browser mantem tudo. Multi-device sincronizado.

Ponto critico: Sem historico, seu SaaS e descartavel

๐Ÿ“Š Metricas de Referencia para o Fluxo

  • โ€ข Time to first value: Do registro ate a primeira resposta da IA em menos de 2 minutos. Se demorar mais, simplifique o onboarding
  • โ€ข Completion rate: 80%+ dos que comecam o registro devem chegar a enviar a primeira mensagem. Menos que isso indica friccao no fluxo
  • โ€ข Return rate (D1): 30%+ dos usuarios devem voltar no dia seguinte. Se nao voltam, o historico e a qualidade da IA nao estao bons o suficiente
3

โœจ Polishing a Interface

O "polishing" e a diferenca entre um projeto de portfolio e um produto que alguem pagaria para usar. Nao e sobre redesign, e sobre 10 ajustes rapidos que elevam drasticamente a percepcao de qualidade. Cada um leva 5-15 minutos.

๐ŸŽฏ 10 Quick UX Wins

1
Dark mode toggle - localStorage para persistir. Transicao suave com CSS transition. Respeitar prefers-color-scheme do sistema como default
2
Responsive audit - Testar em 320px, 768px e 1440px. Sidebar vira drawer no mobile. Input bar fixa na base. Textos nao quebram
3
Loading states review - Verificar que TODAS as chamadas de API tem loading state. Nenhum botao sem feedback ao clicar
4
Error handling audit - Desconectar internet e testar. Enviar request invalido. Verificar que toda mensagem de erro e user-friendly
5
Keyboard shortcuts - Enter para enviar, Shift+Enter para nova linha, Cmd+K para busca, Escape para fechar modais. Usuarios power adoram
6
Empty states - Quando nao tem conversas, nao mostrar lista vazia. Mostrar "Comece sua primeira conversa!" com botao de acao
7
Copy to clipboard - Botao de copiar em cada resposta da IA. Feedback visual "Copiado!" por 2 segundos. Formatar como markdown para paste
8
Auto-scroll inteligente - Scroll automatico para baixo durante streaming. Mas se o usuario scrollou para cima manualmente, nao forcar scroll
9
Favicon e titulo dinamico - Mudar o titulo da aba para "Nova mensagem..." quando IA responder com a aba em background. Notificacao sutil
10
Textarea auto-resize - O input cresce conforme o usuario digita. Max 6 linhas, depois scroll interno. Muito melhor que textarea fixa

๐Ÿ’ก Dica Pratica

Nao tente implementar os 10 de uma vez. Escolha os 3 que mais impactam a primeira experiencia do usuario: loading states, empty states e responsive. O resto e iteracao pos-lancamento.

4

๐Ÿงช Testes de Integracao Rapidos

Voce nao precisa de um framework de testes sofisticado para validar que seu SaaS funciona. O que voce precisa e de um checklist de QA manual que cobre os fluxos criticos. Teste como um usuario, nao como um dev.

๐ŸŽฏ Checklist de QA Manual

Auth Flow

โ˜ Criar conta com email/senha funciona
โ˜ Login com Google OAuth funciona
โ˜ Logout limpa sessao e redireciona
โ˜ Rota protegida redireciona para login sem token
โ˜ Token expira e refresh funciona silenciosamente

AI Pipeline

โ˜ Mensagem enviada e resposta recebida com streaming
โ˜ System prompt esta sendo aplicado (IA se comporta como configurado)
โ˜ Historico da conversa e enviado (IA lembra do contexto)
โ˜ Erro de API mostra mensagem amigavel com retry

File Upload

โ˜ Upload de PDF funciona e conteudo e extraido
โ˜ Upload de imagem funciona e IA "ve" o conteudo
โ˜ Arquivo grande demais mostra erro claro (nao crash)
โ˜ Formato invalido e rejeitado com mensagem

Conversation CRUD

โ˜ Criar nova conversa funciona
โ˜ Clicar em conversa da sidebar carrega mensagens
โ˜ Deletar conversa remove da sidebar e do banco
โ˜ Fechar browser e reabrir: historico persiste

๐Ÿ’ก Dica Pratica

Grave a tela enquanto testa. Use o gravador de tela nativo do seu OS. Quando encontrar um bug, o video ja esta la. E tambem serve como material para o Demo Day (topico 6).

5

โšก Performance Basica

Performance nao e otimizacao prematura quando afeta a experiencia do usuario. Um dashboard que leva 5 segundos para carregar parece quebrado. 4 ajustes basicos resolvem 80% dos problemas de performance sem complexidade.

๐ŸŽฏ Os 4 Pilares de Performance para SaaS

  • โ€ข
    Image Optimization:

    Usar WebP ao inves de PNG/JPEG. Lazy loading com loading="lazy" em imagens fora da viewport. Next.js Image component faz isso automatico. Avatares: max 100x100px, nao 500x500.

  • โ€ข
    Lazy Loading de Componentes:

    Nao carregar o editor de codigo se o usuario esta na pagina de login. React.lazy() + Suspense para code splitting. Reduz bundle inicial em 30-50%.

  • โ€ข
    API Response Caching:

    Conversas ja carregadas nao precisam ser buscadas novamente. Cache local com SWR ou React Query. Stale-while-revalidate: mostra cache primeiro, atualiza em background.

  • โ€ข
    Database Query Optimization:

    Indices nas colunas usadas em WHERE (user_id, conversation_id, created_at). Paginacao com cursor ao inves de OFFSET. Select apenas colunas necessarias, nao SELECT *.

๐Ÿ’ป Lighthouse Audit Basico

Abra o Chrome DevTools > Lighthouse > Generate report. Os numeros que importam para MVP:

90+
Performance
LCP < 2.5s
90+
Accessibility
Alt texts, contrast
80+
Best Practices
HTTPS, console clean
80+
SEO
Meta tags, viewport

๐Ÿ’ก Dica Pratica

SWR (stale-while-revalidate) e o melhor amigo de SaaS com IA. A sidebar carrega conversas do cache instantaneamente enquanto busca atualizacoes em background. O usuario nunca ve loading na sidebar apos a primeira vez. npm install swr e 10 linhas de codigo.

โœ“ O que FAZER

  • โœ“ Lazy load de imagens e componentes pesados
  • โœ“ Cache de API responses com SWR/React Query
  • โœ“ Indices no banco para queries frequentes

โœ— O que NAO fazer

  • โœ— Otimizar prematuramente antes de medir (profile first)
  • โœ— Carregar 500 conversas na sidebar de uma vez
  • โœ— Ignorar o Lighthouse ate o lancamento
6

๐ŸŽฌ Exercicio: Demo Day

Este e o exercicio final da Trilha 3. Voce vai gravar um video de 2 minutos demonstrando seu SaaS funcional. Nao precisa ser perfeito. Precisa funcionar de ponta a ponta. Se funciona no video, funciona na vida real.

๐ŸŽฌ

Exercicio Final: Gravar Demo de 2 Minutos

Tempo de preparacao: 45-60 minutos | Gravacao: 2 minutos

O video deve cobrir o fluxo completo do usuario. Use o gravador de tela nativo (QuickTime no Mac, OBS no Windows/Linux). Nao edite, nao adicione musica, nao faqa intro. Direto ao ponto.

0:00

Login/Register

Abrir o app. Mostrar a tela de login. Fazer login (ou registrar conta nova). Mostrar que redireciona para o dashboard.

0:20

Dashboard + Nova Conversa

Mostrar o dashboard com sidebar. Criar nova conversa. Mostrar que aparece na sidebar.

0:40

Chat com IA

Enviar uma mensagem. Mostrar o loading/streaming. Receber resposta. Enviar follow-up para provar que o contexto persiste.

1:10

Upload de Arquivo

Anexar um PDF ou imagem. Mostrar preview. Enviar com uma pergunta sobre o arquivo. Mostrar que a IA entende o conteudo.

1:30

Historico Persistente

Trocar para outra conversa na sidebar. Voltar. Mostrar que mensagens estao la. Fechar e reabrir o browser rapidamente para provar persistencia.

1:50

Polish

Mostrar dark mode toggle. Mostrar que funciona no mobile (ou resize do browser). Logout.

โœ… Checklist Final da Trilha 3

Antes de gravar, verifique cada item. Se todos funcionam, seu SaaS esta pronto para o Demo Day.

โ˜ Auth funciona (login, register, logout)
โ˜ Dashboard com sidebar + area de chat
โ˜ IA responde com streaming
โ˜ Upload de arquivo processado pela IA
โ˜ Historico persiste entre sessoes
โ˜ Loading/error states visiveis
โ˜ Dark mode toggle funciona
โ˜ Responsivo (funciona em mobile)
โ˜ Video de 2 min gravado
โ˜ Nenhum crash ou erro nao tratado

๐ŸŒŸ Bonus

Compartilhe o video no grupo da imersao ou nas redes sociais. Mostre o que voce construiu. Feedback de outros devs e a melhor forma de melhorar. Se quiser ir alem, faqa um deploy no Vercel e compartilhe o link. Um SaaS que roda em producao vale mais do que qualquer portfolio.

๐Ÿ“‹ Resumo Final - Trilha 3: Construcao do SaaS

Tudo que voce aprendeu nesta trilha, de auth ate o Demo Day.

โœ“
Autenticacao e onboarding - Supabase Auth, JWT, social login, onboarding de primeiro acesso. A porta de entrada do SaaS.
โœ“
Dashboard e interface - Sidebar + area central + input bar. Conversation-centered. Layout padrao do ChatGPT como base.
โœ“
System prompts e pipeline - Identidade, capacidades, restricoes, formato. Temperature baixa. Versionar como codigo.
โœ“
Upload multimodal - PDF e imagens no MVP. Chunking, vision models, Supabase Storage. Video e audio sao v2.
โœ“
Estados do sistema - State machine com 4 estados. Streaming obrigatorio. Loading states ricos. Error handling categorizado.
โœ“
Historico e persistencia - Conversations > Messages > Attachments. Paginacao, busca, auto-titulo. LocalStorage + database.
โœ“
Integracao e polishing - Fluxo end-to-end, 10 quick UX wins, QA manual, performance basica, Lighthouse.

Proxima Trilha:

Trilha 4 - Agentes, MCP e Skills. Agora que seu SaaS funciona, e hora de adicionar inteligencia real. Agentes autonomos, Model Context Protocol (MCP), ferramentas e skills que fazem a IA interagir com o mundo real. Seu chatbot vai virar um assistente que age.