85 lines
2.5 KiB
Rust
85 lines
2.5 KiB
Rust
use crate::model::processing::user::UserModel;
|
|
use crate::model::PackingContext;
|
|
use crate::service::MagnetarService;
|
|
use crate::web::auth::{AuthenticatedUser, MaybeUser};
|
|
use crate::web::{ApiError, ObjectNotFound};
|
|
use axum::extract::{Path, Query, State};
|
|
use axum::Json;
|
|
use magnetar_common::util::lenient_parse_tag;
|
|
use magnetar_sdk::endpoints::user::{
|
|
GetUserByAcct, GetUserById, GetUserSelf, UserByIdReq, UserSelfReq,
|
|
};
|
|
use magnetar_sdk::endpoints::{Req, Res};
|
|
use std::sync::Arc;
|
|
pub async fn handle_user_info_self(
|
|
Query(UserSelfReq {
|
|
detail: _,
|
|
pins: _,
|
|
profile: _,
|
|
secrets: _,
|
|
}): Query<Req<GetUserSelf>>,
|
|
State(service): State<Arc<MagnetarService>>,
|
|
AuthenticatedUser(user): AuthenticatedUser,
|
|
) -> Result<Json<Res<GetUserSelf>>, ApiError> {
|
|
// TODO: Extended properties!
|
|
|
|
let ctx = PackingContext::new(service, Some(user.clone())).await?;
|
|
let user = UserModel.base_from_existing(&ctx, user.as_ref()).await?;
|
|
Ok(Json(user.into()))
|
|
}
|
|
|
|
pub async fn handle_user_info(
|
|
Path(id): Path<String>,
|
|
Query(UserByIdReq {
|
|
detail: _,
|
|
pins: _,
|
|
profile: _,
|
|
relation: _,
|
|
auth: _,
|
|
}): Query<Req<GetUserById>>,
|
|
State(service): State<Arc<MagnetarService>>,
|
|
MaybeUser(self_user): MaybeUser,
|
|
) -> Result<Json<Res<GetUserById>>, ApiError> {
|
|
// TODO: Extended properties!
|
|
|
|
let ctx = PackingContext::new(service.clone(), self_user).await?;
|
|
let user_model = service
|
|
.db
|
|
.get_user_by_id(&id)
|
|
.await?
|
|
.ok_or(ObjectNotFound(id))?;
|
|
|
|
let user = UserModel.base_from_existing(&ctx, &user_model).await?;
|
|
Ok(Json(user.into()))
|
|
}
|
|
|
|
pub async fn handle_user_info_by_acct(
|
|
Path(tag_str): Path<String>,
|
|
Query(UserByIdReq {
|
|
detail: _,
|
|
pins: _,
|
|
profile: _,
|
|
relation: _,
|
|
auth: _,
|
|
}): Query<Req<GetUserByAcct>>,
|
|
State(service): State<Arc<MagnetarService>>,
|
|
MaybeUser(self_user): MaybeUser,
|
|
) -> Result<Json<Res<GetUserByAcct>>, ApiError> {
|
|
// TODO: Extended properties!
|
|
|
|
let mut tag = lenient_parse_tag(&tag_str)?;
|
|
if matches!(&tag.host, Some(host) if host == &service.config.networking.host) {
|
|
tag.host = None;
|
|
}
|
|
|
|
let ctx = PackingContext::new(service.clone(), self_user).await?;
|
|
let user_model = service
|
|
.db
|
|
.get_user_by_tag(&tag.name, tag.host.as_deref())
|
|
.await?
|
|
.ok_or(ObjectNotFound(tag_str))?;
|
|
|
|
let user = UserModel.base_from_existing(&ctx, &user_model).await?;
|
|
Ok(Json(user.into()))
|
|
}
|