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 }