use actix_web::{web, HttpResponse, Result}; use session::Session; use service::error::AppError; use uuid::Uuid; use crate::error::ApiError; use crate::ApiResponse; use super::types::{ConversationResponse, ShareResponse}; fn get_user_id(session: &Session) -> Result { session.user().ok_or_else(|| ApiError::from(AppError::Unauthorized)) } #[utoipa::path( post, path = "/api/ai/conversations/{conversation_id}/share", operation_id = "ai_conversation_share", params( ("conversation_id" = Uuid, Path, description = "Conversation ID"), ), responses( (status = 200, description = "Share token created", body = ApiResponse), (status = 404, description = "Not found"), ), tag = "AI Chat" )] pub async fn conversation_share( service: web::Data, session: Session, path: web::Path, ) -> Result { let user_id = get_user_id(&session)?; let conversation_id = path.into_inner(); let (share, share_token) = service .share_conversation(conversation_id, user_id) .await?; let resp = ShareResponse { id: share.id, share_token, view_count: share.view_count, expires_at: share.expires_at, }; Ok(ApiResponse::ok(resp).to_response()) } #[utoipa::path( get, path = "/api/ai/conversations/{conversation_id}/share/{share_token}", operation_id = "ai_shared_conversation_get", params( ("conversation_id" = Uuid, Path, description = "Conversation ID"), ("share_token" = String, Path, description = "Share token"), ), responses( (status = 200, description = "Get shared conversation", body = ApiResponse), (status = 404, description = "Not found or expired"), ), tag = "AI Chat" )] pub async fn shared_conversation_get( service: web::Data, path: web::Path<(Uuid, String)>, ) -> Result { let (conversation_id, share_token) = path.into_inner(); let c = service .get_shared_conversation(conversation_id, share_token) .await?; let resp = ConversationResponse::from(c); Ok(ApiResponse::ok(resp).to_response()) }