package api import ( "encoding/json" "fmt" "net/http" "gorm.io/gorm" ) type PetStore struct { DB *gorm.DB } // Make sure we conform to ServerInterface var _ ServerInterface = (*PetStore)(nil) // sendPetStoreError wraps sending of an error in the Error format, and // handling the failure to marshal that. func sendPetStoreError(w http.ResponseWriter, code int, message string) { petErr := Error{ Code: int32(code), Message: message, } w.WriteHeader(code) _ = json.NewEncoder(w).Encode(petErr) } // FindPets implements all the handlers in the ServerInterface func (p *PetStore) FindPets(w http.ResponseWriter, r *http.Request, params FindPetsParams) { var pets []Pet query := p.DB if params.Tags != nil { query = query.Where("tag IN ?", *params.Tags) } if params.Limit != nil { query = query.Limit(int(*params.Limit)) } if err := query.Find(&pets).Error; err != nil { sendPetStoreError(w, http.StatusInternalServerError, "Database error") return } w.WriteHeader(http.StatusOK) _ = json.NewEncoder(w).Encode(pets) } func (p *PetStore) AddPet(w http.ResponseWriter, r *http.Request) { // We expect a NewPet object in the request body. var newPet NewPet if err := json.NewDecoder(r.Body).Decode(&newPet); err != nil { sendPetStoreError(w, http.StatusBadRequest, "Invalid format for NewPet") return } pet := Pet{ Name: newPet.Name, Tag: newPet.Tag, } if err := p.DB.Create(&pet).Error; err != nil { sendPetStoreError(w, http.StatusInternalServerError, "Failed to create pet") return } // Now, we have to return the NewPet w.WriteHeader(http.StatusCreated) _ = json.NewEncoder(w).Encode(pet) } func (p *PetStore) FindPetByID(w http.ResponseWriter, r *http.Request, id int64) { var pet Pet if err := p.DB.First(&pet, id).Error; err != nil { sendPetStoreError(w, http.StatusNotFound, fmt.Sprintf("Pet with ID %d not found", id)) return } w.WriteHeader(http.StatusOK) _ = json.NewEncoder(w).Encode(pet) } func (p *PetStore) DeletePet(w http.ResponseWriter, r *http.Request, id int64) { if err := p.DB.Delete(&Pet{}, id).Error; err != nil { sendPetStoreError(w, http.StatusNotFound, fmt.Sprintf("Pet with ID %d not found", id)) return } w.WriteHeader(http.StatusNoContent) }