fix some emotion bugs
This commit is contained in:
parent
bd28e201a2
commit
989e20757b
11 changed files with 1203 additions and 190 deletions
|
|
@ -1,61 +1,42 @@
|
|||
//! Avatar API handlers for user UI.
|
||||
//!
|
||||
//! Handles avatar rendering data retrieval.
|
||||
//! Note: Emotion switching is now handled via WebSocket.
|
||||
//! Handles avatar data retrieval.
|
||||
//! Note: Emotion switching is handled via WebSocket.
|
||||
|
||||
use axum::{
|
||||
extract::{Path, State},
|
||||
Json,
|
||||
};
|
||||
use sqlx::PgPool;
|
||||
use axum::extract::Path;
|
||||
use axum::Json;
|
||||
|
||||
use chattyness_db::{
|
||||
models::{AvatarRenderData, EmotionAvailability},
|
||||
models::AvatarWithPaths,
|
||||
queries::{avatars, realms},
|
||||
};
|
||||
use chattyness_error::AppError;
|
||||
|
||||
use crate::auth::AuthUser;
|
||||
use crate::auth::{AuthUser, RlsConn};
|
||||
|
||||
/// Get current avatar render data.
|
||||
/// Get full avatar with all paths resolved.
|
||||
///
|
||||
/// GET /api/realms/{slug}/avatar/current
|
||||
/// GET /api/realms/{slug}/avatar
|
||||
///
|
||||
/// Returns the render data for the user's active avatar in this realm.
|
||||
pub async fn get_current_avatar(
|
||||
State(pool): State<PgPool>,
|
||||
/// Returns the complete avatar data with all inventory UUIDs resolved to asset paths.
|
||||
/// This enables client-side emotion availability computation and rendering without
|
||||
/// additional server queries.
|
||||
pub async fn get_avatar(
|
||||
rls_conn: RlsConn,
|
||||
AuthUser(user): AuthUser,
|
||||
Path(slug): Path<String>,
|
||||
) -> Result<Json<AvatarRenderData>, AppError> {
|
||||
) -> Result<Json<AvatarWithPaths>, AppError> {
|
||||
let mut conn = rls_conn.acquire().await;
|
||||
|
||||
// Get realm
|
||||
let realm = realms::get_realm_by_slug(&pool, &slug)
|
||||
let realm = realms::get_realm_by_slug(&mut *conn, &slug)
|
||||
.await?
|
||||
.ok_or_else(|| AppError::NotFound(format!("Realm '{}' not found", slug)))?;
|
||||
|
||||
// Get render data
|
||||
let render_data = avatars::get_avatar_render_data(&pool, user.id, realm.id).await?;
|
||||
|
||||
Ok(Json(render_data))
|
||||
}
|
||||
|
||||
/// Get emotion availability for the user's avatar.
|
||||
///
|
||||
/// GET /api/realms/{slug}/avatar/emotions
|
||||
///
|
||||
/// Returns which emotions are available (have configured assets) for the user's
|
||||
/// active avatar in this realm, along with preview paths for the emotion picker UI.
|
||||
pub async fn get_emotion_availability(
|
||||
State(pool): State<PgPool>,
|
||||
AuthUser(user): AuthUser,
|
||||
Path(slug): Path<String>,
|
||||
) -> Result<Json<EmotionAvailability>, AppError> {
|
||||
// Get realm
|
||||
let realm = realms::get_realm_by_slug(&pool, &slug)
|
||||
// Get full avatar with paths
|
||||
let avatar = avatars::get_avatar_with_paths_conn(&mut *conn, user.id, realm.id)
|
||||
.await?
|
||||
.ok_or_else(|| AppError::NotFound(format!("Realm '{}' not found", slug)))?;
|
||||
.unwrap_or_default();
|
||||
|
||||
// Get emotion availability
|
||||
let availability = avatars::get_emotion_availability(&pool, user.id, realm.id).await?;
|
||||
|
||||
Ok(Json(availability))
|
||||
Ok(Json(avatar))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue