package main import ( "encoding/json" "log" "net/http" "github.com/gorilla/mux" "github.com/jinzhu/gorm" "github.com/rs/cors" _ "github.com/jinzhu/gorm/dialects/postgres" ) type Driver struct { gorm.Model Name string License string Cars []Car } type Car struct { gorm.Model Year int Make string ModelName string DriverID int } var db *gorm.DB var err error var ( drivers = []Driver{ {Name: "Jimmy Johnson", License: "ABC123"}, {Name: "Howard Hills", License: "XYZ789"}, {Name: "Craig Colbin", License: "DEF333"}, } cars = []Car{ {Year: 2000, Make: "Toyota", ModelName: "Tundra", DriverID: 1}, {Year: 2001, Make: "Honda", ModelName: "Accord", DriverID: 1}, {Year: 2002, Make: "Nissan", ModelName: "Sentra", DriverID: 2}, {Year: 2003, Make: "Ford", ModelName: "F-150", DriverID: 3}, } ) func main() { router := mux.NewRouter() db, err = gorm.Open("postgres", "host=db port=5432 user=postgres dbname=postgres sslmode=disable password=postgres") if err != nil { panic("failed to connect database") } defer db.Close() db.AutoMigrate(&Driver{}) db.AutoMigrate(&Car{}) for index := range cars { db.Create(&cars[index]) } for index := range drivers { db.Create(&drivers[index]) } router.HandleFunc("/cars", GetCars).Methods("GET") router.HandleFunc("/cars/{id}", GetCar).Methods("GET") router.HandleFunc("/drivers/{id}", GetDriver).Methods("GET") router.HandleFunc("/cars/{id}", DeleteCar).Methods("DELETE") handler := cors.Default().Handler(router) log.Fatal(http.ListenAndServe("0.0.0.0:8080", handler)) } func GetCars(w http.ResponseWriter, r *http.Request) { var cars []Car db.Find(&cars) json.NewEncoder(w).Encode(&cars) } func GetCar(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) var car Car db.First(&car, params["id"]) json.NewEncoder(w).Encode(&car) } func GetDriver(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) var driver Driver var cars []Car db.First(&driver, params["id"]) db.Model(&driver).Related(&cars) driver.Cars = cars json.NewEncoder(w).Encode(&driver) } func DeleteCar(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) var car Car db.First(&car, params["id"]) db.Delete(&car) var cars []Car db.Find(&cars) json.NewEncoder(w).Encode(&cars) }