Skip to content

Commit 6932acc

Browse files
authored
Merge pull request #199 from planetlabs/item-auth
Support items with auth:schemes
2 parents 2e49598 + 70afd7c commit 6932acc

File tree

2 files changed

+189
-0
lines changed

2 files changed

+189
-0
lines changed

extensions/auth/auth.go

+25
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,37 @@ const (
1818
func init() {
1919
r := regexp.MustCompile(extensionPattern)
2020

21+
stac.RegisterItemExtension(r, func() stac.Extension { return &Item{} })
2122
stac.RegisterCollectionExtension(r, func() stac.Extension { return &Collection{} })
2223
stac.RegisterCatalogExtension(r, func() stac.Extension { return &Catalog{} })
2324
stac.RegisterAssetExtension(r, func() stac.Extension { return &Asset{} })
2425
stac.RegisterLinkExtension(r, func() stac.Extension { return &Link{} })
2526
}
2627

28+
type Item struct {
29+
Schemes map[string]*Scheme `json:"auth:schemes,omitempty"`
30+
}
31+
32+
var _ stac.Extension = (*Item)(nil)
33+
34+
func (*Item) URI() string {
35+
return extensionUri
36+
}
37+
38+
func (e *Item) Encode(itemMap map[string]any) error {
39+
return stac.EncodeExtendedItemProperties(e, itemMap)
40+
}
41+
42+
func (e *Item) Decode(itemMap map[string]any) error {
43+
if err := stac.DecodeExtendedItemProperties(e, itemMap); err != nil {
44+
return err
45+
}
46+
if e.Schemes == nil {
47+
return stac.ErrExtensionDoesNotApply
48+
}
49+
return nil
50+
}
51+
2752
type Collection struct {
2853
Schemes map[string]*Scheme
2954
}

extensions/auth/auth_test.go

+164
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,88 @@ import (
1010
"github.com/stretchr/testify/require"
1111
)
1212

13+
func TestItemExtendedMarshal(t *testing.T) {
14+
item := &stac.Item{
15+
Version: "1.0.0",
16+
Id: "item-id",
17+
Geometry: map[string]any{
18+
"type": "Point",
19+
"coordinates": []float64{0, 0},
20+
},
21+
Properties: map[string]any{
22+
"test": "value",
23+
},
24+
Links: []*stac.Link{
25+
{Href: "https://example.com/stac/item-id", Rel: "self"},
26+
},
27+
Assets: map[string]*stac.Asset{
28+
"image": {
29+
Title: "Image",
30+
Href: "https://example.com/stac/item-id/image.tif",
31+
Type: "image/tif",
32+
Extensions: []stac.Extension{
33+
&auth.Asset{
34+
Refs: []string{"openid"},
35+
},
36+
},
37+
},
38+
},
39+
Extensions: []stac.Extension{
40+
&auth.Item{
41+
Schemes: map[string]*auth.Scheme{
42+
"openid": {
43+
Type: "openIdConnect",
44+
Description: "Test auth configuration",
45+
OpenIdConnectUrl: "https://example.com/auth/.well-known/openid-configuration",
46+
},
47+
},
48+
},
49+
},
50+
}
51+
52+
data, err := json.Marshal(item)
53+
require.NoError(t, err)
54+
55+
expected := `{
56+
"type": "Feature",
57+
"stac_version": "1.0.0",
58+
"id": "item-id",
59+
"geometry": {
60+
"type": "Point",
61+
"coordinates": [0, 0]
62+
},
63+
"properties": {
64+
"test": "value",
65+
"auth:schemes": {
66+
"openid": {
67+
"type": "openIdConnect",
68+
"description": "Test auth configuration",
69+
"openIdConnectUrl": "https://example.com/auth/.well-known/openid-configuration"
70+
}
71+
}
72+
},
73+
"links": [
74+
{
75+
"rel": "self",
76+
"href": "https://example.com/stac/item-id"
77+
}
78+
],
79+
"assets": {
80+
"image": {
81+
"title": "Image",
82+
"href": "https://example.com/stac/item-id/image.tif",
83+
"type": "image/tif",
84+
"auth:refs": ["openid"]
85+
}
86+
},
87+
"stac_extensions": [
88+
"https://stac-extensions.github.io/authentication/v1.1.0/schema.json"
89+
]
90+
}`
91+
92+
assert.JSONEq(t, expected, string(data))
93+
}
94+
1395
func TestCollectionExtendedMarshal(t *testing.T) {
1496
collection := &stac.Collection{
1597
Version: "1.0.0",
@@ -150,6 +232,88 @@ func TestCollectionLinkExtendedMarshal(t *testing.T) {
150232
assert.JSONEq(t, expected, string(data))
151233
}
152234

235+
func TestItemExtendedUnmarshal(t *testing.T) {
236+
data := []byte(`{
237+
"type": "Feature",
238+
"stac_version": "1.0.0",
239+
"id": "item-id",
240+
"geometry": {
241+
"type": "Point",
242+
"coordinates": [0, 0]
243+
},
244+
"properties": {
245+
"test": "value",
246+
"auth:schemes": {
247+
"openid": {
248+
"type": "openIdConnect",
249+
"description": "Test auth configuration",
250+
"openIdConnectUrl": "https://example.com/auth/.well-known/openid-configuration"
251+
}
252+
}
253+
},
254+
"links": [
255+
{
256+
"rel": "self",
257+
"href": "https://example.com/stac/item-id"
258+
}
259+
],
260+
"assets": {
261+
"image": {
262+
"title": "Image",
263+
"href": "https://example.com/stac/item-id/image.tif",
264+
"type": "image/tif",
265+
"auth:refs": ["openid"]
266+
}
267+
},
268+
"stac_extensions": [
269+
"https://stac-extensions.github.io/authentication/v1.1.0/schema.json"
270+
]
271+
}`)
272+
273+
item := &stac.Item{}
274+
require.NoError(t, json.Unmarshal(data, item))
275+
276+
expected := &stac.Item{
277+
Version: "1.0.0",
278+
Id: "item-id",
279+
Geometry: map[string]any{
280+
"type": "Point",
281+
"coordinates": []any{float64(0), float64(0)},
282+
},
283+
Properties: map[string]any{
284+
"test": "value",
285+
},
286+
Links: []*stac.Link{
287+
{Href: "https://example.com/stac/item-id", Rel: "self"},
288+
},
289+
Assets: map[string]*stac.Asset{
290+
"image": {
291+
Title: "Image",
292+
Href: "https://example.com/stac/item-id/image.tif",
293+
Type: "image/tif",
294+
Extensions: []stac.Extension{
295+
&auth.Asset{
296+
Refs: []string{"openid"},
297+
},
298+
},
299+
},
300+
},
301+
Extensions: []stac.Extension{
302+
&auth.Item{
303+
Schemes: map[string]*auth.Scheme{
304+
"openid": {
305+
Type: "openIdConnect",
306+
Description: "Test auth configuration",
307+
OpenIdConnectUrl: "https://example.com/auth/.well-known/openid-configuration",
308+
},
309+
},
310+
},
311+
},
312+
}
313+
314+
assert.Equal(t, expected, item)
315+
}
316+
153317
func TestCollectionExtendedUnmarshal(t *testing.T) {
154318
data := []byte(`{
155319
"type": "Collection",

0 commit comments

Comments
 (0)