Skip to content

marcosggoncalves/api-skeleton-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Exemplo API Golang com Echo Framework (MySQL)

Este guia detalha como configurar o ambiente para desenvolvimento utilizando Go e Air, uma ferramenta de live reload para aplicações Go.

Pré-requisitos

  • Sistema operacional: Windows, macOS ou Linux
  • Terminal ou prompt de comando com permissões administrativas

Instalação do Go

  1. Acesse a página oficial de downloads do Go: https://golang.org/dl/.
  2. Baixe o instalador correspondente ao seu sistema operacional.
  3. Siga as instruções do instalador para completar a instalação.
  4. Verifique se o Go foi instalado corretamente:
    go version

Instalação do Air

  1. Instale o Air usando o comando go install:
    go install github.com/cosmtrek/air@v1.42.0
  2. Verifique se o Air foi instalado corretamente:
    air -v
    O comando acima deve retornar a versão instalada do Air.

Executando o Air no Projeto

  1. Certifique-se de estar no diretório raiz do projeto.
  2. Navegue até a pasta cmd/server (ou o diretório principal do servidor Go no projeto):
    cd cmd/server
  3. Inicie o Air:
    air

O servidor será iniciado com suporte a live reload. Qualquer alteração no código-fonte reiniciará o servidor automaticamente.


Documentação Paginação

O recurso fornece uma implementação eficiente de paginação para aplicações utilizando Echo e GORM, permitindo consultas otimizadas com filtros, preload de relacionamentos e metadados.


Exemplo de Uso

Estrutura do Repositório

No exemplo abaixo, utilizamos o padrão Repository para separar a lógica de acesso ao banco de dados.

package repositories

import (
	"meuprojeto/models"
	"meuprojeto/pagination"

	"github.com/labstack/echo/v4"
	"gorm.io/gorm"
)

// userRepository representa o repositório de usuários
type userRepository struct {
	db *gorm.DB
}

// NewUserRepository cria uma nova instância de userRepository
func NewUserRepository(db *gorm.DB) *userRepository {
	return &userRepository{db: db}
}

// Listagem retorna a lista paginada de usuários
func (r *userRepository) Listagem(c echo.Context) (*pagination.Pagination, error) {
	var users []models.UsuarioView

	// Chamada da função de paginação
	paginations, err := pagination.Paginate(c, r.db, &users, nil, "UsuarioTipo")

	if err != nil {
		return nil, err
	}

	return paginations, nil
}

Exemplo no Handler

No handler, chamamos o método Listagem do repositório para obter os dados paginados.

package handlers

import (
	"net/http"
	"meuprojeto/repositories"

	"github.com/labstack/echo/v4"
)

type UserHandler struct {
	userRepo *repositories.UserRepository
}

// NewUserHandler cria uma nova instância de UserHandler
func NewUserHandler(userRepo *repositories.UserRepository) *UserHandler {
	return &UserHandler{userRepo: userRepo}
}

// ListUsers é o endpoint para listar usuários com paginação
func (h *UserHandler) ListUsers(c echo.Context) error {
	// Chamada ao repositório
	paginations, err := h.userRepo.Listagem(c)
	if err != nil {
		return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
	}

	// Retorna os dados paginados
	return c.JSON(http.StatusOK, paginations)
}

Exemplo de Resposta

Dada a configuração acima, ao fazer uma requisição para o endpoint, o resultado será semelhante a:

Requisição:

GET /users?page=1&limit=10

Resposta:

{
    "total_records": 3,
    "total_pages": 1,
    "items": [
        {
            "id": 1,
            "nome": "Marcos Lopes Gonçalves",
            "cpf": "069.389.123-11",
            "usuario_tipo_id": 1,
            "tipo": {
                "ID": 1,
                "CreatedAt": "2024-11-18T12:46:49.003212Z",
                "UpdatedAt": "2024-11-18T12:46:49.003212Z",
                "DeletedAt": null,
                "nome": "Comum"
            }
        }
    ]
}

Vantagens do Padrão

  • Modularidade: Lógica de acesso ao banco isolada no repositório.
  • Reutilização: Paginate pode ser usado em diferentes repositórios.
  • Extensibilidade: Fácil inclusão de filtros e preload de relacionamentos conforme necessário.

Subindo a Aplicação com Docker

Para iniciar a aplicação, siga os passos abaixo:

  1. Subir o MySQL

Abra um terminal e navegue até o diretório raiz do projeto. Primeiro, suba o contêiner MySQL:

docker-compose up --build mysql -d

Isso iniciará o serviço MySQL. O contêiner estará acessível na porta 3306.

  1. Subir os demais serviços

Depois que o MySQL estiver rodando, suba o restante dos serviços da aplicação (Go + Air):

docker-compose up -d 

O servidor Go estará acessível na porta 8080.

  1. Verificar se tudo está funcionando

Verifique os logs dos contêineres para garantir que tudo está rodando corretamente:

docker-compose logs -f

Acesse a aplicação

Após iniciar os serviços, você pode acessar a aplicação através do seguinte URL no seu navegador:


Parando a Aplicação

Para parar a aplicação e desligar os contêineres Docker, siga os passos abaixo:

  1. Abra um terminal e navegue até o diretório raiz do projeto.
  2. Execute o seguinte comando para parar e remover os contêineres, redes e volumes criados:
docker-compose down

Agora sua aplicação está configurada para rodar com Docker, incluindo o MySQL, o servidor Go com suporte a live reload utilizando o Air e o PHPMyAdmin.

About

API com autenticação JWT, Gorm e EchoV4

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors