clickup_cli/commands/
acl.rs1use clap::Subcommand;
2use crate::client::ClickUpClient;
3use crate::commands::auth::resolve_token;
4use crate::commands::workspace::resolve_workspace;
5use crate::error::CliError;
6use crate::output::OutputConfig;
7use crate::Cli;
8
9#[derive(Subcommand)]
10pub enum AclCommands {
11 Update {
13 object_type: String,
15 object_id: String,
17 #[arg(long)]
19 private: bool,
20 #[arg(long)]
22 grant_user: Option<String>,
23 #[arg(long)]
25 permission: Option<String>,
26 #[arg(long)]
28 revoke_user: Option<String>,
29 #[arg(long)]
31 body: Option<String>,
32 },
33}
34
35pub async fn execute(command: AclCommands, cli: &Cli) -> Result<(), CliError> {
36 let token = resolve_token(cli)?;
37 let client = ClickUpClient::new(&token, cli.timeout)?;
38 let output = OutputConfig::from_cli(&cli.output, &cli.fields, cli.no_header, cli.quiet);
39
40 match command {
41 AclCommands::Update {
42 object_type,
43 object_id,
44 private,
45 grant_user,
46 permission,
47 revoke_user,
48 body,
49 } => {
50 let team_id = resolve_workspace(cli)?;
51 let request_body = if let Some(raw) = body {
52 serde_json::from_str(&raw).map_err(|e| CliError::ClientError {
53 message: format!("Invalid JSON body: {}", e),
54 status: 0,
55 })?
56 } else {
57 let mut b = serde_json::Map::new();
58 if private {
59 b.insert("access_type".into(), serde_json::Value::String("private".into()));
60 }
61 if let Some(uid) = grant_user {
62 let level = permission.unwrap_or_else(|| "read".into());
63 b.insert(
64 "grant".into(),
65 serde_json::json!([{ "user_id": uid, "permission_level": level }]),
66 );
67 }
68 if let Some(uid) = revoke_user {
69 b.insert(
70 "revoke".into(),
71 serde_json::json!([{ "user_id": uid }]),
72 );
73 }
74 serde_json::Value::Object(b)
75 };
76
77 let resp = client
78 .patch(
79 &format!(
80 "/v3/workspaces/{}/{}/{}/acls",
81 team_id, object_type, object_id
82 ),
83 &request_body,
84 )
85 .await?;
86
87 if cli.output == "json" {
88 println!("{}", serde_json::to_string_pretty(&resp).unwrap());
89 } else {
90 output.print_message(&format!(
91 "ACL updated for {} {}",
92 object_type, object_id
93 ));
94 }
95 Ok(())
96 }
97 }
98}