flora is a fast and secure runtime that lets you write discord bots for your servers, with a rich TypeScript SDK, without worrying about running infrastructure. [mirror]
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(deployments): resolve cli actor usernames

Fixes #24

Session-Id: 1eaa0825-67f5-4a5b-b299-a7c2a09df325

+40 -5
+1 -1
apps/runtime/src/handlers/deployments/rollback.rs
··· 73 73 DeploymentSource::Unknown => DeploymentSource::Api, 74 74 _ => source, 75 75 }; 76 - let actor = actor_from_identity(&identity); 76 + let actor = actor_from_identity(&state, &identity, &guild_id).await; 77 77 78 78 let previous_success = state 79 79 .deployments
+39 -4
apps/runtime/src/handlers/deployments/upsert.rs
··· 20 20 use chrono::Utc; 21 21 use serde::{Deserialize, Serialize}; 22 22 use std::str::FromStr; 23 - use tracing::error; 23 + use tracing::{error, warn}; 24 24 use utoipa::ToSchema; 25 25 26 26 pub const DEPLOY_SOURCE_HEADER: HeaderName = HeaderName::from_static("x-flora-deploy-source"); ··· 185 185 }) 186 186 } 187 187 188 - pub fn actor_from_identity(identity: &IdentityContext) -> DeploymentActor { 188 + pub async fn actor_from_identity( 189 + state: &AppState, 190 + identity: &IdentityContext, 191 + guild_id: &str, 192 + ) -> DeploymentActor { 189 193 let Some(session) = identity.session.as_ref() else { 194 + let username = resolve_token_username(state, guild_id, &identity.user_id).await; 190 195 return DeploymentActor { 191 196 user_id: Some(identity.user_id.clone()), 192 - username: None, 197 + username, 193 198 actor_type: DeploymentActorType::Token, 194 199 }; 195 200 }; ··· 198 203 user_id: Some(identity.user_id.clone()), 199 204 username: Some(session.user.username.clone()), 200 205 actor_type: DeploymentActorType::Session, 206 + } 207 + } 208 + 209 + async fn resolve_token_username(state: &AppState, guild_id: &str, user_id: &str) -> Option<String> { 210 + let Ok(guild_id_num) = guild_id.parse::<u64>() else { 211 + warn!(target: "flora:api", guild_id, "invalid guild id for deployment actor lookup"); 212 + return None; 213 + }; 214 + 215 + let Ok(user_id_num) = user_id.parse::<u64>() else { 216 + warn!(target: "flora:api", user_id, "invalid user id for deployment actor lookup"); 217 + return None; 218 + }; 219 + 220 + match state 221 + .http 222 + .get_member(guild_id_num.into(), user_id_num.into()) 223 + .await 224 + { 225 + Ok(member) => Some(member.user.name.to_string()), 226 + Err(err) => { 227 + warn!( 228 + target: "flora:api", 229 + guild_id, 230 + user_id, 231 + ?err, 232 + "failed to fetch deployment actor username" 233 + ); 234 + None 235 + } 201 236 } 202 237 } 203 238 ··· 275 310 validate_request(&request)?; 276 311 277 312 let deploy_source = parse_deploy_source(&headers)?; 278 - let actor = actor_from_identity(&identity); 313 + let actor = actor_from_identity(&state, &identity, &guild_id).await; 279 314 280 315 let files = request.files; 281 316 let (bundle, source_map) = if let Some(bundle) = request.bundle {