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