Pular para o conteúdo principal

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

TecnologiaVersão
Next.js15.x
React19.x
TypeScript5.x
Tailwind CSS4.x
tRPC11.x
Drizzle ORM0.44.x
Better Auth1.x
Vercel AI SDK4.x