Skip to content

Handlers Personalizados

Vou te guiar por um tour sobre como criar e utilizar handlers personalizados no Mirage JS, focando no middleware, na interceptação de requests e, como exemplo prático, implementaremos uma autenticação e autorização básica.

Criando e Utilizando Handlers Personalizados

No Mirage JS, um handler personalizado permite que você defina comportamentos específicos para as requisições à sua API simulada. Isso é útil para simular cenários mais complexos ou comportamentos específicos de sua API que o Mirage pode não suportar diretamente.

Estrutura Básica de um Handler em TypeScript

Aqui está como você pode estruturar um handler personalizado em TypeScript:

typescript
import { Response, Request } from "miragejs";

// Função handler personalizada
function meuHandlerPersonalizado(schema: any, request: Request): Response {
  const dados = JSON.parse(request.requestBody);
  // Lógica personalizada aqui
  return new Response(200, {}, { data: dados });
}

Middleware e Intercepção de Requests

Middleware no contexto do Mirage JS refere-se a funções que têm a capacidade de interceptar requests e modificar respostas. Isso é extremamente útil para simular comportamentos como autenticação e logging.

typescript
import { Server, Request } from "miragejs";

new Server({
  routes() {
    this.passthrough("/_next/static/development/_devPagesManifest.json");
    this.namespace = "api";

    this.post("/login", (schema, request) => {
      return meuHandlerPersonalizado(schema, request);
    });

    // Middleware para interceptar todas as requests
    this.pretender.handledRequest = (verb, path, request) => {
      console.log(`Intercepted ${verb} to ${path}`);
    };
  },
});

Exemplo Prático: Autenticação e Autorização Básica

Vamos criar um exemplo prático onde implementaremos autenticação e autorização básicas. No nosso cenário, o usuário deve fornecer um nome de usuário e senha corretos para receber um token de acesso.

typescript
import { Server, Response } from "miragejs";

new Server({
  routes() {
    this.namespace = "api";

    this.post("/login", (schema, request) => {
      const { username, password } = JSON.parse(request.requestBody);

      if (username === "admin" && password === "admin") {
        return new Response(200, {}, { token: "fake_token" });
      } else {
        return new Response(401, {}, { error: "Credenciais inválidas" });
      }
    });

    this.get("/secret-data", (schema, request) => {
      const token = request.requestHeaders["Authorization"];

      if (token === "Bearer fake_token") {
        return new Response(200, {}, { data: "Dados secretos" });
      } else {
        return new Response(403, {}, { error: "Não autorizado" });
      }
    });
  },
});

Nesse exemplo, o endpoint /login verifica as credenciais e, se forem corretas, retorna um token de acesso. O endpoint /secret-data requer que esse token seja fornecido no cabeçalho da requisição para acessar dados protegidos.

Essa abordagem te permite simular aspectos de autenticação e autorização no desenvolvimento front-end sem depender de um back-end real, facilitando o teste e a prototipação de interfaces que dependem de estados de autenticação.