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  }