1
0

permission.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. package cmd
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "os"
  7. "gogs.dmsc.dev/arp/arp_cli/client"
  8. "gogs.dmsc.dev/arp/arp_cli/config"
  9. "github.com/AlecAivazis/survey/v2"
  10. "github.com/olekukonko/tablewriter"
  11. "github.com/urfave/cli/v3"
  12. )
  13. // PermissionCommand returns the permission command
  14. func PermissionCommand() *cli.Command {
  15. return &cli.Command{
  16. Name: "permission",
  17. Usage: "Manage permissions",
  18. Description: `Manage ARP permissions. Permissions define fine-grained access control.
  19. Use this command to create, list, update, and delete permissions.`,
  20. Commands: []*cli.Command{
  21. {
  22. Name: "list",
  23. Aliases: []string{"ls"},
  24. Usage: "List all permissions",
  25. Flags: []cli.Flag{
  26. &cli.BoolFlag{
  27. Name: "json",
  28. Aliases: []string{"j"},
  29. Usage: "Output as JSON",
  30. },
  31. },
  32. Action: permissionList,
  33. },
  34. {
  35. Name: "get",
  36. Usage: "Get a permission by ID",
  37. Flags: []cli.Flag{
  38. &cli.StringFlag{
  39. Name: "id",
  40. Aliases: []string{"i"},
  41. Usage: "Permission ID",
  42. Required: true,
  43. },
  44. &cli.BoolFlag{
  45. Name: "json",
  46. Aliases: []string{"j"},
  47. Usage: "Output as JSON",
  48. },
  49. },
  50. Action: permissionGet,
  51. },
  52. {
  53. Name: "create",
  54. Usage: "Create a new permission",
  55. Action: permissionCreate,
  56. Flags: []cli.Flag{
  57. &cli.StringFlag{
  58. Name: "code",
  59. Aliases: []string{"c"},
  60. Usage: "Permission code",
  61. },
  62. &cli.StringFlag{
  63. Name: "description",
  64. Aliases: []string{"d"},
  65. Usage: "Permission description",
  66. },
  67. },
  68. },
  69. {
  70. Name: "update",
  71. Usage: "Update a permission",
  72. Action: permissionUpdate,
  73. Flags: []cli.Flag{
  74. &cli.StringFlag{
  75. Name: "id",
  76. Aliases: []string{"i"},
  77. Usage: "Permission ID",
  78. Required: true,
  79. },
  80. &cli.StringFlag{
  81. Name: "code",
  82. Aliases: []string{"c"},
  83. Usage: "Permission code",
  84. },
  85. &cli.StringFlag{
  86. Name: "description",
  87. Aliases: []string{"d"},
  88. Usage: "Permission description",
  89. },
  90. },
  91. },
  92. {
  93. Name: "delete",
  94. Usage: "Delete a permission",
  95. Action: permissionDelete,
  96. Flags: []cli.Flag{
  97. &cli.StringFlag{
  98. Name: "id",
  99. Aliases: []string{"i"},
  100. Usage: "Permission ID",
  101. Required: true,
  102. },
  103. &cli.BoolFlag{
  104. Name: "yes",
  105. Aliases: []string{"y"},
  106. Usage: "Skip confirmation",
  107. },
  108. },
  109. },
  110. },
  111. }
  112. }
  113. type PermissionDetail struct {
  114. ID string `json:"id"`
  115. Code string `json:"code"`
  116. Description string `json:"description"`
  117. }
  118. func permissionList(ctx context.Context, cmd *cli.Command) error {
  119. cfg, err := config.Load()
  120. if err != nil {
  121. return err
  122. }
  123. if err := RequireAuth(cfg); err != nil {
  124. return err
  125. }
  126. c := client.New(cfg.ServerURL)
  127. c.SetToken(cfg.Token)
  128. query := "query Permissions { permissions { id code description } }"
  129. resp, err := c.Query(query, nil)
  130. if err != nil {
  131. return err
  132. }
  133. var result struct {
  134. Permissions []PermissionDetail `json:"permissions"`
  135. }
  136. if err := json.Unmarshal(resp.Data, &result); err != nil {
  137. return err
  138. }
  139. if cmd.Bool("json") {
  140. enc := json.NewEncoder(os.Stdout)
  141. enc.SetIndent("", " ")
  142. return enc.Encode(result.Permissions)
  143. }
  144. if len(result.Permissions) == 0 {
  145. fmt.Println("No permissions found.")
  146. return nil
  147. }
  148. table := tablewriter.NewWriter(os.Stdout)
  149. table.Header([]string{"ID", "Code", "Description"})
  150. for _, p := range result.Permissions {
  151. table.Append([]string{p.ID, p.Code, p.Description})
  152. }
  153. table.Render()
  154. return nil
  155. }
  156. func permissionGet(ctx context.Context, cmd *cli.Command) error {
  157. cfg, err := config.Load()
  158. if err != nil {
  159. return err
  160. }
  161. if err := RequireAuth(cfg); err != nil {
  162. return err
  163. }
  164. c := client.New(cfg.ServerURL)
  165. c.SetToken(cfg.Token)
  166. id := cmd.String("id")
  167. query := "query Permission($id: ID!) { permission(id: $id) { id code description } }"
  168. resp, err := c.Query(query, map[string]interface{}{"id": id})
  169. if err != nil {
  170. return err
  171. }
  172. var result struct {
  173. Permission *PermissionDetail `json:"permission"`
  174. }
  175. if err := json.Unmarshal(resp.Data, &result); err != nil {
  176. return err
  177. }
  178. if result.Permission == nil {
  179. return fmt.Errorf("permission not found")
  180. }
  181. if cmd.Bool("json") {
  182. enc := json.NewEncoder(os.Stdout)
  183. enc.SetIndent("", " ")
  184. return enc.Encode(result.Permission)
  185. }
  186. p := result.Permission
  187. fmt.Printf("ID: %s\n", p.ID)
  188. fmt.Printf("Code: %s\n", p.Code)
  189. fmt.Printf("Description: %s\n", p.Description)
  190. return nil
  191. }
  192. func permissionCreate(ctx context.Context, cmd *cli.Command) error {
  193. cfg, err := config.Load()
  194. if err != nil {
  195. return err
  196. }
  197. if err := RequireAuth(cfg); err != nil {
  198. return err
  199. }
  200. code := cmd.String("code")
  201. description := cmd.String("description")
  202. if code == "" {
  203. prompt := &survey.Input{Message: "Permission code:"}
  204. if err := survey.AskOne(prompt, &code, survey.WithValidator(survey.Required)); err != nil {
  205. return err
  206. }
  207. }
  208. if description == "" {
  209. prompt := &survey.Input{Message: "Description:"}
  210. if err := survey.AskOne(prompt, &description, survey.WithValidator(survey.Required)); err != nil {
  211. return err
  212. }
  213. }
  214. c := client.New(cfg.ServerURL)
  215. c.SetToken(cfg.Token)
  216. mutation := `mutation CreatePermission($input: NewPermission!) { createPermission(input: $input) { id code description } }`
  217. input := map[string]interface{}{
  218. "code": code,
  219. "description": description,
  220. }
  221. resp, err := c.Mutation(mutation, map[string]interface{}{"input": input})
  222. if err != nil {
  223. return err
  224. }
  225. var result struct {
  226. CreatePermission *PermissionDetail `json:"createPermission"`
  227. }
  228. if err := json.Unmarshal(resp.Data, &result); err != nil {
  229. return err
  230. }
  231. if result.CreatePermission == nil {
  232. return fmt.Errorf("failed to create permission")
  233. }
  234. fmt.Printf("Permission created successfully!\n")
  235. fmt.Printf("ID: %s\n", result.CreatePermission.ID)
  236. fmt.Printf("Code: %s\n", result.CreatePermission.Code)
  237. return nil
  238. }
  239. func permissionUpdate(ctx context.Context, cmd *cli.Command) error {
  240. cfg, err := config.Load()
  241. if err != nil {
  242. return err
  243. }
  244. if err := RequireAuth(cfg); err != nil {
  245. return err
  246. }
  247. id := cmd.String("id")
  248. code := cmd.String("code")
  249. description := cmd.String("description")
  250. if code == "" && description == "" {
  251. fmt.Println("No updates provided. Use flags to specify what to update.")
  252. return nil
  253. }
  254. c := client.New(cfg.ServerURL)
  255. c.SetToken(cfg.Token)
  256. input := make(map[string]interface{})
  257. if code != "" {
  258. input["code"] = code
  259. }
  260. if description != "" {
  261. input["description"] = description
  262. }
  263. mutation := `mutation UpdatePermission($id: ID!, $input: UpdatePermissionInput!) { updatePermission(id: $id, input: $input) { id code description } }`
  264. resp, err := c.Mutation(mutation, map[string]interface{}{"id": id, "input": input})
  265. if err != nil {
  266. return err
  267. }
  268. var result struct {
  269. UpdatePermission *PermissionDetail `json:"updatePermission"`
  270. }
  271. if err := json.Unmarshal(resp.Data, &result); err != nil {
  272. return err
  273. }
  274. if result.UpdatePermission == nil {
  275. return fmt.Errorf("permission not found")
  276. }
  277. fmt.Printf("Permission updated successfully!\n")
  278. fmt.Printf("ID: %s\n", result.UpdatePermission.ID)
  279. fmt.Printf("Code: %s\n", result.UpdatePermission.Code)
  280. return nil
  281. }
  282. func permissionDelete(ctx context.Context, cmd *cli.Command) error {
  283. cfg, err := config.Load()
  284. if err != nil {
  285. return err
  286. }
  287. if err := RequireAuth(cfg); err != nil {
  288. return err
  289. }
  290. id := cmd.String("id")
  291. skipConfirm := cmd.Bool("yes")
  292. if !skipConfirm {
  293. confirm := false
  294. prompt := &survey.Confirm{
  295. Message: fmt.Sprintf("Are you sure you want to delete permission %s?", id),
  296. Default: false,
  297. }
  298. if err := survey.AskOne(prompt, &confirm); err != nil {
  299. return err
  300. }
  301. if !confirm {
  302. fmt.Println("Deletion cancelled.")
  303. return nil
  304. }
  305. }
  306. c := client.New(cfg.ServerURL)
  307. c.SetToken(cfg.Token)
  308. mutation := `mutation DeletePermission($id: ID!) { deletePermission(id: $id) }`
  309. resp, err := c.Mutation(mutation, map[string]interface{}{"id": id})
  310. if err != nil {
  311. return err
  312. }
  313. var result struct {
  314. DeletePermission bool `json:"deletePermission"`
  315. }
  316. if err := json.Unmarshal(resp.Data, &result); err != nil {
  317. return err
  318. }
  319. if result.DeletePermission {
  320. fmt.Printf("Permission %s deleted successfully.\n", id)
  321. } else {
  322. fmt.Printf("Failed to delete permission %s.\n", id)
  323. }
  324. return nil
  325. }