github.com/cozy/cozy-stack@v0.0.0-20240327093429-939e4a21320e/cmd/assets.go (about)

     1  package cmd
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  
     8  	"github.com/cozy/cozy-stack/client/request"
     9  	modelAsset "github.com/cozy/cozy-stack/pkg/assets/model"
    10  	"github.com/spf13/cobra"
    11  )
    12  
    13  var flagURL string
    14  var flagName string
    15  var flagShasum string
    16  var flagContext string
    17  
    18  var assetsCmdGroup = &cobra.Command{
    19  	Use:   "assets <command>",
    20  	Short: "Show and manage dynamic assets",
    21  	Long:  `cozy-stack assets can be used to list, insert or remove dynamic assets`,
    22  }
    23  
    24  var addAssetCmd = &cobra.Command{
    25  	Use:     "add --url <url> --name <name> --shasum <shasum> --context <context>",
    26  	Aliases: []string{"insert"},
    27  	Short:   "Insert a dynamic asset",
    28  	Long: `Insert an asset that will be available on https://<instance>/assets/<name>
    29  
    30  For example, if a dynamic asset with the name '/foo/bar/baz' is added for a
    31  context foocontext, and an instance example.mycozy.cloud is in the foocontext
    32  context, then this asset can be requested on
    33  https://example.mycozy.cloud/assets/foo/bar/baz.js (and not on
    34  'example-app.mycozy.cloud').`,
    35  	Example: "$ cozy-stack assets add --url file:///foo/bar/baz.js --name /foo/bar/baz.js --shasum 0763d6c2cebee0880eb3a9cc25d38cd23db39b5c3802f2dc379e408c877a2788 --context foocontext",
    36  	RunE:    addAsset,
    37  }
    38  
    39  func addAsset(cmd *cobra.Command, args []string) error {
    40  	if flagContext == "" {
    41  		return fmt.Errorf("You must provide a context")
    42  	}
    43  
    44  	assetOption := modelAsset.AssetOption{
    45  		URL:     flagURL,
    46  		Name:    flagName,
    47  		Shasum:  flagShasum,
    48  		Context: flagContext,
    49  	}
    50  
    51  	customAssets := []modelAsset.AssetOption{assetOption}
    52  	marshaledAssets, err := json.Marshal(customAssets)
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	ac := newAdminClient()
    58  	req := &request.Options{
    59  		Method: "POST",
    60  		Path:   "instances/assets",
    61  		Body:   bytes.NewReader(marshaledAssets),
    62  	}
    63  	res, err := ac.Req(req)
    64  	if err != nil {
    65  		return err
    66  	}
    67  	defer res.Body.Close()
    68  	return nil
    69  }
    70  
    71  var rmAssetCmd = &cobra.Command{
    72  	Use:     "rm [context] [name]",
    73  	Aliases: []string{"remove"},
    74  	Short:   "Removes an asset",
    75  	Long:    "Removes a custom asset in a specific context",
    76  	Example: "$ cozy-stack assets rm foobar /foo/bar/baz.js",
    77  	RunE:    rmAsset,
    78  }
    79  
    80  func rmAsset(cmd *cobra.Command, args []string) error {
    81  	// Check params
    82  	if len(args) != 2 {
    83  		return cmd.Usage()
    84  	}
    85  
    86  	ac := newAdminClient()
    87  	req := &request.Options{
    88  		Method: "DELETE",
    89  		Path:   fmt.Sprintf("instances/assets/%s/%s", args[0], args[1]),
    90  	}
    91  	res, err := ac.Req(req)
    92  	if err != nil {
    93  		return err
    94  	}
    95  	defer res.Body.Close()
    96  	return nil
    97  }
    98  
    99  var lsAssetsCmd = &cobra.Command{
   100  	Use:     "ls",
   101  	Aliases: []string{"list"},
   102  	Short:   "List assets",
   103  	Long:    "List assets currently served by the stack",
   104  	Example: "$ cozy-stack assets ls",
   105  	RunE:    lsAssets,
   106  }
   107  
   108  func lsAssets(cmd *cobra.Command, args []string) error {
   109  	ac := newAdminClient()
   110  	req := &request.Options{
   111  		Method: "GET",
   112  		Path:   "instances/assets",
   113  	}
   114  	res, err := ac.Req(req)
   115  	if err != nil {
   116  		return err
   117  	}
   118  	defer res.Body.Close()
   119  
   120  	var v interface{}
   121  	err = json.NewDecoder(res.Body).Decode(&v)
   122  	if err != nil {
   123  		return err
   124  	}
   125  
   126  	json, err := json.MarshalIndent(v, "", "  ")
   127  	if err != nil {
   128  		return err
   129  	}
   130  
   131  	fmt.Println(string(json))
   132  	return nil
   133  }
   134  
   135  func init() {
   136  	assetsCmdGroup.AddCommand(addAssetCmd)
   137  	assetsCmdGroup.AddCommand(lsAssetsCmd)
   138  	assetsCmdGroup.AddCommand(rmAssetCmd)
   139  	RootCmd.AddCommand(assetsCmdGroup)
   140  	addAssetCmd.Flags().StringVar(&flagURL, "url", "", "The URL of the asset")
   141  	addAssetCmd.Flags().StringVar(&flagName, "name", "", "The name of the asset")
   142  	addAssetCmd.Flags().StringVar(&flagShasum, "shasum", "", "The shasum of the asset")
   143  	addAssetCmd.Flags().StringVar(&flagContext, "context", "", "The context of the asset")
   144  }