func (s *Server) ListResourceVersions(pipelineDB db.PipelineDB) http.Handler { logger := s.logger.Session("list-resource-versions") return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var ( err error until int since int limit int ) resourceName := r.FormValue(":resource_name") urlUntil := r.FormValue(atc.PaginationQueryUntil) until, _ = strconv.Atoi(urlUntil) urlSince := r.FormValue(atc.PaginationQuerySince) since, _ = strconv.Atoi(urlSince) urlLimit := r.FormValue(atc.PaginationQueryLimit) limit, _ = strconv.Atoi(urlLimit) if limit == 0 { limit = atc.PaginationAPIDefaultLimit } versions, pagination, found, err := pipelineDB.GetResourceVersions(resourceName, db.Page{Until: until, Since: since, Limit: limit}) if err != nil { logger.Error("failed-to-get-resource-versions", err) w.WriteHeader(http.StatusInternalServerError) return } if !found { w.WriteHeader(http.StatusNotFound) return } if pagination.Next != nil { s.addNextLink(w, pipelineDB.GetPipelineName(), resourceName, *pagination.Next) } if pagination.Previous != nil { s.addPreviousLink(w, pipelineDB.GetPipelineName(), resourceName, *pagination.Previous) } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) resourceVersions := make([]atc.VersionedResource, len(versions)) for i := 0; i < len(versions); i++ { resourceVersions[i] = present.SavedVersionedResource(versions[i]) } json.NewEncoder(w).Encode(resourceVersions) }) }
Resource: resource.Name, Type: resource.Type, Version: db.Version(version), Metadata: nil, PipelineName: pipelineDB.GetPipelineName(), }, }) } err := pipelineDB.SaveResourceVersions(resource, versions) Expect(err).NotTo(HaveOccurred()) }) Context("when there are no versions to be found", func() { It("returns the versions, with previous/next pages", func() { historyPage, pagination, err := pipelineDB.GetResourceVersions("nope", db.Page{}) Expect(err).ToNot(HaveOccurred()) Expect(historyPage).To(Equal([]db.SavedVersionedResource{})) Expect(pagination).To(Equal(db.Pagination{})) }) }) Context("with no since/until", func() { It("returns the first page, with the given limit, and a next page", func() { historyPage, pagination, err := pipelineDB.GetResourceVersions("some-resource", db.Page{Limit: 2}) Expect(err).ToNot(HaveOccurred()) Expect(historyPage).To(Equal([]db.SavedVersionedResource{expectedVersions[9], expectedVersions[8]})) Expect(pagination.Previous).To(BeNil()) Expect(pagination.Next).To(Equal(&db.Page{Since: expectedVersions[8].ID, Limit: 2})) }) })