github.com/miguelgrubin/gin-boilerplate@v0.0.0-20231208120009-f8f00c6d4138/pkg/petshop/infrastructure/storage/sql_pet_repository.go (about)

     1  package storage
     2  
     3  import (
     4  	"errors"
     5  	"log"
     6  
     7  	"github.com/miguelgrubin/gin-boilerplate/pkg/petshop/domain"
     8  	"github.com/miguelgrubin/gin-boilerplate/pkg/shared"
     9  	"gorm.io/gorm"
    10  )
    11  
    12  type SQLPetRepository struct {
    13  	db *gorm.DB
    14  }
    15  
    16  func NewPetRepository(db *gorm.DB) domain.PetRepository {
    17  	var petRepository domain.PetRepository = SQLPetRepository{db}
    18  	return petRepository
    19  }
    20  
    21  var _ domain.PetRepository = &SQLPetRepository{}
    22  
    23  func (r SQLPetRepository) Save(pet domain.Pet) error {
    24  	var err error
    25  	var prev PetEntity
    26  	err = r.db.First(&prev, "id = ?", pet.ID.String()).Error
    27  
    28  	if errors.Is(err, gorm.ErrRecordNotFound) {
    29  		err = r.db.Debug().Create(PetEntityFromDomain(pet)).Error
    30  		if err != nil {
    31  			log.Println(err.Error())
    32  			return err
    33  		}
    34  		return nil
    35  	}
    36  
    37  	err = r.db.Debug().Save(PetEntityFromDomain(pet)).Error
    38  	return err
    39  }
    40  
    41  func (r SQLPetRepository) FindOne(id shared.EntityID) (*domain.Pet, error) {
    42  	var pet PetEntity
    43  	err := r.db.Debug().Where("id = ?", id).Take(&pet).Error
    44  	if errors.Is(err, gorm.ErrRecordNotFound) {
    45  		return nil, &domain.PetNotFound{ID: id.String()}
    46  	}
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  	petDomain := PetEntityToDomain(pet)
    51  	return &petDomain, nil
    52  }
    53  
    54  func (r SQLPetRepository) FindAll() ([]domain.Pet, error) {
    55  	var pets []PetEntity
    56  	err := r.db.Debug().Find(&pets).Error
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  	domainPets := make([]domain.Pet, len(pets))
    61  	for i, v := range pets {
    62  		domainPets[i] = PetEntityToDomain(v)
    63  	}
    64  	return domainPets, nil
    65  }
    66  
    67  func (r SQLPetRepository) Delete(id shared.EntityID) error {
    68  	var pet PetEntity
    69  	err := r.db.Debug().Where("id = ?", id).Delete(&pet).Error
    70  	if err != nil {
    71  		return errors.New("database error, please try again")
    72  	}
    73  	return nil
    74  }
    75  
    76  func Automigrate(db *gorm.DB) error {
    77  	return db.AutoMigrate(&PetEntity{})
    78  }