1.2.5 • Published 8 months ago

zac-api v1.2.5

Weekly downloads
-
License
ISC
Repository
-
Last release
8 months ago

Zac API

Zac API é uma biblioteca TypeScript que facilita a criação de rotas com validação automática de query, body e params utilizando Zod. Ela também oferece suporte para upload de arquivos com limites e tipos definidos.

Índice

Instalação

npm install zac-api

Inicialização Rápida com npx

Você pode criar rapidamente uma estrutura de projeto utilizando o comando:

npx zac-api

Isso vai guiar você na configuração inicial de um projeto usando zac-api, permitindo que escolha:

  • O diretório onde o projeto será criado

  • Módulos adicionais como:

    • format-params
    • auth
    • multer
  • O ORM (ex.: Prisma) e o banco de dados (ex.: MySQL, PostgreSQL, etc.)

Uso Básico

Estrutura do Projeto

Uma estrutura típica de projeto utilizando zac-api poderia ser assim:

Ao iniciar a aplicação, todas todos os arquivos dentro da pasta routes são carregadas automaticamente.

my-api/
├── src/
│   ├── index.ts
│   └── routes/
│       ├── exampleRoute.ts
│       └── anotherRoute.ts
├── package.json
├── tsconfig.json
└── ...

Iniciando a API

import { appCore } from 'zac-api';

new appCore({ port: 3000, cors: {} }).init();

Aqui:

  • port: Define a porta em que a API será executada (neste caso, porta 3000).

  • cors: Permite configurar as políticas de CORS da API (dá biblioteca cors).

Criando rotas

Cada rota pode ser definida dentro da pasta routes e será automaticamente carregada pelo appCore. Um exemplo de rota em src/routes/exampleRoute.ts seria:

import { Route, apiErrors } from 'zac-api';
import z from 'zod';

new Route({
  method: 'post',
  path: '/exemple',
  files: { folder: 'test', type: 'image/', max: 2 },
  params: {
    body: z.object({
      name: z.string(),
      isTrue: z.coerce.boolean().default(true),
      idade: z.coerce.number().max(5, apiErrors.LONG_NUMBER_ERROR),
      email: z.string().email('não é um email.'),
      list: z.array(z.string().max(5)).or(
        //or in muilti-form = (files exist)
        z
          .string()
          .max(5)
          .transform((field) => [field])
      ),
    }),
  },

  execute(req, res) {
    const files = req.saveFiles();

    if (files.success) {
      console.log(files.ids);
    }

    res.status(200).json({ body: req.body });
  },
});

Usando Middlewares

Exemplo de Middleware de Autenticação

Neste exemplo, criamos um middleware de autenticação que verifica se o usuário tem a função de "admin" antes de permitir que a rota prossiga:

import { IRouter } from 'zac-api';

import { NextFunction, Request, Response } from 'express'; // in zac-api

interface IAuthReq extends personalRequest {
  isAuth?: boolean;
}

function authMiddleware(role: string) {
  return (routeConfig: IRouter) => {
    return (req: Request, res: Response, next: NextFunction) => {
      if (role != 'admin') return res.status(401).json({ message: 'role is not admin' });

      next();
    };
  };
}

new Route({
  method: 'post',
  path: '/exemple',
  middlewares: [authMiddleware('admin')],
  params: {
    body: z.object({
      name: z.string(),
    }),
  },

  execute(req: IAuthReq, res) {
    const files = req.saveFiles();

    if (files.success) {
      console.log(files.ids);
    }

    res.status(200).json({ body: req.body });
  },
});
1.2.5

8 months ago

1.2.4

8 months ago

1.2.3

11 months ago

1.2.2

11 months ago

1.2.1

11 months ago

1.2.0

11 months ago

1.1.8

12 months ago

1.1.7

12 months ago

1.1.6

12 months ago

1.1.5

12 months ago

1.1.4

12 months ago

1.1.3

12 months ago

1.1.2

12 months ago

1.1.1

12 months ago

1.1.0

12 months ago

1.0.4

12 months ago

1.0.3

12 months ago

1.0.2

12 months ago

1.0.1

12 months ago

1.0.0

12 months ago