@@ -6,7 +6,7 @@ use crate::cli::{
66 AccountCommands , AclCommands , ApiKeyCommands , BackupCommands , CloudAccountCommands ,
77 CloudCommands , CrdbCommands , DatabaseCommands , FixedPlanCommands , FlexiblePlanCommands ,
88 LogsCommands , MetricsCommands , PeeringCommands , PrivateServiceConnectCommands , RegionCommands ,
9- SubscriptionCommands , TaskCommands , TransitGatewayCommands , UserCommands ,
9+ SsoCommands , SubscriptionCommands , TaskCommands , TransitGatewayCommands , UserCommands ,
1010} ;
1111use crate :: commands:: api:: handle_cloud_api;
1212
@@ -76,6 +76,9 @@ pub async fn handle_cloud_command(
7676 CloudCommands :: PrivateServiceConnect { command } => {
7777 handle_private_service_connect_command ( command, profile, output_format, query) . await
7878 }
79+ CloudCommands :: Sso { command } => {
80+ handle_sso_command ( command, profile, output_format, query) . await
81+ }
7982 }
8083}
8184
@@ -166,8 +169,21 @@ pub async fn handle_database_command(
166169 . await ?;
167170 println ! ( "Database {} deleted successfully" , id) ;
168171 }
169- DatabaseCommands :: Backup { id : _ } => {
170- anyhow:: bail!( "Backup operations not yet implemented for Cloud databases" ) ;
172+ DatabaseCommands :: Backup { id } => {
173+ let ( subscription_id, database_id) = parse_database_id ( & id) ?;
174+ let backup_data = serde_json:: json!( {
175+ "description" : format!( "Database backup for {}" , id)
176+ } ) ;
177+ let task = client
178+ . post_raw (
179+ & format ! (
180+ "/subscriptions/{}/databases/{}/backup" ,
181+ subscription_id, database_id
182+ ) ,
183+ backup_data,
184+ )
185+ . await ?;
186+ print_output ( task, output_format, query) ?;
171187 }
172188 DatabaseCommands :: Import { id, url } => {
173189 let ( subscription_id, database_id) = parse_database_id ( & id) ?;
@@ -1414,3 +1430,186 @@ pub async fn handle_private_service_connect_command(
14141430
14151431 Ok ( ( ) )
14161432}
1433+
1434+ pub async fn handle_sso_command (
1435+ command : SsoCommands ,
1436+ profile : & Profile ,
1437+ output_format : OutputFormat ,
1438+ query : Option < & str > ,
1439+ ) -> Result < ( ) > {
1440+ let client = create_cloud_client ( profile) ?;
1441+
1442+ match command {
1443+ SsoCommands :: Show => {
1444+ let sso_config = client. get_raw ( "/sso" ) . await ?;
1445+ print_output ( sso_config, output_format, query) ?;
1446+ }
1447+ SsoCommands :: Update {
1448+ provider,
1449+ login_url,
1450+ logout_url,
1451+ enabled,
1452+ } => {
1453+ let mut update_data = serde_json:: json!( {
1454+ "provider" : provider,
1455+ "loginUrl" : login_url
1456+ } ) ;
1457+
1458+ if let Some ( logout_url) = logout_url {
1459+ update_data[ "logoutUrl" ] = serde_json:: Value :: String ( logout_url) ;
1460+ }
1461+ if let Some ( enabled) = enabled {
1462+ update_data[ "enabled" ] = serde_json:: Value :: Bool ( enabled) ;
1463+ }
1464+
1465+ let sso_config = client. put_raw ( "/sso" , update_data) . await ?;
1466+ print_output ( sso_config, output_format, query) ?;
1467+ }
1468+ SsoCommands :: Delete { force } => {
1469+ if !force {
1470+ println ! ( "Are you sure you want to delete SSO configuration? Use --force to skip confirmation." ) ;
1471+ return Ok ( ( ) ) ;
1472+ }
1473+ client. delete_raw ( "/sso" ) . await ?;
1474+ println ! ( "SSO configuration deleted successfully" ) ;
1475+ }
1476+ SsoCommands :: Test { email } => {
1477+ let test_data = serde_json:: json!( {
1478+ "email" : email
1479+ } ) ;
1480+ let result = client. post_raw ( "/sso/test" , test_data) . await ?;
1481+ print_output ( result, output_format, query) ?;
1482+ }
1483+
1484+ // SAML specific commands
1485+ SsoCommands :: SamlShow => {
1486+ let saml_config = client. get_raw ( "/sso/saml" ) . await ?;
1487+ print_output ( saml_config, output_format, query) ?;
1488+ }
1489+ SsoCommands :: SamlUpdate {
1490+ issuer,
1491+ sso_url,
1492+ certificate,
1493+ } => {
1494+ let mut update_data = serde_json:: json!( {
1495+ "issuer" : issuer,
1496+ "ssoUrl" : sso_url
1497+ } ) ;
1498+
1499+ if let Some ( certificate) = certificate {
1500+ update_data[ "certificate" ] = serde_json:: Value :: String ( certificate) ;
1501+ }
1502+
1503+ let saml_config = client. put_raw ( "/sso/saml" , update_data) . await ?;
1504+ print_output ( saml_config, output_format, query) ?;
1505+ }
1506+ SsoCommands :: SamlMetadata => {
1507+ let metadata = client. get_raw ( "/sso/saml/metadata" ) . await ?;
1508+ print_output ( metadata, output_format, query) ?;
1509+ }
1510+ SsoCommands :: SamlUploadCert { certificate } => {
1511+ let cert_data = serde_json:: json!( {
1512+ "certificate" : certificate
1513+ } ) ;
1514+ let result = client. post_raw ( "/sso/saml/certificate" , cert_data) . await ?;
1515+ print_output ( result, output_format, query) ?;
1516+ }
1517+
1518+ // User mapping commands
1519+ SsoCommands :: UserList => {
1520+ let users = client. get_raw ( "/sso/users" ) . await ?;
1521+ print_output ( users, output_format, query) ?;
1522+ }
1523+ SsoCommands :: UserShow { id } => {
1524+ let user = client. get_raw ( & format ! ( "/sso/users/{}" , id) ) . await ?;
1525+ print_output ( user, output_format, query) ?;
1526+ }
1527+ SsoCommands :: UserCreate {
1528+ email,
1529+ local_user_id,
1530+ role,
1531+ } => {
1532+ let create_data = serde_json:: json!( {
1533+ "email" : email,
1534+ "localUserId" : local_user_id,
1535+ "role" : role
1536+ } ) ;
1537+ let user = client. post_raw ( "/sso/users" , create_data) . await ?;
1538+ print_output ( user, output_format, query) ?;
1539+ }
1540+ SsoCommands :: UserUpdate {
1541+ id,
1542+ local_user_id,
1543+ role,
1544+ } => {
1545+ let mut update_data = serde_json:: Map :: new ( ) ;
1546+ if let Some ( local_user_id) = local_user_id {
1547+ update_data. insert (
1548+ "localUserId" . to_string ( ) ,
1549+ serde_json:: Value :: Number ( local_user_id. into ( ) ) ,
1550+ ) ;
1551+ }
1552+ if let Some ( role) = role {
1553+ update_data. insert ( "role" . to_string ( ) , serde_json:: Value :: String ( role) ) ;
1554+ }
1555+ if update_data. is_empty ( ) {
1556+ anyhow:: bail!( "No update fields provided" ) ;
1557+ }
1558+
1559+ let user = client
1560+ . put_raw (
1561+ & format ! ( "/sso/users/{}" , id) ,
1562+ serde_json:: Value :: Object ( update_data) ,
1563+ )
1564+ . await ?;
1565+ print_output ( user, output_format, query) ?;
1566+ }
1567+ SsoCommands :: UserDelete { id, force } => {
1568+ if !force {
1569+ println ! (
1570+ "Are you sure you want to delete SSO user mapping {}? Use --force to skip confirmation." ,
1571+ id
1572+ ) ;
1573+ return Ok ( ( ) ) ;
1574+ }
1575+ client. delete_raw ( & format ! ( "/sso/users/{}" , id) ) . await ?;
1576+ println ! ( "SSO user mapping {} deleted successfully" , id) ;
1577+ }
1578+
1579+ // Group mapping commands
1580+ SsoCommands :: GroupList => {
1581+ let groups = client. get_raw ( "/sso/groups" ) . await ?;
1582+ print_output ( groups, output_format, query) ?;
1583+ }
1584+ SsoCommands :: GroupCreate { name, role } => {
1585+ let create_data = serde_json:: json!( {
1586+ "name" : name,
1587+ "role" : role
1588+ } ) ;
1589+ let group = client. post_raw ( "/sso/groups" , create_data) . await ?;
1590+ print_output ( group, output_format, query) ?;
1591+ }
1592+ SsoCommands :: GroupUpdate { id, role } => {
1593+ let update_data = serde_json:: json!( {
1594+ "role" : role
1595+ } ) ;
1596+ let group = client
1597+ . put_raw ( & format ! ( "/sso/groups/{}" , id) , update_data)
1598+ . await ?;
1599+ print_output ( group, output_format, query) ?;
1600+ }
1601+ SsoCommands :: GroupDelete { id, force } => {
1602+ if !force {
1603+ println ! (
1604+ "Are you sure you want to delete SSO group mapping {}? Use --force to skip confirmation." ,
1605+ id
1606+ ) ;
1607+ return Ok ( ( ) ) ;
1608+ }
1609+ client. delete_raw ( & format ! ( "/sso/groups/{}" , id) ) . await ?;
1610+ println ! ( "SSO group mapping {} deleted successfully" , id) ;
1611+ }
1612+ }
1613+
1614+ Ok ( ( ) )
1615+ }
0 commit comments