Aplicação CRUD para gerenciamento de tickets, com categorias e subcategorias, severity e integracao com jsonplaceholder simulando tabela user
https://hub-meli-front.4ddnns.easypanel.host/
- Docker
- Golang
- Gin
- Postgres
- Sqlx
- TestContainers
- Testify
- Zap logger
- Viper
- Swagger
- Validator
- Docker
- Golang
- Make
- Golang Migrate
cd frontend
npm install
npm run dev
Na tabela ticket temos o user_id simulando uma tabela de usuario integrando com os usuarios do jsonplaceholder
install Golang Migrate
MacOS
brew install golang-migrate
apt install migrate
git clone https://github.com/moura95/meli-api
cd meli-api
docs/meliapi_collection.json
Instalar Dependencias
go mod tidy
make test
go test -v ./...
Iniciar Servico
make start
go run cmd/main.go
Docker esta configurado para subir imagem do banco de dados, criar as tabelas e inserir registros, estou utilizando a imagem do golang-migrate para executar minhas migracoes
docker-compose up
Swagger:
http://localhost:8080/swagger/index.html
POST /tickets/
Cria um novo ticket.
Headers:
Parâmetro | Tipo | Descrição |
---|---|---|
Content-Type |
string |
application/json |
Body parameters:
Parâmetro | Tipo | Descrição |
---|---|---|
title |
string |
Título do ticket. Required |
description |
string |
Descrição do ticket. Required |
severity_id |
int |
ID da severidade. Required |
category_id |
int |
ID da categoria. Required |
subcategory_id |
int |
ID da subcategoria. Optional |
Body:
{
"title": "Erro no sistema",
"description": "O sistema apresenta um erro ao tentar salvar.",
"severity_id": 2,
"category_id": 1,
"subcategory_id": 4
}
Response:
{
"error": "",
"data": {
"ID": 11,
"Title": "Erro no sistema",
"Status": "OPEN",
"Description": "O sistema apresenta um erro ao tentar salvar.",
"SeverityID": 2,
"CategoryID": 1,
"SubcategoryID": 4,
"CreatedAt": "2024-08-05T11:51:01.816297Z",
"UpdatedAt": "2024-08-05T11:51:01.816297Z",
"CompletedAt": null
}
}
GET /tickets/
Lista todos os tickets.
Não há parâmetros.
Código | Descrição |
---|---|
200 | Tickets listados com sucesso. |
500 | Erro interno do servidor. |
Body:
[
{
"id": 1,
"title": "Erro no sistema",
"status": "OPEN",
"description": "O sistema apresenta um erro ao tentar salvar.",
"severity_id": 2,
"category_id": 1,
"user_id": 5,
"subcategory_id": 3,
"created_at": "2023-07-15T14:48:00.000Z",
"updated_at": "2023-07-15T14:48:00.000Z",
"completed_at": null
},
{
"id": 2,
"title": "Problema de login",
"status": "DONE",
"description": "Usuários não conseguem fazer login.",
"severity_id": 1,
"category_id": 2,
"user_id": 6,
"subcategory_id": null,
"created_at": "2023-07-16T10:15:00.000Z",
"updated_at": "2023-07-16T11:00:00.000Z",
"completed_at": "2023-07-16T11:00:00.000Z"
}
]
GET /tickets/{id}/
Obtém um ticket específico pelo seu ID.
Path parameters:
Parâmetro | Tipo | Descrição |
---|---|---|
id |
int |
ID do ticket. Required |
Código | Descrição |
---|---|
200 | Ticket obtido com sucesso. |
404 | Ticket não encontrado. |
500 | Erro interno do servidor. |
Body:
{
"id": 1,
"title": "Erro no sistema",
"status": "OPEN",
"description": "O sistema apresenta um erro ao tentar salvar.",
"severity_id": 2,
"category_id": 1,
"user_id": 5,
"subcategory_id": 3,
"created_at": "2023-07-15T14:48:00.000Z",
"updated_at": "2023-07-15T14:48:00.000Z",
"completed_at": null
}
DELETE /tickets/{id}/
Deleta um ticket específico pelo seu ID.
Path parameters:
Parâmetro | Tipo | Descrição |
---|---|---|
id |
int |
ID do ticket. Required |
Código | Descrição |
---|---|
204 | Ticket deletado com sucesso. |
404 | Ticket não encontrado. |
500 | Erro interno do servidor. |
PATCH /tickets/{id}/
Atualiza um ticket específico pelo seu ID.
Headers:
Parâmetro | Tipo | Descrição |
---|---|---|
Content-Type |
string |
application/json |
Path parameters:
Parâmetro | Tipo | Descrição |
---|---|---|
id |
int |
ID do ticket. Required |
Body parameters:
Parâmetro | Tipo | Descrição |
---|---|---|
title |
string |
Título do ticket. Optional |
description |
string |
Descrição do ticket. Optional |
status |
string |
Status do ticket. Optional |
severity_id |
int |
ID da severidade. Optional |
category_id |
int |
ID da categoria. Optional |
user_id |
int |
ID do usuário. Optional |
subcategory_id |
int |
ID da subcategoria. Optional |
Body:
{
"title": "Erro no sistema atualizado",
"description": "A descrição foi atualizada.",
"status": "IN_PROGRESS",
"severity_id": 2,
"category_id": 1,
"user_id": 5,
"subcategory_id": 3
}
{
"id": 1,
"title": "Erro no sistema atualizado",
"status": "IN_PROGRESS",
"description": "A descrição foi atualizada.",
"severity_id": 2,
"category_id": 1,
"user_id": 5,
"subcategory_id": 3,
"created_at": "2023-07-15T14:48:00.000Z",
"updated_at": "2023-07-20T12:00:00.000Z",
"completed_at": null
}
-
Número de Tickets em Aberto
-
Total de tickets que ainda não foram resolvidos ou fechados.
-
Número de Tickets Críticos
-
Número de Tickets Finalizados
-
Total de tickets que foram resolvidos e fechados com sucesso.
-
Total de Tickets por Dia/Semana/Mês
-
Quantidade total de tickets criados em um dia, semana ou mês específico. Ajuda a entender a carga de trabalho e a demanda ao longo do tempo.
-
Tempo Médio de Resolução
-
Tempo médio necessário para resolver e fechar um ticket desde a sua abertura. Pode ser segmentado por categoria ou severidade.
-
Taxa de Resolução no Prazo
-
Número de Tickets por Categoria/Subcategoria
-
Percentual de tickets que foram reabertos após terem sido fechados, indicando possíveis problemas na resolução inicial.
-
Tempo Médio de Atendimento
- Guilherme Moura. - Engenheiro de Software.