| @ -0,0 +1,75 @@ | |||||
| package api | |||||
| import ( | |||||
| "context" | |||||
| "net/http" | |||||
| "strconv" | |||||
| "git.brettb.xyz/goinv/server/internal/types" | |||||
| "github.com/go-chi/chi/v5" | |||||
| "github.com/go-chi/render" | |||||
| ) | |||||
| func (s *APIServer) setupBuildingRoutes() func(chi.Router) { | |||||
| return func(r chi.Router) { | |||||
| r.Get("/", makeHandler(s.getShelves)) | |||||
| r.Post("/", makeHandler(s.createShelf)) | |||||
| r.Route("/{buildingId}", func(r chi.Router) { | |||||
| r.Use(s.BuildingCtx) | |||||
| }) | |||||
| } | |||||
| } | |||||
| func (s *APIServer) BuildingCtx(next http.Handler) http.Handler { | |||||
| return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | |||||
| buildingIdStr := chi.URLParam(r, "buildingId") | |||||
| buildingId, err := strconv.ParseUint(buildingIdStr, 10, 64) | |||||
| if err != nil { | |||||
| render.Render(w, r, errNotFound) | |||||
| return | |||||
| } | |||||
| building, err := s.db.GetBuildingByID(buildingId) | |||||
| if err != nil { | |||||
| render.Render(w, r, errNotFound) | |||||
| return | |||||
| } | |||||
| ctx := context.WithValue(r.Context(), "building", building) | |||||
| next.ServeHTTP(w, r.WithContext(ctx)) | |||||
| }) | |||||
| } | |||||
| func (s *APIServer) getBuildings(w http.ResponseWriter, r *http.Request) error { | |||||
| buildings, err := s.db.GetBuildings(0, 10) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| total, err := s.db.TotalBuildings() | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| return render.Render(w, r, &types.MultipleBuildingResponse{ | |||||
| Response: &types.Response{ | |||||
| HTTPStatusCode: http.StatusOK, | |||||
| }, | |||||
| Buildings: buildings, | |||||
| Total: total, | |||||
| }) | |||||
| } | |||||
| func (s *APIServer) getBuilding(w http.ResponseWriter, r *http.Request) error { | |||||
| ctx := r.Context() | |||||
| building, ok := ctx.Value("building").(*types.Building) | |||||
| if !ok { | |||||
| return render.Render(w, r, errUnprocessable) | |||||
| } | |||||
| return render.Render(w, r, &types.BuildingResponse{ | |||||
| Response: &types.Response{ | |||||
| HTTPStatusCode: http.StatusOK, | |||||
| }, | |||||
| Building: building, | |||||
| }) | |||||
| } | |||||