mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-29 16:56:43 +00:00
1d38aad9d3
* a lot * merge * Fix stuff broken by merge * Get rid of repetitive `&mut *context.conn().await?` * Add blank lines under each line with `conn =` * Fix style mistakes (partial) * Revert "Fix style mistakes (partial)" This reverts commit48a033b87f
. * Revert "Add blank lines under each line with `conn =`" This reverts commit773a6d3beb
. * Revert "Get rid of repetitive `&mut *context.conn().await?`" This reverts commitd2c6263ea1
. * Use DbConn for CaptchaAnswer methods * DbConn trait * Remove more `&mut *` * Fix stuff * Re-run CI * try to make ci start * fix * fix * Fix api_common::utils * Fix apub::activities::block * Fix apub::api::resolve_object * Fix some things * Revert "Fix some things" This reverts commit2bf8574bc8
. * Revert "Fix apub::api::resolve_object" This reverts commit3e4059aabb
. * Revert "Fix apub::activities::block" This reverts commit3b02389abd
. * Revert "Fix api_common::utils" This reverts commit7dc73de613
. * Revert "Revert "Fix api_common::utils"" This reverts commitf740f115e5
. * Revert "Revert "Fix apub::activities::block"" This reverts commit2ee206af7c
. * Revert "Revert "Fix apub::api::resolve_object"" This reverts commit96ed8bf2e9
. * Fix fetch_local_site_data * Fix get_comment_parent_creator * Remove unused perma deleted text * Fix routes::feeds * Fix lib.rs * Update lib.rs * rerun ci * Attempt to create custom GetConn and RunQueryDsl traits * Start over * Add GetConn trait * aaaa * Revert "aaaa" This reverts commitacc9ca1aed
. * Revert "Revert "aaaa"" This reverts commit443a2a00a5
. * still aaaaaaaaaaaaa * Return to earlier thing Revert "Add GetConn trait" This reverts commitab4e94aea5
. * Try to use DbPool enum * Revert "Try to use DbPool enum" This reverts commite4d1712646
. * DbConn and DbPool enums (db_schema only fails to compile for tests) * fmt * Make functions take `&mut DbPool<'_>` and make db_schema tests compile * Add try_join_with_pool macro and run fix-clippy on more crates * Fix some errors * I did it * Remove function variants that take connection * rerun ci * rerun ci * rerun ci
86 lines
2.7 KiB
Rust
86 lines
2.7 KiB
Rust
use crate::structs::CustomEmojiView;
|
|
use diesel::{result::Error, ExpressionMethods, JoinOnDsl, NullableExpressionMethods, QueryDsl};
|
|
use diesel_async::RunQueryDsl;
|
|
use lemmy_db_schema::{
|
|
newtypes::{CustomEmojiId, LocalSiteId},
|
|
schema::{custom_emoji, custom_emoji_keyword},
|
|
source::{custom_emoji::CustomEmoji, custom_emoji_keyword::CustomEmojiKeyword},
|
|
utils::{get_conn, DbPool},
|
|
};
|
|
use std::collections::HashMap;
|
|
|
|
type CustomEmojiTuple = (CustomEmoji, Option<CustomEmojiKeyword>);
|
|
|
|
impl CustomEmojiView {
|
|
pub async fn get(pool: &mut DbPool<'_>, emoji_id: CustomEmojiId) -> Result<Self, Error> {
|
|
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)
|
|
}
|
|
}
|
|
|
|
pub async fn get_all(
|
|
pool: &mut DbPool<'_>,
|
|
for_local_site_id: LocalSiteId,
|
|
) -> Result<Vec<Self>, Error> {
|
|
let conn = &mut get_conn(pool).await?;
|
|
let emojis = custom_emoji::table
|
|
.filter(custom_emoji::local_site_id.eq(for_local_site_id))
|
|
.left_join(
|
|
custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)),
|
|
)
|
|
.order(custom_emoji::category)
|
|
.then_order_by(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?;
|
|
|
|
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();
|
|
for item in &items {
|
|
let emoji_id: CustomEmojiId = item.0.id;
|
|
if let std::collections::hash_map::Entry::Vacant(e) = hash.entry(emoji_id) {
|
|
e.insert(Vec::new());
|
|
result.push(CustomEmojiView {
|
|
custom_emoji: item.0.clone(),
|
|
keywords: Vec::new(),
|
|
})
|
|
}
|
|
if let Some(item_keyword) = &item.1 {
|
|
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) {
|
|
emoji.keywords = keywords.clone();
|
|
}
|
|
}
|
|
result
|
|
}
|
|
}
|