package database
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.tovijaeschke.xyz/tovi/JumboPetstore/models"
|
|
"git.tovijaeschke.xyz/tovi/JumboPetstore/util"
|
|
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
func CreatePet(petData *models.Pet) error {
|
|
var (
|
|
photoUrls []string
|
|
photoUrl string
|
|
fileName string
|
|
err error
|
|
)
|
|
|
|
for _, photoUrl = range petData.PhotoUrlJson {
|
|
fileName, err = util.DownloadFile(photoUrl)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
petData.PhotoUrls = append(petData.PhotoUrls, models.PetPhoto{
|
|
PetId: petData.Id,
|
|
FileName: fileName,
|
|
})
|
|
|
|
photoUrls = append(photoUrls, fmt.Sprintf(
|
|
"/images/%s",
|
|
fileName,
|
|
))
|
|
}
|
|
|
|
petData.PhotoUrlJson = photoUrls
|
|
|
|
err = DB.Session(&gorm.Session{FullSaveAssociations: true}).
|
|
Omit("PhotoUrlJson").
|
|
Create(petData).
|
|
Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func UpdatePet(petData *models.Pet) error {
|
|
var (
|
|
photoUrls []string
|
|
photoUrl string
|
|
fileName string
|
|
err error
|
|
)
|
|
|
|
for _, photoUrl = range petData.PhotoUrlJson {
|
|
fileName, err = util.DownloadFile(photoUrl)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
petData.PhotoUrls = append(petData.PhotoUrls, models.PetPhoto{
|
|
PetId: petData.Id,
|
|
FileName: fileName,
|
|
})
|
|
|
|
photoUrls = append(photoUrls, fmt.Sprintf(
|
|
"/images/%s",
|
|
fileName,
|
|
))
|
|
}
|
|
|
|
petData.PhotoUrlJson = photoUrls
|
|
|
|
// This leaves some orphaned files in ./uploads
|
|
DB.Model(petData).Association("PhotoUrls").Replace(petData.PhotoUrls)
|
|
DB.Model(petData).Association("Tags").Replace(petData.Tags)
|
|
|
|
err = DB.Session(&gorm.Session{FullSaveAssociations: true}).
|
|
Omit("PhotoUrlJson").
|
|
Updates(petData).
|
|
Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func GetPetById(id int) models.Pet {
|
|
var (
|
|
petData models.Pet
|
|
petPhoto models.PetPhoto
|
|
photoUrls []string
|
|
)
|
|
|
|
DB.Preload(clause.Associations).First(&petData, "id = ?", id)
|
|
|
|
for _, petPhoto = range petData.PhotoUrls {
|
|
photoUrls = append(photoUrls, "/images/"+petPhoto.FileName)
|
|
}
|
|
|
|
petData.PhotoUrlJson = photoUrls
|
|
|
|
return petData
|
|
}
|
|
|
|
func DeletePet(petData models.Pet) {
|
|
DB.Preload(clause.Associations).Delete(&petData)
|
|
}
|
|
|
|
func GetPetsByStatus(status string) ([]models.Pet, error) {
|
|
var (
|
|
petDatas []models.Pet
|
|
petPhoto models.PetPhoto
|
|
photoUrls []string
|
|
i int
|
|
err error
|
|
)
|
|
|
|
err = DB.Preload(clause.Associations).
|
|
Where("status = ?", status).
|
|
Find(&petDatas).
|
|
Error
|
|
if err != nil {
|
|
return petDatas, err
|
|
}
|
|
|
|
for i = range petDatas {
|
|
photoUrls = []string{}
|
|
|
|
for _, petPhoto = range petDatas[i].PhotoUrls {
|
|
photoUrls = append(photoUrls, "/images/"+petPhoto.FileName)
|
|
}
|
|
|
|
petDatas[i].PhotoUrlJson = photoUrls
|
|
}
|
|
|
|
return petDatas, err
|
|
}
|
|
|
|
func AddPhotoToPet(petData *models.Pet, fileName string, additionalMetadata string, fileBytes []byte) (string, error) {
|
|
var (
|
|
err error
|
|
)
|
|
|
|
fileName, err = util.WriteFile(fileName, fileBytes)
|
|
|
|
petData.PhotoUrls = append(petData.PhotoUrls, models.PetPhoto{
|
|
PetId: petData.Id,
|
|
FileName: fileName,
|
|
AdditionalMetadata: additionalMetadata,
|
|
})
|
|
|
|
err = DB.Session(&gorm.Session{FullSaveAssociations: true}).
|
|
Omit("PhotoUrlJson").
|
|
Updates(&petData).
|
|
Error
|
|
|
|
return fileName, err
|
|
}
|