|
1 | | - |
2 | 1 | # LIBRARY-API |
3 | 2 |
|
4 | 3 | ## Descrição |
5 | | -O **LIBRARY-API** é um sistema backend desenvolvido em Go para gerenciar o catálogo de uma livraria. O sistema permite adicionar, atualizar, listar e remover livros do catálogo, com suporte para diferentes informações, como título, autor e gênero. Ele usa uma base de dados SQLite para armazenar os dados e oferece uma API RESTful para interagir com o sistema. |
| 4 | +O **LIBRARY-API** é um sistema backend desenvolvido em Go para gerenciar o catálogo de uma livraria. O sistema permite adicionar, atualizar, listar e remover livros, autores e empréstimos. Ele suporta **SQLite** e **PostgreSQL**, oferece uma API RESTful completa, CLI para comandos e está containerizado com Docker. |
6 | 5 |
|
7 | 6 | ## Funcionalidades |
8 | 7 |
|
9 | | -- **Listar Livros**: Exibe todos os livros registrados no sistema. |
10 | | -- **Adicionar Livros**: Permite o cadastro de novos livros no catálogo. |
11 | | -- **Atributos do livro**: título, autor, gênero, quantidade de páginas, ano de publicação. |
12 | | -- **Atualizar Livro**: Permite a modificação dos detalhes de um livro existente. |
13 | | -- **Remover Livro**: Permite excluir um livro específico do sistema. |
| 8 | +- **Livros**: CRUD completo, busca paginada com filtros (gênero, autor, ano) |
| 9 | +- **Autores**: CRUD completo, listar livros por autor |
| 10 | +- **Empréstimos**: Registrar (com verificação de disponibilidade), retornar e listar atrasados |
| 11 | +- **CLI**: Comandos `search`, `simulate`, `authors`, `loans` |
| 12 | +- **Logging**: Structured JSON logging com `slog` |
| 13 | +- **Graceful shutdown**: Finalização limpa do servidor HTTP |
| 14 | +- **Health check**: Endpoint `/health` para monitoramento |
| 15 | +- **CORS**: Suporte para requisições cross-origin |
| 16 | +- **Validação**: Validação de entrada para livros, autores e empréstimos |
14 | 17 |
|
15 | 18 | ## Requisitos |
16 | 19 |
|
17 | | -- Go 1.22.5 ou superior |
18 | | -- SQLite3 para o banco de dados |
| 20 | +- Go instalado localmente |
| 21 | +- SQLite3 (padrão) ou Docker com PostgreSQL |
19 | 22 |
|
20 | 23 | ### Dependências |
21 | 24 |
|
22 | | -- `github.com/mattn/go-sqlite3 v1.14.23` |
| 25 | +- `github.com/mattn/go-sqlite3` |
| 26 | +- `github.com/jackc/pgx/v5` |
23 | 27 |
|
24 | 28 | ## Como Executar |
25 | 29 |
|
26 | | -1. Clone o Repositório: |
27 | | - ``` bash |
28 | | - git clone https://github.com/alysonsz/library-api.git |
29 | | - cd library-api |
30 | | - ``` |
31 | | -2. Instale as dependências: |
32 | | - ```bash |
33 | | - go mod tidy |
34 | | - ``` |
35 | | -3. Configurar o Banco de Dados: |
36 | | -O projeto utiliza o SQLite, então certifique-se de que você tenha o arquivo books.database no diretório correto. Caso ainda não exista, crie-o: |
37 | | - ```bash |
38 | | - touch books.database |
39 | | - ``` |
40 | | -4. Inicie o servidor: |
41 | | - ```bash |
42 | | - go run main.go |
43 | | - ``` |
44 | | -5. O sistema estará rodando na porta `8080`. |
45 | | - |
46 | | -## Endpoints |
| 30 | +### SQLite (padrão) |
47 | 31 |
|
48 | | -### Listar Livros |
49 | | -```http |
50 | | -GET /books |
| 32 | +```bash |
| 33 | +go mod tidy |
| 34 | +go run ./cmd/gobook |
51 | 35 | ``` |
52 | | -Retorna a lista de todos os livros cadastrados. |
53 | 36 |
|
54 | | -### Adicionar Livro |
55 | | -```http |
56 | | -POST /books |
| 37 | +### PostgreSQL via Docker |
| 38 | + |
| 39 | +```bash |
| 40 | +docker-compose up --build |
57 | 41 | ``` |
58 | | -Corpo da requisição: |
59 | | -```json |
60 | | -{ |
61 | | - "title": "Nome do Livro", |
62 | | - "author": "Autor do Livro", |
63 | | - "genre": "Gênero", |
64 | | - "pages": "Número de páginas", |
65 | | - "publicationYear": "Ano de publicação" |
66 | | -} |
| 42 | + |
| 43 | +### Variáveis de Ambiente |
| 44 | + |
| 45 | +| Variável | Padrão | Descrição | |
| 46 | +|----------|--------|-----------| |
| 47 | +| `PORT` | `8080` | Porta do servidor | |
| 48 | +| `DB_DRIVER` | `sqlite3` | `sqlite3` ou `postgres` | |
| 49 | +| `DB_PATH` | `./books.db` | Caminho do SQLite | |
| 50 | +| `DB_URL` | (vazio) | Connection string do PostgreSQL | |
| 51 | +| `LOG_LEVEL` | `info` | `info` ou `debug` | |
| 52 | + |
| 53 | +### Exemplo com PostgreSQL |
| 54 | + |
| 55 | +```bash |
| 56 | +export DB_DRIVER=postgres |
| 57 | +export DB_URL=postgres://user:pass@localhost:5432/library?sslmode=disable |
| 58 | +go run ./cmd/gobook |
67 | 59 | ``` |
68 | 60 |
|
69 | | -### Atualizar Livro |
70 | | -```http |
71 | | -PUT /books/{id} |
| 61 | +## CLI |
| 62 | + |
| 63 | +```bash |
| 64 | +go run ./cmd/gobook search "Go" |
| 65 | +go run ./cmd/gobook simulate 1 2 3 |
| 66 | +go run ./cmd/gobook authors list |
| 67 | +go run ./cmd/gobook authors create "George Orwell" "Bio" 1903 |
| 68 | +go run ./cmd/gobook authors delete 1 |
| 69 | +go run ./cmd/gobook loans list |
| 70 | +go run ./cmd/gobook loans overdue |
| 71 | +go run ./cmd/gobook loans return 1 |
72 | 72 | ``` |
73 | | -Parâmetro: `id` do livro a ser atualizado. |
74 | | -Corpo da requisição: |
75 | | -```json |
76 | | -{ |
77 | | - "title": "Novo Nome", |
78 | | - "author": "Novo Autor", |
79 | | - "genre": "Novo Gênero", |
80 | | - "pages": "Novo número de páginas", |
81 | | - "publicationYear": "Novo ano de publicação" |
82 | | -} |
| 73 | + |
| 74 | +## Endpoints |
| 75 | + |
| 76 | +### Livros |
| 77 | + |
| 78 | +| Método | Endpoint | Descrição | |
| 79 | +|--------|----------|-----------| |
| 80 | +| GET | `/books?page=1&pageSize=10&genre=Fiction&authorId=1&publicationYear=2020` | Listar com filtros e paginação | |
| 81 | +| POST | `/books` | Criar livro | |
| 82 | +| GET | `/books/{id}` | Buscar por ID | |
| 83 | +| PUT | `/books/{id}` | Atualizar | |
| 84 | +| DELETE | `/books/{id}` | Remover | |
| 85 | + |
| 86 | +### Autores |
| 87 | + |
| 88 | +| Método | Endpoint | Descrição | |
| 89 | +|--------|----------|-----------| |
| 90 | +| GET | `/authors` | Listar | |
| 91 | +| POST | `/authors` | Criar | |
| 92 | +| GET | `/authors/{id}` | Buscar por ID | |
| 93 | +| PUT | `/authors/{id}` | Atualizar | |
| 94 | +| DELETE | `/authors/{id}` | Remover | |
| 95 | +| GET | `/authors/{id}/books` | Livros do autor | |
| 96 | + |
| 97 | +### Empréstimos |
| 98 | + |
| 99 | +| Método | Endpoint | Descrição | |
| 100 | +|--------|----------|-----------| |
| 101 | +| GET | `/loans` | Listar | |
| 102 | +| POST | `/loans` | Criar empréstimo | |
| 103 | +| GET | `/loans/{id}` | Buscar por ID | |
| 104 | +| POST | `/loans/{id}/return` | Devolver livro | |
| 105 | +| GET | `/loans/overdue` | Empréstimos atrasados | |
| 106 | + |
| 107 | +### Health |
| 108 | + |
| 109 | +| Método | Endpoint | Descrição | |
| 110 | +|--------|----------|-----------| |
| 111 | +| GET | `/health` | Status do sistema e conectividade com banco | |
| 112 | + |
| 113 | +### Swagger |
| 114 | + |
| 115 | +| Método | Endpoint | Descrição | |
| 116 | +|--------|----------|-----------| |
| 117 | +| GET | `/swagger/index.html` | Interface interativa da documentação da API | |
| 118 | + |
| 119 | +## Testes |
| 120 | + |
| 121 | +```bash |
| 122 | +go test ./... -v |
83 | 123 | ``` |
84 | 124 |
|
85 | | -### Remover Livro |
86 | | -```http |
87 | | -DELETE /books/{id} |
| 125 | +Use o arquivo `test.http` para testar os endpoints da API. |
| 126 | + |
| 127 | +## Swagger / OpenAPI |
| 128 | + |
| 129 | +Para gerar a documentação Swagger, instale o `swag` CLI e rode: |
| 130 | + |
| 131 | +```bash |
| 132 | +go install github.com/swaggo/swag/cmd/swag@latest |
| 133 | +swag init -g cmd/gobook/main.go |
88 | 134 | ``` |
89 | | -Parâmetro: `id` do livro a ser removido. |
90 | 135 |
|
91 | | -## Testes |
| 136 | +Após gerar, acesse `http://localhost:8080/swagger/index.html` para explorar a API interativamente. |
| 137 | + |
| 138 | +Você também pode usar o Makefile: |
92 | 139 |
|
93 | | -Use o arquivo `test.http` para testar os endpoints da API com exemplos de requisições HTTP. |
| 140 | +```bash |
| 141 | +make swag |
| 142 | +``` |
0 commit comments