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 }