11use std:: collections:: BTreeMap ;
22
3- use anyhow:: { Result , bail} ;
3+ use anyhow:: { Context , Result , bail} ;
44use indicatif:: ProgressBar ;
55use rs_firebase_admin_sdk:: auth:: { Claims , FirebaseAuthService , UserIdentifiers , UserUpdate } ;
66use serde_json:: Value ;
77
88use crate :: config:: resolve_connection;
9+ use crate :: errors:: IntoAnyhow ;
910use crate :: firebase:: { AuthBackend , init_firebase} ;
10- use crate :: output:: { render_json_value, render_message, render_table} ;
11+ use crate :: output:: { render_json_value, render_message, render_success , render_table} ;
1112use crate :: prompt:: { confirm, resolve_email, resolve_string} ;
1213use crate :: { ClaimsCommand , Cli } ;
1314
@@ -65,12 +66,6 @@ fn map_to_claims(map: BTreeMap<String, Value>) -> Claims {
6566 Claims :: from ( map)
6667}
6768
68- macro_rules! fb_anyhow {
69- ( $expr: expr) => {
70- $expr. map_err( |e| anyhow:: anyhow!( "{e}" ) )
71- } ;
72- }
73-
7469async fn get ( cli : & Cli , email : Option < String > ) -> Result < ( ) > {
7570 let email = resolve_email ( email) ?;
7671 let conn = resolve_connection (
@@ -81,8 +76,13 @@ async fn get(cli: &Cli, email: Option<String>) -> Result<()> {
8176 ) ?;
8277 let auth = init_firebase ( AuthBackend :: from_resolved ( & conn) ) . await ?;
8378
79+ tracing:: debug!( "Fetching claims for {email}" ) ;
8480 let identifiers = UserIdentifiers :: builder ( ) . with_email ( email. clone ( ) ) . build ( ) ;
85- let user = fb_anyhow ! ( auth. get_user( identifiers) . await ) ?
81+ let user = auth
82+ . get_user ( identifiers)
83+ . await
84+ . into_anyhow ( )
85+ . context ( format ! ( "Failed to fetch user {email}" ) ) ?
8686 . ok_or_else ( || anyhow:: anyhow!( "User not found: {email}" ) ) ?;
8787
8888 let claims_map = claims_to_map ( & user. custom_claims ) ;
@@ -114,8 +114,13 @@ async fn merge(
114114 ) ?;
115115 let auth = init_firebase ( AuthBackend :: from_resolved ( & conn) ) . await ?;
116116
117+ tracing:: debug!( "Fetching user {email} for claim merge" ) ;
117118 let identifiers = UserIdentifiers :: builder ( ) . with_email ( email. clone ( ) ) . build ( ) ;
118- let user = fb_anyhow ! ( auth. get_user( identifiers) . await ) ?
119+ let user = auth
120+ . get_user ( identifiers)
121+ . await
122+ . into_anyhow ( )
123+ . context ( format ! ( "Failed to fetch user {email}" ) ) ?
119124 . ok_or_else ( || anyhow:: anyhow!( "User not found: {email}" ) ) ?;
120125
121126 let mut claims_map = claims_to_map ( & user. custom_claims ) ;
@@ -127,10 +132,15 @@ async fn merge(
127132 return Ok ( ( ) ) ;
128133 }
129134
135+ tracing:: debug!( "Updating claims for {email}" ) ;
130136 let update = UserUpdate :: builder ( user. uid )
131137 . custom_claims ( map_to_claims ( claims_map) )
132138 . build ( ) ;
133- let updated_user = fb_anyhow ! ( auth. update_user( update) . await ) ?;
139+ let updated_user = auth
140+ . update_user ( update)
141+ . await
142+ . into_anyhow ( )
143+ . context ( format ! ( "Failed to update claims for {email}" ) ) ?;
134144
135145 let updated_map = claims_to_map ( & updated_user. custom_claims ) ;
136146 render_json_value ( & cli. format , & map_to_json ( & updated_map) ) ;
@@ -150,8 +160,13 @@ async fn remove(cli: &Cli, key: Option<String>, email: Option<String>) -> Result
150160 ) ?;
151161 let auth = init_firebase ( AuthBackend :: from_resolved ( & conn) ) . await ?;
152162
163+ tracing:: debug!( "Fetching user {email} for claim removal" ) ;
153164 let identifiers = UserIdentifiers :: builder ( ) . with_email ( email. clone ( ) ) . build ( ) ;
154- let user = fb_anyhow ! ( auth. get_user( identifiers) . await ) ?
165+ let user = auth
166+ . get_user ( identifiers)
167+ . await
168+ . into_anyhow ( )
169+ . context ( format ! ( "Failed to fetch user {email}" ) ) ?
155170 . ok_or_else ( || anyhow:: anyhow!( "User not found: {email}" ) ) ?;
156171
157172 let mut claims_map = claims_to_map ( & user. custom_claims ) ;
@@ -167,10 +182,15 @@ async fn remove(cli: &Cli, key: Option<String>, email: Option<String>) -> Result
167182 return Ok ( ( ) ) ;
168183 }
169184
185+ tracing:: debug!( "Removing claim '{key}' for {email}" ) ;
170186 let update = UserUpdate :: builder ( user. uid )
171187 . custom_claims ( map_to_claims ( claims_map) )
172188 . build ( ) ;
173- let updated_user = fb_anyhow ! ( auth. update_user( update) . await ) ?;
189+ let updated_user = auth
190+ . update_user ( update)
191+ . await
192+ . into_anyhow ( )
193+ . context ( format ! ( "Failed to update claims for {email}" ) ) ?;
174194
175195 let updated_map = claims_to_map ( & updated_user. custom_claims ) ;
176196 render_json_value ( & cli. format , & map_to_json ( & updated_map) ) ;
@@ -200,16 +220,24 @@ async fn clear(cli: &Cli, email: Option<String>) -> Result<()> {
200220 ) ?;
201221 let auth = init_firebase ( AuthBackend :: from_resolved ( & conn) ) . await ?;
202222
223+ tracing:: debug!( "Clearing all claims for {email}" ) ;
203224 let identifiers = UserIdentifiers :: builder ( ) . with_email ( email. clone ( ) ) . build ( ) ;
204- let user = fb_anyhow ! ( auth. get_user( identifiers) . await ) ?
225+ let user = auth
226+ . get_user ( identifiers)
227+ . await
228+ . into_anyhow ( )
229+ . context ( format ! ( "Failed to fetch user {email}" ) ) ?
205230 . ok_or_else ( || anyhow:: anyhow!( "User not found: {email}" ) ) ?;
206231
207232 let update = UserUpdate :: builder ( user. uid )
208233 . custom_claims ( map_to_claims ( BTreeMap :: new ( ) ) )
209234 . build ( ) ;
210- fb_anyhow ! ( auth. update_user( update) . await ) ?;
235+ auth. update_user ( update)
236+ . await
237+ . into_anyhow ( )
238+ . context ( format ! ( "Failed to clear claims for {email}" ) ) ?;
211239
212- render_message ( & format ! ( "Cleared all custom claims for {email}" ) ) ;
240+ render_success ( & format ! ( "Cleared all custom claims for {email}" ) ) ;
213241
214242 Ok ( ( ) )
215243}
@@ -233,7 +261,11 @@ async fn find(cli: &Cli, key: String, value: Option<String>, exclusive: bool) ->
233261 loop {
234262 spinner. tick ( ) ;
235263
236- let page = fb_anyhow ! ( auth. list_users( 1000 , prev_page) . await ) ?;
264+ let page = auth
265+ . list_users ( 1000 , prev_page)
266+ . await
267+ . into_anyhow ( )
268+ . context ( "Failed to list users during claim search" ) ?;
237269
238270 let user_list = match page {
239271 Some ( list) => list,
0 commit comments