Stack Tecnológico
O APAH Assistant utiliza um conjunto moderno de tecnologias, baseado no T3 Stack com extensões para IA e gestão documental.
Framework Principal
Next.js 15
O Next.js é o framework React de produção que fornece:
- App Router - Roteamento baseado em ficheiros com layouts aninhados
- React Server Components - Renderização no servidor por defeito
- Server Actions - Mutações simplificadas
- Turbopack - Bundler ultra-rápido para desenvolvimento
// next.config.js
const config = {
experimental: {
turbo: true,
},
};
TypeScript
TypeScript é obrigatório em todo o projeto, garantindo:
- Tipagem estática completa
- IntelliSense melhorado
- Deteção precoce de erros
- Documentação inline
Interface de Utilizador
shadcn/ui
Componentes UI construídos com Radix UI e Tailwind CSS:
import { Button } from "@/components/ui/button";
import { Dialog } from "@/components/ui/dialog";
import { Input } from "@/components/ui/input";
Benefícios:
- Componentes acessíveis (WCAG 2.1)
- Totalmente personalizáveis
- Sem dependência de runtime
- Código-fonte no projeto
Tailwind CSS 4
Framework CSS utility-first para estilização rápida:
<div className="flex items-center gap-4 rounded-lg bg-card p-4 shadow-sm">
<Avatar />
<div className="flex-1">
<h3 className="font-semibold">Título</h3>
<p className="text-muted-foreground">Descrição</p>
</div>
</div>
Lucide React
Biblioteca de ícones consistente e leve:
import { Search, Settings, User } from "lucide-react";
Comunicação Cliente-Servidor
tRPC
APIs type-safe sem código duplicado:
// Definição do router (servidor)
export const userRouter = createTRPCRouter({
getById: protectedProcedure.input(z.object({ id: z.string() })).query(async ({ input, ctx }) => {
return ctx.db.query.users.findFirst({
where: eq(users.id, input.id),
});
}),
});
// Uso no cliente (type-safe automático)
const { data: user } = api.user.getById.useQuery({ id: "123" });
React Query (TanStack Query)
Gestão de estado do servidor com cache inteligente:
- Cache automático
- Refetch em background
- Optimistic updates
- Infinite queries
Base de Dados
Drizzle ORM
ORM TypeScript-first com queries type-safe:
// Schema
export const users = pgTable("users", {
id: text("id").primaryKey(),
name: text("name").notNull(),
email: text("email").notNull().unique(),
createdAt: timestamp("created_at").defaultNow(),
});
// Query
const allUsers = await db.select().from(users);
Vantagens:
- SQL-like API
- Zero overhead
- Migrações automáticas
- Suporte a edge runtimes
PostgreSQL
Base de dados relacional robusta com:
- Suporte a JSON/JSONB
- Full-text search
- Extensões (pgvector para embeddings)
- Transações ACID
Autenticação
Better Auth
Sistema de autenticação moderno e flexível:
import { betterAuth } from "better-auth";
export const auth = betterAuth({
database: drizzleAdapter(db),
emailAndPassword: {
enabled: true,
},
session: {
expiresIn: 60 * 60 * 24 * 7, // 7 dias
},
});
Funcionalidades:
- Email/Password
- OAuth providers
- Sessões seguras
- RBAC (Role-Based Access Control)
Inteligência Artificial
Vercel AI SDK
SDK unificado para múltiplos provedores de IA:
import { streamText } from "ai";
import { azure } from "@ai-sdk/azure";
const result = await streamText({
model: azure("gpt-4"),
messages: conversation,
system: systemPrompt,
});
LangChain
Framework para aplicações LLM complexas:
import { ChatOpenAI } from "@langchain/openai";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
Usado para:
- Document loaders (PDF, Word)
- Text splitting
- Embeddings
- Vector search
Cohere
Embeddings e reranking de alta qualidade:
import { CohereEmbeddings } from "@langchain/cohere";
const embeddings = new CohereEmbeddings({
model: "embed-multilingual-v3.0",
});
Ferramentas de Desenvolvimento
Biome
Linter e formatter ultra-rápido:
pnpm check # Verificar código
pnpm format # Formatar código
Drizzle Kit
Ferramentas CLI para gestão de schema:
pnpm db:generate # Gerar migrações
pnpm db:migrate # Aplicar migrações
pnpm db:studio # Interface visual
Validação
Zod
Validação de schemas com inferência de tipos:
const userSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
role: z.enum(["admin", "user"]),
});
type User = z.infer<typeof userSchema>;
Resumo das Versões
| Tecnologia | Versão |
|---|---|
| Next.js | 15.x |
| React | 19.x |
| TypeScript | 5.x |
| Tailwind CSS | 4.x |
| tRPC | 11.x |
| Drizzle ORM | 0.44.x |
| Better Auth | 1.x |
| Vercel AI SDK | 4.x |