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  }