Spec Backend Com Golang E Gin • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 07.1 — Relacionamento Has Many com Chave Estrangeira

Contexto: Relacionamento Has Many com Chave Estrangeira no contexto de Associações no GORM e Preloading.

Requisitos de Execução:

  1. Modelar structs Cliente e Pedido onde Cliente possui lista de pedidos (Pedidos []Pedido).

Resultado Esperado

Associação 1:N modelada no GORM com chave estrangeira.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_07_1_SeuNome
  2. Envie na tarefa: Atividade Cap 07 - Associações no GORM e Preloading
🔑 Gabarito de Código & Solução Comentada
// models/relacionamentos.go
package models

import "gorm.io/gorm"

type ClienteComPedidos struct {
	gorm.Model
	Nome    string
	Pedidos []Pedido `gorm:"foreignKey:ClienteID"`
}

type Pedido struct {
	gorm.Model
	ClienteID uint
	Valor     float64
}

🔍 Nível 2: Prática

Problema 07.2 — Carregamento Antecipado com db.Preload(‘Pedidos’)

Contexto: Carregamento Antecipado com db.Preload(‘Pedidos’) no contexto de Associações no GORM e Preloading.

Requisitos de Execução:

  1. Buscar cliente e carregar todos os seus pedidos em uma única operação com db.Preload('Pedidos').Find(&clientes).

Resultado Esperado

Clientes e respectivos pedidos carregados sem gerar queries N+1.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_07_2_SeuNome
  2. Envie na tarefa: Atividade Cap 07 - Associações no GORM e Preloading
🔑 Gabarito de Código & Solução Comentada
// preload_query.go
package main

import (
	"gorm.io/gorm"
	"espec_backend_go_gin/models"
)

func BuscarClientesComPedidos(db *gorm.DB) ([]models.ClienteComPedidos, error) {
	var lista []models.ClienteComPedidos
	err := db.Preload("Pedidos").Find(&lista).Error
	return lista, err
}

⚡ Nível 3: Integração

Problema 07.3 — Relacionamento Many-to-Many com Tabela de Associação (joinTable)

Contexto: Relacionamento Many-to-Many com Tabela de Associação (joinTable) no contexto de Associações no GORM e Preloading.

Requisitos de Execução:

  1. Modelar relação N:M entre Usuario e Regra com tag gorm:'many2many:usuario_regras;'.

Resultado Esperado

Tabela de ligação criada e gerenciada automaticamente pelo GORM.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_07_3_SeuNome
  2. Envie na tarefa: Atividade Cap 07 - Associações no GORM e Preloading
🔑 Gabarito de Código & Solução Comentada
// many_to_many.go
package main

import "gorm.io/gorm"

type Regra struct {
	gorm.Model
	Nome string
}

type UsuarioComRegras struct {
	gorm.Model
	Nome   string
	Regras []Regra `gorm:"many2many:usuario_regras;"`
}

🏆 Nível 4: Desafio Corporativo

Problema 07.4 — Preload Condicional com Filtros Aninhados

Contexto: Preload Condicional com Filtros Aninhados no contexto de Associações no GORM e Preloading.

Requisitos de Execução:

  1. Carregar apenas pedidos com status ‘PAGO’ usando Preload('Pedidos', 'status = ?', 'PAGO').

Resultado Esperado

Preload filtrado executado: Apenas pedidos pagos associados ao cliente.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_07_4_SeuNome
  2. Envie na tarefa: Atividade Cap 07 - Associações no GORM e Preloading
🔑 Gabarito de Código & Solução Comentada
// filtered_preload.go
package main

import "gorm.io/gorm"

func BuscarPedidosPagos(db *gorm.DB, clienteID uint) error {
	var cliente models.ClienteComPedidos
	return db.Preload("Pedidos", "valor > ?", 100.0).First(&cliente, clienteID).Error
}