github.com/PDOK/gokoala@v0.50.6/internal/ogc/common/geospatial/main.go (about) 1 package geospatial 2 3 import ( 4 "net/http" 5 6 "github.com/PDOK/gokoala/internal/engine" 7 "github.com/go-chi/chi/v5" 8 ) 9 10 const ( 11 CollectionsPath = "/collections" 12 templatesDir = "internal/ogc/common/geospatial/templates/" 13 ) 14 15 type Collections struct { 16 engine *engine.Engine 17 } 18 19 // NewCollections enables support for OGC APIs that organize data in the concept of collections. 20 // A collection, also known as a geospatial data resource, is a common way to organize data in various OGC APIs. 21 func NewCollections(e *engine.Engine) *Collections { 22 if e.Config.HasCollections() { 23 collectionsBreadcrumbs := []engine.Breadcrumb{ 24 { 25 Name: "Collections", 26 Path: "collections", 27 }, 28 } 29 e.RenderTemplates(CollectionsPath, 30 collectionsBreadcrumbs, 31 engine.NewTemplateKey(templatesDir+"collections.go.json"), 32 engine.NewTemplateKey(templatesDir+"collections.go.html")) 33 34 for _, coll := range e.Config.AllCollections().Unique() { 35 title := coll.ID 36 if coll.Metadata != nil && coll.Metadata.Title != nil { 37 title = *coll.Metadata.Title 38 } 39 collectionBreadcrumbs := collectionsBreadcrumbs 40 collectionBreadcrumbs = append(collectionBreadcrumbs, []engine.Breadcrumb{ 41 { 42 Name: title, 43 Path: "collections/" + coll.ID, 44 }, 45 }...) 46 e.RenderTemplatesWithParams(coll, 47 nil, 48 engine.NewTemplateKeyWithName(templatesDir+"collection.go.json", coll.ID)) 49 e.RenderTemplatesWithParams(coll, 50 collectionBreadcrumbs, 51 engine.NewTemplateKeyWithName(templatesDir+"collection.go.html", coll.ID)) 52 } 53 } 54 55 instance := &Collections{ 56 engine: e, 57 } 58 59 e.Router.Get(CollectionsPath, instance.Collections()) 60 e.Router.Get(CollectionsPath+"/{collectionId}", instance.Collection()) 61 62 return instance 63 } 64 65 // Collections returns list of collections 66 func (c *Collections) Collections() http.HandlerFunc { 67 return func(w http.ResponseWriter, r *http.Request) { 68 key := engine.NewTemplateKeyWithLanguage(templatesDir+"collections.go."+c.engine.CN.NegotiateFormat(r), c.engine.CN.NegotiateLanguage(w, r)) 69 c.engine.ServePage(w, r, key) 70 } 71 } 72 73 // Collection provides METADATA about a specific collection. To get the CONTENTS of a collection each OGC API 74 // building block must provide a separate/specific endpoint. 75 // 76 // For example in: 77 // - OGC API Features you would have: /collections/{collectionId}/items 78 // - OGC API Tiles could have: /collections/{collectionId}/tiles 79 // - OGC API Maps could have: /collections/{collectionId}/maps 80 // - OGC API 3d GeoVolumes would have: /collections/{collectionId}/3dtiles 81 func (c *Collections) Collection() http.HandlerFunc { 82 return func(w http.ResponseWriter, r *http.Request) { 83 collectionID := chi.URLParam(r, "collectionId") 84 85 key := engine.NewTemplateKeyWithNameAndLanguage(templatesDir+"collection.go."+c.engine.CN.NegotiateFormat(r), collectionID, c.engine.CN.NegotiateLanguage(w, r)) 86 c.engine.ServePage(w, r, key) 87 } 88 }