58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
use crate::model::data::user::UserBaseSource;
|
|
use crate::model::processing::emoji::EmojiModel;
|
|
use crate::model::processing::{get_mm_token_emoji, PackResult};
|
|
use crate::model::{PackType, PackingContext};
|
|
use itertools::Itertools;
|
|
use magnetar_calckey_model::ck;
|
|
use magnetar_calckey_model::sea_orm::EntityTrait;
|
|
use magnetar_sdk::types::emoji::EmojiContext;
|
|
use magnetar_sdk::types::user::{PackUserBase, UserBase};
|
|
use magnetar_sdk::types::{Id, MmXml};
|
|
use magnetar_sdk::{mmm, Packed, Required};
|
|
|
|
pub struct UserModel;
|
|
|
|
impl UserModel {
|
|
pub async fn base_from_existing(
|
|
&self,
|
|
ctx: &PackingContext,
|
|
user: &ck::user::Model,
|
|
) -> PackResult<PackUserBase> {
|
|
let avatar = if let Some(avatar_id) = user.avatar_id.as_ref() {
|
|
ck::drive_file::Entity::find_by_id(avatar_id)
|
|
.one(ctx.service.db.inner())
|
|
.await?
|
|
} else {
|
|
None
|
|
};
|
|
|
|
let username_mm =
|
|
mmm::Context::default().parse_ui(user.name.as_deref().unwrap_or(&user.username));
|
|
let shortcodes = get_mm_token_emoji(&username_mm)
|
|
.into_iter()
|
|
.sorted()
|
|
.dedup()
|
|
.take(ctx.limits.max_emojis)
|
|
.collect::<Vec<_>>();
|
|
let emojis = EmojiModel
|
|
.fetch_many_emojis(ctx, &shortcodes, user.host.as_deref())
|
|
.await?;
|
|
let emoji_context = EmojiContext(emojis);
|
|
|
|
let base = UserBase::extract(
|
|
ctx,
|
|
UserBaseSource {
|
|
user,
|
|
username_mm: mmm::to_xml_string(&username_mm).map(MmXml).as_ref().ok(),
|
|
avatar: &avatar,
|
|
emoji_context: &emoji_context,
|
|
},
|
|
);
|
|
|
|
Ok(PackUserBase::pack_from((
|
|
Required(Id::from(&user.id)),
|
|
Required(base),
|
|
)))
|
|
}
|
|
}
|