2023-03-20 21:32:31 +00:00
|
|
|
use crate::structs::CustomEmojiView;
|
|
|
|
use diesel::{result::Error, ExpressionMethods, JoinOnDsl, NullableExpressionMethods, QueryDsl};
|
|
|
|
use diesel_async::RunQueryDsl;
|
|
|
|
use lemmy_db_schema::{
|
2024-09-19 09:15:04 +00:00
|
|
|
newtypes::CustomEmojiId,
|
2023-03-20 21:32:31 +00:00
|
|
|
schema::{custom_emoji, custom_emoji_keyword},
|
|
|
|
source::{custom_emoji::CustomEmoji, custom_emoji_keyword::CustomEmojiKeyword},
|
2024-09-19 09:15:04 +00:00
|
|
|
utils::{get_conn, limit_and_offset, DbPool},
|
2023-03-20 21:32:31 +00:00
|
|
|
};
|
|
|
|
use std::collections::HashMap;
|
|
|
|
|
|
|
|
type CustomEmojiTuple = (CustomEmoji, Option<CustomEmojiKeyword>);
|
|
|
|
|
|
|
|
impl CustomEmojiView {
|
2023-07-11 13:09:59 +00:00
|
|
|
pub async fn get(pool: &mut DbPool<'_>, emoji_id: CustomEmojiId) -> Result<Self, Error> {
|
2023-03-20 21:32:31 +00:00
|
|
|
let conn = &mut get_conn(pool).await?;
|
|
|
|
let emojis = custom_emoji::table
|
|
|
|
.find(emoji_id)
|
|
|
|
.left_join(
|
|
|
|
custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)),
|
|
|
|
)
|
|
|
|
.select((
|
|
|
|
custom_emoji::all_columns,
|
|
|
|
custom_emoji_keyword::all_columns.nullable(), // (or all the columns if you want)
|
|
|
|
))
|
|
|
|
.load::<CustomEmojiTuple>(conn)
|
|
|
|
.await?;
|
|
|
|
if let Some(emoji) = CustomEmojiView::from_tuple_to_vec(emojis)
|
|
|
|
.into_iter()
|
|
|
|
.next()
|
|
|
|
{
|
|
|
|
Ok(emoji)
|
|
|
|
} else {
|
|
|
|
Err(diesel::result::Error::NotFound)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-09-19 09:15:04 +00:00
|
|
|
pub async fn list(
|
2023-07-11 13:09:59 +00:00
|
|
|
pool: &mut DbPool<'_>,
|
2024-09-19 09:15:04 +00:00
|
|
|
category: &Option<String>,
|
|
|
|
page: Option<i64>,
|
|
|
|
limit: Option<i64>,
|
|
|
|
ignore_page_limits: bool,
|
2023-07-11 13:09:59 +00:00
|
|
|
) -> Result<Vec<Self>, Error> {
|
2023-03-20 21:32:31 +00:00
|
|
|
let conn = &mut get_conn(pool).await?;
|
2024-09-19 09:15:04 +00:00
|
|
|
|
|
|
|
let mut query = custom_emoji::table
|
2023-03-20 21:32:31 +00:00
|
|
|
.left_join(
|
|
|
|
custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)),
|
|
|
|
)
|
|
|
|
.order(custom_emoji::category)
|
2024-09-19 09:15:04 +00:00
|
|
|
.into_boxed();
|
|
|
|
|
|
|
|
if !ignore_page_limits {
|
|
|
|
let (limit, offset) = limit_and_offset(page, limit)?;
|
|
|
|
query = query.limit(limit).offset(offset);
|
|
|
|
}
|
|
|
|
|
|
|
|
if let Some(category) = category {
|
|
|
|
query = query.filter(custom_emoji::category.eq(category))
|
|
|
|
}
|
|
|
|
|
|
|
|
query = query.then_order_by(custom_emoji::id);
|
|
|
|
|
|
|
|
let emojis = query
|
2023-03-20 21:32:31 +00:00
|
|
|
.select((
|
|
|
|
custom_emoji::all_columns,
|
|
|
|
custom_emoji_keyword::all_columns.nullable(), // (or all the columns if you want)
|
|
|
|
))
|
|
|
|
.load::<CustomEmojiTuple>(conn)
|
|
|
|
.await?;
|
|
|
|
|
|
|
|
Ok(CustomEmojiView::from_tuple_to_vec(emojis))
|
|
|
|
}
|
|
|
|
|
|
|
|
fn from_tuple_to_vec(items: Vec<CustomEmojiTuple>) -> Vec<Self> {
|
|
|
|
let mut result = Vec::new();
|
|
|
|
let mut hash: HashMap<CustomEmojiId, Vec<CustomEmojiKeyword>> = HashMap::new();
|
2024-10-31 12:12:24 +00:00
|
|
|
for (emoji, keyword) in &items {
|
|
|
|
let emoji_id: CustomEmojiId = emoji.id;
|
2023-03-20 21:32:31 +00:00
|
|
|
if let std::collections::hash_map::Entry::Vacant(e) = hash.entry(emoji_id) {
|
|
|
|
e.insert(Vec::new());
|
|
|
|
result.push(CustomEmojiView {
|
2024-10-31 12:12:24 +00:00
|
|
|
custom_emoji: emoji.clone(),
|
2023-03-20 21:32:31 +00:00
|
|
|
keywords: Vec::new(),
|
|
|
|
})
|
|
|
|
}
|
2024-10-31 12:12:24 +00:00
|
|
|
if let Some(item_keyword) = &keyword {
|
2023-03-20 21:32:31 +00:00
|
|
|
if let Some(keywords) = hash.get_mut(&emoji_id) {
|
|
|
|
keywords.push(item_keyword.clone())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for emoji in &mut result {
|
|
|
|
if let Some(keywords) = hash.get_mut(&emoji.custom_emoji.id) {
|
2024-03-22 22:31:08 +00:00
|
|
|
emoji.keywords.clone_from(keywords);
|
2023-03-20 21:32:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
result
|
|
|
|
}
|
|
|
|
}
|