1use mz_frontegg_client::client::user::{CreateUserRequest, RemoveUserRequest};
21use serde::{Deserialize, Serialize};
22use tabled::Tabled;
23
24use crate::{context::ProfileContext, error::Error};
25
26pub struct CreateArgs<'a> {
28 pub email: &'a str,
31 pub name: &'a str,
33}
34
35pub async fn create(
37 cx: &ProfileContext,
38 CreateArgs { email, name }: CreateArgs<'_>,
39) -> Result<(), Error> {
40 let loading_spinner = cx.output_formatter().loading_spinner("Creating user...");
41 let roles = cx.admin_client().list_roles().await?;
42 let role_ids = roles.into_iter().map(|role| role.id).collect();
43
44 cx.admin_client()
45 .create_user(CreateUserRequest {
46 email: email.to_string(),
47 name: name.to_string(),
48 provider: "local".to_string(),
49 role_ids,
50 })
51 .await?;
52
53 loading_spinner.finish_with_message("User created.");
54 Ok(())
55}
56
57pub async fn list(cx: &ProfileContext) -> Result<(), Error> {
59 let output_formatter = cx.output_formatter();
60
61 let loading_spinner = output_formatter.loading_spinner("Retrieving users...");
62 #[derive(Deserialize, Serialize, Tabled)]
63 pub struct User {
64 #[tabled(rename = "Email")]
65 email: String,
66 #[tabled(rename = "Name")]
67 name: String,
68 }
69
70 let users = cx.admin_client().list_users().await?;
71
72 loading_spinner.finish_and_clear();
73 output_formatter.output_table(users.into_iter().map(|x| User {
74 email: x.email,
75 name: x.name,
76 }))?;
77
78 Ok(())
79}
80
81pub struct RemoveArgs<'a> {
83 pub email: &'a str,
85}
86
87pub async fn remove(
89 cx: &ProfileContext,
90 RemoveArgs { email }: RemoveArgs<'_>,
91) -> Result<(), Error> {
92 let loading_spinner = cx.output_formatter().loading_spinner("Removing user...");
93
94 let users = cx.admin_client().list_users().await?;
95 let user = users
96 .into_iter()
97 .find(|x| x.email == email)
98 .expect("email not found.");
99
100 cx.admin_client()
101 .remove_user(RemoveUserRequest { user_id: user.id })
102 .await?;
103
104 loading_spinner.finish_with_message(format!("User {} removed.", email));
105 Ok(())
106}