package routes import ( "encoding/json" "gitea.deepak.science/deepak/gogmagog/models" "github.com/go-chi/chi" "net/http" "strconv" "time" ) func newPlanRouter(m *models.Model) http.Handler { router := chi.NewRouter() router.Get("/", getAllPlansFunc(m)) router.Post("/", postPlanFunc(m)) router.Get("/{planid}", getPlanByIDFunc(m)) return router } func getAllPlansFunc(m *models.Model) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { plans, err := m.Plans() if err != nil { serverError(w, err) return } w.Header().Add("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(plans); err != nil { serverError(w, err) } } } func getPlanByIDFunc(m *models.Model) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { id, err := strconv.Atoi(chi.URLParam(r, "planid")) if err != nil { notFoundHandler(w, r) return } plan, err := m.Plan(id) if err != nil { if models.IsNotFoundError(err) { notFoundHandler(w, r) return } serverError(w, err) return } w.Header().Add("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(plan); err != nil { serverError(w, err) } } } type createPlanResponse struct { CreatedPlan *models.Plan `json:"created_plan"` ID int64 `json:"id"` } func postPlanFunc(m *models.Model) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { time := time.Now() plan := &models.Plan{PlanDate: &time} id, err := m.AddPlan(plan) if err != nil { serverError(w, err) return } plan, err = m.Plan(id) if err != nil { serverError(w, err) return } response := &createPlanResponse{ CreatedPlan: plan, ID: int64(id), } w.Header().Add("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(response); err != nil { serverError(w, err) } } }