letsgooo/api/petstore.go
2025-03-06 23:28:53 +01:00

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)
}