Skip to content

Commit b7c0e91

Browse files
authored
Merge PR #1 feat/api-enhancement
2 parents 54797bf + 3bf894e commit b7c0e91

31 files changed

Lines changed: 2977 additions & 419 deletions

.dockerignore

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
*.exe
2+
*.exe~
3+
*.dll
4+
*.so
5+
*.dylib
6+
7+
*.test
8+
9+
*.out
10+
11+
go.work
12+
13+
.idea/
14+
.vscode/
15+
16+
.DS_Store
17+
Thumbs.db
18+
19+
.git/
20+
.gitignore
21+
22+
*.db
23+
*.sqlite
24+
25+
Dockerfile
26+
docker-compose.yml
27+
.dockerignore

.gitignore

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
*.exe
2+
*.dll
3+
*.so
4+
*.dylib
5+
bin/
6+
7+
*.test
8+
9+
*.out
10+
11+
*.db
12+
*.sqlite
13+
*.sqlite3
14+
15+
.env
16+
17+
.vscode/
18+
.idea/
19+
*.swp
20+
*.swo
21+
*~
22+
23+
.DS_Store
24+
Thumbs.db
25+
26+
go.work

Dockerfile

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
FROM golang:1.25-alpine AS builder
2+
3+
WORKDIR /app
4+
COPY go.mod go.sum ./
5+
RUN go mod download
6+
7+
COPY . .
8+
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gobook ./cmd/gobook
9+
10+
FROM alpine:latest
11+
RUN apk --no-cache add ca-certificates
12+
WORKDIR /root/
13+
14+
COPY --from=builder /app/gobook .
15+
16+
EXPOSE 8080
17+
18+
CMD ["./gobook"]

Makefile

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
.PHONY: build run test vet clean docker-up docker-down
2+
3+
build:
4+
go build -o bin/gobook ./cmd/gobook
5+
6+
run:
7+
go run ./cmd/gobook
8+
9+
run-postgres:
10+
DB_DRIVER=postgres DB_URL=postgres://library:library@localhost:5432/library?sslmode=disable go run ./cmd/gobook
11+
12+
test:
13+
go test ./... -v
14+
15+
vet:
16+
go vet ./...
17+
18+
tidy:
19+
go mod tidy
20+
21+
swag:
22+
swag init -g cmd/gobook/main.go
23+
24+
clean:
25+
go clean
26+
rm -f bin/gobook
27+
rm -f *.db
28+
29+
docker-up:
30+
docker-compose up --build -d
31+
32+
docker-down:
33+
docker-compose down
34+
35+
cli-search:
36+
go run ./cmd/gobook search "$(term)"
37+
38+
cli-simulate:
39+
go run ./cmd/gobook simulate $(ids)

README.md

Lines changed: 115 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,142 @@
1-
21
# LIBRARY-API
32

43
## 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.
65

76
## Funcionalidades
87

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
1417

1518
## Requisitos
1619

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
1922

2023
### Dependências
2124

22-
- `github.com/mattn/go-sqlite3 v1.14.23`
25+
- `github.com/mattn/go-sqlite3`
26+
- `github.com/jackc/pgx/v5`
2327

2428
## Como Executar
2529

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)
4731

48-
### Listar Livros
49-
```http
50-
GET /books
32+
```bash
33+
go mod tidy
34+
go run ./cmd/gobook
5135
```
52-
Retorna a lista de todos os livros cadastrados.
5336

54-
### Adicionar Livro
55-
```http
56-
POST /books
37+
### PostgreSQL via Docker
38+
39+
```bash
40+
docker-compose up --build
5741
```
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
6759
```
6860

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
7272
```
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
83123
```
84124

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
88134
```
89-
Parâmetro: `id` do livro a ser removido.
90135

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:
92139

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

Comments
 (0)