feat(http): add labels to bucket responses

pull/10616/head
Jade McGough 2019-01-03 15:56:52 -08:00
parent 910d310c20
commit 815795261d
5 changed files with 69 additions and 28 deletions

View File

@ -188,17 +188,26 @@ func newBucketUpdate(pb *platform.BucketUpdate) *bucketUpdate {
type bucketResponse struct {
Links map[string]string `json:"links"`
bucket
Labels []platform.Label `json:"labels"`
}
func newBucketResponse(b *platform.Bucket) *bucketResponse {
return &bucketResponse{
func newBucketResponse(b *platform.Bucket, labels []*platform.Label) *bucketResponse {
res := &bucketResponse{
Links: map[string]string{
"self": fmt.Sprintf("/api/v2/buckets/%s", b.ID),
"log": fmt.Sprintf("/api/v2/buckets/%s/log", b.ID),
"org": fmt.Sprintf("/api/v2/orgs/%s", b.OrganizationID),
"self": fmt.Sprintf("/api/v2/buckets/%s", b.ID),
"log": fmt.Sprintf("/api/v2/buckets/%s/log", b.ID),
"labels": fmt.Sprintf("/api/v2/buckets/%s/labels", b.ID),
"org": fmt.Sprintf("/api/v2/orgs/%s", b.OrganizationID),
},
bucket: *newBucket(b),
Labels: []platform.Label{},
}
for _, l := range labels {
res.Labels = append(res.Labels, *l)
}
return res
}
type bucketsResponse struct {
@ -206,10 +215,11 @@ type bucketsResponse struct {
Buckets []*bucketResponse `json:"buckets"`
}
func newBucketsResponse(opts platform.FindOptions, f platform.BucketFilter, bs []*platform.Bucket) *bucketsResponse {
func newBucketsResponse(ctx context.Context, opts platform.FindOptions, f platform.BucketFilter, bs []*platform.Bucket, labelService platform.LabelService) *bucketsResponse {
rs := make([]*bucketResponse, 0, len(bs))
for _, b := range bs {
rs = append(rs, newBucketResponse(b))
labels, _ := labelService.FindLabels(ctx, platform.LabelFilter{ResourceID: b.ID})
rs = append(rs, newBucketResponse(b, labels))
}
return &bucketsResponse{
Links: newPagingLinks(bucketsPath, opts, f, len(bs)),
@ -232,7 +242,7 @@ func (h *BucketHandler) handlePostBucket(w http.ResponseWriter, r *http.Request)
return
}
if err := encodeResponse(ctx, w, http.StatusCreated, newBucketResponse(req.Bucket)); err != nil {
if err := encodeResponse(ctx, w, http.StatusCreated, newBucketResponse(req.Bucket, []*platform.Label{})); err != nil {
logEncodingError(h.Logger, r, err)
return
}
@ -283,7 +293,13 @@ func (h *BucketHandler) handleGetBucket(w http.ResponseWriter, r *http.Request)
return
}
if err := encodeResponse(ctx, w, http.StatusOK, newBucketResponse(b)); err != nil {
labels, err := h.LabelService.FindLabels(ctx, platform.LabelFilter{ResourceID: b.ID})
if err != nil {
EncodeError(ctx, err, w)
return
}
if err := encodeResponse(ctx, w, http.StatusOK, newBucketResponse(b, labels)); err != nil {
logEncodingError(h.Logger, r, err)
return
}
@ -367,7 +383,7 @@ func (h *BucketHandler) handleGetBuckets(w http.ResponseWriter, r *http.Request)
return
}
if err := encodeResponse(ctx, w, http.StatusOK, newBucketsResponse(req.opts, req.filter, bs)); err != nil {
if err := encodeResponse(ctx, w, http.StatusOK, newBucketsResponse(ctx, req.opts, req.filter, bs, h.LabelService)); err != nil {
logEncodingError(h.Logger, r, err)
return
}
@ -424,7 +440,13 @@ func (h *BucketHandler) handlePatchBucket(w http.ResponseWriter, r *http.Request
return
}
if err := encodeResponse(ctx, w, http.StatusOK, newBucketResponse(b)); err != nil {
labels, err := h.LabelService.FindLabels(ctx, platform.LabelFilter{ResourceID: b.ID})
if err != nil {
EncodeError(ctx, err, w)
return
}
if err := encodeResponse(ctx, w, http.StatusOK, newBucketResponse(b, labels)); err != nil {
logEncodingError(h.Logger, r, err)
return
}

View File

@ -78,23 +78,27 @@ func TestService_handleGetBuckets(t *testing.T) {
"links": {
"org": "/api/v2/orgs/50f7ba1150f7ba11",
"self": "/api/v2/buckets/0b501e7e557ab1ed",
"log": "/api/v2/buckets/0b501e7e557ab1ed/log"
"log": "/api/v2/buckets/0b501e7e557ab1ed/log",
"labels": "/api/v2/buckets/0b501e7e557ab1ed/labels"
},
"id": "0b501e7e557ab1ed",
"organizationID": "50f7ba1150f7ba11",
"name": "hello",
"retentionRules": [{"type": "expire", "everySeconds": 2}]
"retentionRules": [{"type": "expire", "everySeconds": 2}],
"labels": []
},
{
"links": {
"org": "/api/v2/orgs/7e55e118dbabb1ed",
"self": "/api/v2/buckets/c0175f0077a77005",
"log": "/api/v2/buckets/c0175f0077a77005/log"
"log": "/api/v2/buckets/c0175f0077a77005/log",
"labels": "/api/v2/buckets/c0175f0077a77005/labels"
},
"id": "c0175f0077a77005",
"organizationID": "7e55e118dbabb1ed",
"name": "example",
"retentionRules": [{"type": "expire", "everySeconds": 86400}]
"retentionRules": [{"type": "expire", "everySeconds": 86400}],
"labels": []
}
]
}
@ -216,12 +220,14 @@ func TestService_handleGetBucket(t *testing.T) {
"links": {
"org": "/api/v2/orgs/020f755c3c082000",
"self": "/api/v2/buckets/020f755c3c082000",
"log": "/api/v2/buckets/020f755c3c082000/log"
"log": "/api/v2/buckets/020f755c3c082000/log",
"labels": "/api/v2/buckets/020f755c3c082000/labels"
},
"id": "020f755c3c082000",
"organizationID": "020f755c3c082000",
"name": "hello",
"retentionRules": [{"type": "expire", "everySeconds": 30}]
"retentionRules": [{"type": "expire", "everySeconds": 30}],
"labels": []
}
`,
},
@ -332,12 +338,14 @@ func TestService_handlePostBucket(t *testing.T) {
"links": {
"org": "/api/v2/orgs/6f626f7274697320",
"self": "/api/v2/buckets/020f755c3c082000",
"log": "/api/v2/buckets/020f755c3c082000/log"
"log": "/api/v2/buckets/020f755c3c082000/log",
"labels": "/api/v2/buckets/020f755c3c082000/labels"
},
"id": "020f755c3c082000",
"organizationID": "6f626f7274697320",
"name": "hello",
"retentionRules": []
"retentionRules": [],
"labels": []
}
`,
},
@ -542,12 +550,14 @@ func TestService_handlePatchBucket(t *testing.T) {
"links": {
"org": "/api/v2/orgs/020f755c3c082000",
"self": "/api/v2/buckets/020f755c3c082000",
"log": "/api/v2/buckets/020f755c3c082000/log"
"log": "/api/v2/buckets/020f755c3c082000/log",
"labels": "/api/v2/buckets/020f755c3c082000/labels"
},
"id": "020f755c3c082000",
"organizationID": "020f755c3c082000",
"name": "example",
"retentionRules": [{"type": "expire", "everySeconds": 2}]
"retentionRules": [{"type": "expire", "everySeconds": 2}],
"labels": []
}
`,
},
@ -613,12 +623,14 @@ func TestService_handlePatchBucket(t *testing.T) {
"links": {
"org": "/api/v2/orgs/020f755c3c082000",
"self": "/api/v2/buckets/020f755c3c082000",
"log": "/api/v2/buckets/020f755c3c082000/log"
"log": "/api/v2/buckets/020f755c3c082000/log",
"labels": "/api/v2/buckets/020f755c3c082000/labels"
},
"id": "020f755c3c082000",
"organizationID": "020f755c3c082000",
"name": "bucket with no retention",
"retentionRules": []
"retentionRules": [],
"labels": []
}
`,
},
@ -665,12 +677,14 @@ func TestService_handlePatchBucket(t *testing.T) {
"links": {
"org": "/api/v2/orgs/020f755c3c082000",
"self": "/api/v2/buckets/020f755c3c082000",
"log": "/api/v2/buckets/020f755c3c082000/log"
"log": "/api/v2/buckets/020f755c3c082000/log",
"labels": "/api/v2/buckets/020f755c3c082000/labels"
},
"id": "020f755c3c082000",
"organizationID": "020f755c3c082000",
"name": "b1",
"retentionRules": []
"retentionRules": [],
"labels": []
}
`,
},

View File

@ -92,7 +92,7 @@ func newOnboardingResponse(results *platform.OnboardingResults) *onboardingRespo
}
return &onboardingResponse{
User: newUserResponse(results.User),
Bucket: newBucketResponse(results.Bucket),
Bucket: newBucketResponse(results.Bucket, []*platform.Label{}),
Organization: newOrgResponse(results.Org),
Auth: newAuthResponse(results.Auth, results.Org, results.User, ps),
}

View File

@ -4770,6 +4770,8 @@ components:
example: 86400
minimum: 1
required: [type, everySeconds]
labels:
$ref: "#/components/schemas/Labels"
required: [name, retentionRules]
Buckets:
type: object
@ -6600,8 +6602,10 @@ components:
properties:
self:
type: string
owners:
$ref: "#/components/schemas/Owners"
labels:
type: string
labels:
$ref: "#/components/schemas/Labels"
Telegrafs:
type: object
properties:

View File

@ -98,6 +98,7 @@ func newTelegrafResponse(tc *platform.TelegrafConfig, labels []*platform.Label)
Self: fmt.Sprintf("/api/v2/telegrafs/%s", tc.ID),
Labels: fmt.Sprintf("/api/v2/telegrafs/%s/labels", tc.ID),
},
Labels: []platform.Label{},
}
for _, l := range labels {