Aplicação de terminal (CLI) para gerenciamento de uma pequena livraria, desenvolvida como projeto avaliativo do Módulo 01. Permite administrar autores, livros, clientes e empréstimos, com persistência dos dados em PostgreSQL e geração de relatórios gerenciais.
Substituir o controle manual de uma livraria por uma aplicação CLI capaz de:
- gerenciar autores, livros, clientes e empréstimos;
- persistir informações em um banco de dados PostgreSQL;
- aplicar regras de negócio durante as operações do sistema;
- realizar consultas relacionais utilizando SQL;
- gerar relatórios gerenciais a partir dos dados armazenados;
- organizar o código em camadas, promovendo modularização e reutilização.
- Node.js 18 ou superior
- PostgreSQL 13 ou superior
- npm
-
Crie um banco de dados no PostgreSQL (via pgAdmin ou terminal):
CREATE DATABASE bookstore_manager;
-
Execute o script disponível em
src/database/schema.sqlpara criar as tabelas e relacionamentos. Pode ser feito pela Query Tool do pgAdmin (copiando e colando o conteúdo do arquivo) ou via terminal:psql -U postgres -d bookstore_manager -f src/database/schema.sql
-
Clone o repositório:
git clone https://github.com/Brrn91/bookstore-manager-cli.git cd bookstore-manager-cli -
Instale as dependências:
npm install
-
Copie o arquivo de variáveis de ambiente e preencha com suas credenciais:
cp .env.example .env
DB_HOST=localhost DB_PORT=5432 DB_USER=postgres DB_PASSWORD=sua_senha_aqui DB_NAME=bookstore_manager
Ambiente de desenvolvimento (com recarregamento automático):
npm run devBuild de produção e execução:
npm run build
npm startA aplicação segue uma arquitetura em camadas, separando responsabilidades entre interface (CLI), regras de negócio e acesso a dados:
Usuário (terminal)
│
▼
Menu → navegação e captura de opções
│
▼
Controller → recebe entradas, validações básicas, aciona o Service
│
▼
Service → regras de negócio e validações
│
▼
Repository → executa comandos SQL (INSERT, UPDATE, DELETE, SELECT)
│
▼
PostgreSQL → armazenamento persistente dos dados
Responsabilidade das camadas:
| Camada | Responsabilidade |
|---|---|
| Main | Inicia a aplicação, estabelece a conexão com o banco e inicia o menu principal |
| Menus | Organiza a navegação da aplicação, exibindo opções e delegando para os Controllers |
| Controllers | Interagem com o usuário via terminal: exibem prompts, capturam entradas e tratam erros com try/catch |
| Services | Implementam as regras de negócio: validações de existência, unicidade, disponibilidade e formato |
| Repositories | Executam os comandos SQL (INSERT, UPDATE, DELETE, SELECT) via biblioteca pg |
| Models | Representam as entidades do sistema (Author, Book, Client, Loan) como classes tipadas |
| Database | Centraliza a configuração de conexão (connection.ts) e o script de criação do banco (schema.sql) |
| Utils | Funções auxiliares reutilizáveis: leitura de input, validações e classe de erro customizada (AppError) |
bookstore-manager-cli/
├── 📁 src
│ ├── 📁 controllers # Interação com o usuário via terminal
│ │ ├── 📄 AuthorController.ts
│ │ ├── 📄 BookController.ts
│ │ ├── 📄 ClientController.ts
│ │ ├── 📄 LoanController.ts
│ │ └── 📄 ReportController.ts
│ ├── 📁 database # Conexão com o PostgreSQL e schema.sql
│ │ ├── 📄 connection.ts
│ │ └── 📄 schema.sql
│ ├── 📁 menus # Menus e navegação da aplicação
│ │ ├── 📄 authorMenu.ts
│ │ ├── 📄 bookMenu.ts
│ │ ├── 📄 clientMenu.ts
│ │ ├── 📄 loanMenu.ts
│ │ ├── 📄 mainMenu.ts
│ │ └── 📄 reportMenu.ts
│ ├── 📁 models # Classes e interfaces das entidades
│ │ ├── 📄 Author.ts
│ │ ├── 📄 Book.ts
│ │ ├── 📄 Client.ts
│ │ └── 📄 Loan.ts
│ ├── 📁 repositories # Acesso ao banco de dados (SQL)
│ │ ├── 📄 AuthorRepository.ts
│ │ ├── 📄 BookRepository.ts
│ │ ├── 📄 ClientRepository.ts
│ │ ├── 📄 LoanRepository.ts
│ │ └── 📄 ReportRepository.ts
│ ├── 📁 services # Regras de negócio e validações
│ │ ├── 📄 AuthorService.ts
│ │ ├── 📄 BookService.ts
│ │ ├── 📄 ClientService.ts
│ │ ├── 📄 LoanService.ts
│ │ └── 📄 ReportService.ts
│ ├── 📁 utils # Funções auxiliares
│ │ ├── 📄 errors.ts
│ │ ├── 📄 inputHelper.ts
│ │ └── 📄 validators.ts
│ └── 📄 main.ts # Ponto de entrada da aplicação
├── ⚙️ .env.example
├── ⚙️ .gitignore
├── ⚙️ package.json
├── 📝 readme.md
└── ⚙️ tsconfig.json
- Autores: cadastrar, listar, consultar por ID, atualizar e remover (bloqueando a remoção caso existam livros vinculados a esse autor).
- Livros: cadastrar (vinculado obrigatoriamente a um autor já existente), listar (com nome do autor via
JOIN), consultar, atualizar e remover. - Clientes: cadastrar (com validação de e-mail único), listar, consultar, atualizar e remover (bloqueando a remoção caso existam empréstimos vinculados a esse cliente).
- Empréstimos: registrar empréstimo (validando existência de livro e cliente, disponibilidade de exemplares e formato de data), registrar devolução (com controle de status
ATIVO/DEVOLVIDO, impedindo devolução duplicada) e listar empréstimos. - Relatórios:
- Livros disponíveis para empréstimo;
- Livros atualmente emprestados;
- Quantidade de livros cadastrados por autor;
- Quantidade de empréstimos por livro (top 10);
- Clientes com empréstimos ativos no momento.
- Tratamento de erros: validações de negócio centralizadas em uma classe
AppError, e blocostry/catchem todos os métodos dos Controllers, exibindo mensagens claras sem interromper a execução da aplicação. - Programação assíncrona: todas as operações de banco de dados utilizam
Promiseseasync/await. - Consultas relacionais: uso de
INNER JOIN,LEFT JOIN,GROUP BY,ORDER BY,LIMITe funções de agregação (COUNT) nos relatórios e listagens.
Ao iniciar a aplicação, o menu principal é exibido:
=============================================
BOOKSTORE MANAGER CLI - Menu Principal
=============================================
1. Autores
2. Livros
3. Clientes
4. Empréstimos
5. Relatórios
0. Encerrar aplicação
=============================================
Fluxo típico de uso:
- Cadastre um autor pelo menu "Autores" (opção 1).
- Liste os autores (opção 2) para anotar o
idgerado. - Cadastre um livro pelo menu "Livros", informando o
iddo autor anotado. - Cadastre um cliente pelo menu "Clientes".
- Registre um empréstimo pelo menu "Empréstimos", informando os
ids do livro e do cliente. - Consulte os relatórios gerenciais pelo menu "Relatórios" para visualizar o estado atual do sistema.
- Lucas Bruno da Costa Mafra