93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
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)
|
|
}
|