Um sistema administrativo back-end, fechado (apenas administradores) e objetivo, desenvolvido para gerenciar uma biblioteca universitária. Construído com NestJS, Node.js, Express e TypeScript, seguindo boas práticas de arquitetura e organização de código.
- Gerenciamento de Autores, Livros, Estudantes e Empréstimos (criar, visualizar, atualizar, deletar)
- Empréstimo e devolução de livros com controle de estoque de livros disponíveis
- Verificação de disponibilidade de livros antes de realizar o empréstimo
- Histórico de empréstimos e devoluções por estudante
- Regras de negócio aplicadas, como prazos de devolução
- Filtros de busca por título, gênero, ISBN, disponibilidade, ano de publicação, etc.
- Paginação e ordenação em todos os endpoints de listagem
- Manipulação de banco de dados com PrismaORM e MySQL
- Transações atômicas com prisma
- Autenticação com JWT utilizando passport strategy
- Seed para criação do usuário administrador padrão
- Validação e transformação de dados com DTOs (utilizando class-validator e class-transformer)
- Tratamento de erros centralizado no NestJS
- Documentação interativa da API com Swagger
- Testes unitários com Jest (serviços e controllers)
- Limite de taxa de requisições
- Estrutura modular
- Autenticação baseada em JWT utilizando passport strategy
- Criptografia de Senha (Apenas do ADMIN) no banco de dados
- Mais campos detalhados em todas as tabelas (Ex: Adicionado ISBN para os livros)
- Gerenciamento robusto de estoque de livros disponíveis para empréstimos
- Buscas páginadas e com novos filtros
- Proteção contra ataques de força bruta (Limite de taxa de requisições por minuto)
- Testes unitários automatizados de todos as funções em serviços e controllers
- Documentação completa da API com Swagger
- Framework: NestJS
- Linguagem: TypeScript
- Banco de Dados: MySQL com Prisma
- Node.js (v18.18.1 ou superior)
- MySQL (Server and Workbench)
- Clone o repositório:
git clone <repository-url>
cd bibliotech-api
- Instale as dependências:
npm install
- Configuração do Banco de Dados: Certifique-se de que você tenha seu banco criado antecipadamente. Usando o git bash (não o terminal comum do windows) crie o arquivo .env com suas credenciais de banco de dados seguindo o seguinte formato:
cp .env.example .env
DATABASE_URL="mysql://<usuário>:<senha>@<host>:<porta>/<nome_do_database>"
- Execute as migrações do prisma para criar as tabelas:
npx prisma generate deploy
npx prisma migrate deploy
- Após configurar suas váriaveis de ambiente no .env, inicie a aplicação:
npm run dev
Certifique-se de configurar seu .env com estas variáveis de ambiente principais:
# APLICAÇÃO
PORT=3000
# BANCO DE DADOS
DATABASE_URL="YOUR DATABASE URL..."
# AUTENTICAÇÃO
SEED_USER_NAME="YOUR_SYSTEM_USERNAME..."
SEED_USER_EMAIL="YOUR_SYSTEM_USER_EMAIL..."
SEED_USER_PASSWORD="YOUR_SYSTEM_USER_PASSWORD..."
JWT_SECRET_KEY="YOUR_SECRET_KEY"
EXPIRES_IN='EXPIRES_TIME'
# CORS Configuração Examplo
# Defina seus domínios permitidos para acesso CORS. Exemplo:
CORS_ORIGIN="http://localhost:3003,http://example.com"
# Defina os métodos HTTP permitidos para CORS. Exemplo:
CORS_METHODS="GET,POST,PUT,DELETE,PATCH,OPTIONS"
# Defina os cabeçalhos permitidos para CORS. Exemplo:
CORS_ALLOWED_HEADERS="Content-Type,Authorization,Accept"
# Defina os cabeçalhos expostos para CORS. Exemplo:
CORS_EXPOSED_HEADERS="Content-Range,X-Content-Range"
# Defina se o CORS permite credenciais (cookies, etc.). Exemplo:
CORS_CREDENTIALS=true
# Defina o tempo de cache do CORS (em segundos). Exemplo:
CORS_MAX_AGE=3600
# API Rate Limit
THROTTLE_TTL=10000
THROTTLE_LIMIT=60
Para acessar a documentação interativa da BibliotechAPI via Swagger clique aqui
POST /authors
- Criar um autorGET /authors
- Consultar todos os autoresGET /authors/:authorId
- Consultar autor detalhadamenteDELETE /authors/:authorId
- Excluir um autor
POST /books
- Criar livroPOST /books/:bookId/add-inventory
- Adicionar mais quantidade de livros ao inventárioPOST /books/:bookId/remove-inventory
- Remover quantidade desejada de livros do inventárioGET /books
- Consultar todos os livrosGET /books/:bookId
- Consultar livro detalhadamentePATCH /books/:bookId
- Atualizar um livro existenteDELETE /books/:bookId
- Excluir um livro
POST /students
- Cadastrar aluno na bibliotecaGET /students
- Consultar todos os alunosGET /students/:studentId
- Consultar aluno detalhadamentePATCH /students/:studentId
- Atualizar um aluno existenteDELETE /students/:studentId
- Excluir um aluno
POST /loans
- Registrar um empréstimoGET /loans
- Consultar todos os empréstimos (?available=true/false para consultar empréstimos ativos/inativos)GET /loans/:loanId
- Consultar empréstimo detalhadamentePATCH /loans/:loanId/return
- Realizar a devolução do empréstimo (ao mesmo tempo libera o livro e estudante para fazer um novo empréstimo)DELETE /loans/:loanId
- Excluir um empréstimo
npm run test
- id (int)
- username
- password
- createdAt
- updatedAt
- id (int)
- name
- birthYear
- nationality
- createdAt
- updatedAt
- id (int)
- title
- genre
- isbn
- yearPublished
- totalQuantity
- availableQuantity
- authorId (Foreign Key)
- createdAt
- updatedAt
- id (int)
- name
- email (único)
- phone
- academicRegistration (único)
- createdAt
- updatedAt
- id (int)
- studentId (Foreign Key)
- bookId (Foreign Key)
- loanDate
- dueDate
- isActive
- returnDate (padrão null)
- createdAt
- updatedAt