github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/charmhub/resources.go (about) 1 // Copyright 2020 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charmhub 5 6 import ( 7 "context" 8 "net/http" 9 10 "github.com/juju/errors" 11 "github.com/kr/pretty" 12 13 "github.com/juju/juju/charmhub/path" 14 "github.com/juju/juju/charmhub/transport" 15 ) 16 17 // resourcesClient defines a client for resources requests. 18 type resourcesClient struct { 19 path path.Path 20 client RESTClient 21 logger Logger 22 } 23 24 // newResourcesClient creates a resourcesClient for requesting 25 func newResourcesClient(path path.Path, client RESTClient, logger Logger) *resourcesClient { 26 return &resourcesClient{ 27 path: path, 28 client: client, 29 logger: logger, 30 } 31 } 32 33 // ListResourceRevisions returns a slice of resource revisions for the provided 34 // resource of the given charm. 35 func (c *resourcesClient) ListResourceRevisions(ctx context.Context, charm, resource string) ([]transport.ResourceRevision, error) { 36 c.logger.Tracef("ListResourceRevisions(%s, %s)", charm, resource) 37 var resp transport.ResourcesResponse 38 path, err := c.path.Join(charm, resource, "revisions") 39 if err != nil { 40 return nil, errors.Trace(err) 41 } 42 restResp, err := c.client.Get(ctx, path, &resp) 43 if err != nil { 44 return nil, errors.Trace(err) 45 } 46 if restResp.StatusCode == http.StatusNotFound { 47 return nil, errors.NotFoundf("%q for %q", charm, resource) 48 } 49 if c.logger.IsTraceEnabled() { 50 c.logger.Tracef("ListResourceRevisions(%s, %s) unmarshalled: %s", charm, resource, pretty.Sprint(resp.Revisions)) 51 } 52 return resp.Revisions, nil 53 }