Add public GeoJSON features API and load public 3D objects on maps.
CI / test (push) Successful in 3s

Expose GET /v1/features/public (optional kind filter) and update Leaflet/MapLibre demos to render all public 3D assets globally, while still merging owner collections after login.

Made-with: Cursor
This commit is contained in:
2026-03-02 22:21:21 +00:00
parent b833c2ac6e
commit 59c9a719e0
8 changed files with 235 additions and 24 deletions
+37
View File
@@ -395,6 +395,43 @@ func (s *Service) ListFeatures(ownerKey, collectionID string) ([]store.Feature,
return features, nil
}
func (s *Service) ListPublicFeatures(kind string) []store.Feature {
filterKind := strings.TrimSpace(strings.ToLower(kind))
features := s.store.ListFeaturesAll()
result := make([]store.Feature, 0, len(features))
for idx := range features {
featureAssets := s.store.ListAssetsByFeature(features[idx].ID)
assets := make([]map[string]interface{}, 0, len(featureAssets))
for _, linkedAsset := range featureAssets {
if !linkedAsset.IsPublic {
continue
}
if filterKind != "" && linkedAsset.Kind != filterKind {
continue
}
assets = append(assets, map[string]interface{}{
"id": linkedAsset.ID,
"kind": linkedAsset.Kind,
"name": linkedAsset.Name,
"description": linkedAsset.Description,
"checksum": linkedAsset.Checksum,
"ext": linkedAsset.Ext,
"isPublic": linkedAsset.IsPublic,
"link": "/v1/assets/" + linkedAsset.ID + "/download",
})
}
if len(assets) == 0 {
continue
}
if features[idx].Properties == nil {
features[idx].Properties = map[string]interface{}{}
}
features[idx].Properties["assets"] = assets
result = append(result, features[idx])
}
return result
}
func (s *Service) DeleteFeature(ownerKey, featureID string) error {
feature, err := s.store.GetFeature(featureID)
if err != nil {