-
-
Notifications
You must be signed in to change notification settings - Fork 883
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adding a get_random_community endpoint. #5042
Changes from 4 commits
95a6ed1
a0c48ca
2956da0
f510696
d0e57ed
0ccecb6
22a2b1e
3643699
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,4 +3,5 @@ pub mod ban; | |
pub mod block; | ||
pub mod follow; | ||
pub mod hide; | ||
pub mod random; | ||
pub mod transfer; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
use activitypub_federation::config::Data; | ||
use actix_web::web::Json; | ||
use lemmy_api_common::{ | ||
community::CommunityResponse, | ||
context::LemmyContext, | ||
utils::{check_private_instance, is_mod_or_admin_opt}, | ||
}; | ||
use lemmy_db_schema::source::{ | ||
actor_language::CommunityLanguage, | ||
community::Community, | ||
local_site::LocalSite, | ||
}; | ||
use lemmy_db_views::structs::LocalUserView; | ||
use lemmy_db_views_actor::structs::CommunityView; | ||
use lemmy_utils::error::LemmyResult; | ||
|
||
#[tracing::instrument(skip(context))] | ||
pub async fn get_random_community( | ||
context: Data<LemmyContext>, | ||
local_user_view: Option<LocalUserView>, | ||
) -> LemmyResult<Json<CommunityResponse>> { | ||
let local_site = LocalSite::read(&mut context.pool()).await?; | ||
|
||
check_private_instance(&local_user_view, &local_site)?; | ||
|
||
let local_user = local_user_view.as_ref().map(|u| &u.local_user); | ||
|
||
let random_community_id = Community::get_random_local_community(&mut context.pool()) | ||
.await? | ||
.id; | ||
|
||
let is_mod_or_admin = is_mod_or_admin_opt( | ||
&mut context.pool(), | ||
local_user_view.as_ref(), | ||
Some(random_community_id), | ||
) | ||
.await | ||
.is_ok(); | ||
|
||
let community_view = CommunityView::read( | ||
&mut context.pool(), | ||
random_community_id, | ||
local_user, | ||
is_mod_or_admin, | ||
) | ||
.await?; | ||
|
||
let discussion_languages = | ||
CommunityLanguage::read(&mut context.pool(), random_community_id).await?; | ||
|
||
Ok(Json(CommunityResponse { | ||
community_view, | ||
discussion_languages, | ||
})) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -35,7 +35,7 @@ use crate::{ | |
use chrono::{DateTime, Utc}; | ||
use diesel::{ | ||
deserialize, | ||
dsl::{self, exists, insert_into}, | ||
dsl::{self, exists, insert_into, not}, | ||
pg::Pg, | ||
result::Error, | ||
select, | ||
|
@@ -193,6 +193,19 @@ impl Community { | |
.await?; | ||
Ok(()) | ||
} | ||
|
||
pub async fn get_random_local_community(pool: &mut DbPool<'_>) -> Result<Self, Error> { | ||
let conn = &mut get_conn(pool).await?; | ||
sql_function!(fn random() -> Text); | ||
community::table | ||
.filter(community::local) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The issue doesnt mention that it should return only local communities, and thats not clear from the endpoint name either. Based on the issue it should take a type param ( There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. K, added ListingType to the query. |
||
.filter(not(community::deleted)) | ||
.filter(not(community::removed)) | ||
.order(random()) | ||
.limit(1) | ||
.first::<Self>(conn) | ||
.await | ||
} | ||
} | ||
|
||
impl CommunityModerator { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Its enough to select CommunityId.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.