mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-16 09:24:00 +00:00
Add support for Taglines (#2548)
* Add support for Taglines * recreate migration * Update content column -> Text * Optimize replace function * Change taglines to Option * Move Ok() call * Move taglines to GetSiteResponse * Fix logic Co-authored-by: layla <layla@chapo.dev> Co-authored-by: Dessalines <dessalines@users.noreply.github.com>
This commit is contained in:
parent
6f3bf4634b
commit
c27d2a5687
11 changed files with 120 additions and 2 deletions
|
@ -10,6 +10,7 @@ use lemmy_db_schema::{
|
||||||
language::Language,
|
language::Language,
|
||||||
moderator::{ModAdd, ModAddForm},
|
moderator::{ModAdd, ModAddForm},
|
||||||
person::{Person, PersonUpdateForm},
|
person::{Person, PersonUpdateForm},
|
||||||
|
tagline::Tagline,
|
||||||
},
|
},
|
||||||
traits::Crud,
|
traits::Crud,
|
||||||
};
|
};
|
||||||
|
@ -63,6 +64,8 @@ impl Perform for LeaveAdmin {
|
||||||
|
|
||||||
let all_languages = Language::read_all(context.pool()).await?;
|
let all_languages = Language::read_all(context.pool()).await?;
|
||||||
let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
|
let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
|
||||||
|
let taglines_res = Tagline::get_all(context.pool(), site_view.local_site.id).await?;
|
||||||
|
let taglines = taglines_res.is_empty().then_some(taglines_res);
|
||||||
|
|
||||||
Ok(GetSiteResponse {
|
Ok(GetSiteResponse {
|
||||||
site_view,
|
site_view,
|
||||||
|
@ -73,6 +76,7 @@ impl Perform for LeaveAdmin {
|
||||||
federated_instances: None,
|
federated_instances: None,
|
||||||
all_languages,
|
all_languages,
|
||||||
discussion_languages,
|
discussion_languages,
|
||||||
|
taglines,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::sensitive::Sensitive;
|
use crate::sensitive::Sensitive;
|
||||||
use lemmy_db_schema::{
|
use lemmy_db_schema::{
|
||||||
newtypes::{CommentId, CommunityId, LanguageId, PersonId, PostId},
|
newtypes::{CommentId, CommunityId, LanguageId, PersonId, PostId},
|
||||||
source::language::Language,
|
source::{language::Language, tagline::Tagline},
|
||||||
ListingType,
|
ListingType,
|
||||||
ModlogActionType,
|
ModlogActionType,
|
||||||
SearchType,
|
SearchType,
|
||||||
|
@ -199,6 +199,7 @@ pub struct EditSite {
|
||||||
pub captcha_difficulty: Option<String>,
|
pub captcha_difficulty: Option<String>,
|
||||||
pub allowed_instances: Option<Vec<String>>,
|
pub allowed_instances: Option<Vec<String>>,
|
||||||
pub blocked_instances: Option<Vec<String>>,
|
pub blocked_instances: Option<Vec<String>>,
|
||||||
|
pub taglines: Option<Vec<String>>,
|
||||||
pub auth: Sensitive<String>,
|
pub auth: Sensitive<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,6 +223,7 @@ pub struct GetSiteResponse {
|
||||||
pub federated_instances: Option<FederatedInstances>, // Federation may be disabled
|
pub federated_instances: Option<FederatedInstances>, // Federation may be disabled
|
||||||
pub all_languages: Vec<Language>,
|
pub all_languages: Vec<Language>,
|
||||||
pub discussion_languages: Vec<LanguageId>,
|
pub discussion_languages: Vec<LanguageId>,
|
||||||
|
pub taglines: Option<Vec<Tagline>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
|
|
@ -4,7 +4,7 @@ use lemmy_api_common::{
|
||||||
site::{GetSite, GetSiteResponse, MyUserInfo},
|
site::{GetSite, GetSiteResponse, MyUserInfo},
|
||||||
utils::{build_federated_instances, get_local_user_settings_view_from_jwt_opt},
|
utils::{build_federated_instances, get_local_user_settings_view_from_jwt_opt},
|
||||||
};
|
};
|
||||||
use lemmy_db_schema::source::{actor_language::SiteLanguage, language::Language};
|
use lemmy_db_schema::source::{actor_language::SiteLanguage, language::Language, tagline::Tagline};
|
||||||
use lemmy_db_views::structs::{LocalUserDiscussionLanguageView, SiteView};
|
use lemmy_db_views::structs::{LocalUserDiscussionLanguageView, SiteView};
|
||||||
use lemmy_db_views_actor::structs::{
|
use lemmy_db_views_actor::structs::{
|
||||||
CommunityBlockView,
|
CommunityBlockView,
|
||||||
|
@ -89,6 +89,8 @@ impl PerformCrud for GetSite {
|
||||||
|
|
||||||
let all_languages = Language::read_all(context.pool()).await?;
|
let all_languages = Language::read_all(context.pool()).await?;
|
||||||
let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
|
let discussion_languages = SiteLanguage::read_local(context.pool()).await?;
|
||||||
|
let taglines_res = Tagline::get_all(context.pool(), site_view.local_site.id).await?;
|
||||||
|
let taglines = (!taglines_res.is_empty()).then_some(taglines_res);
|
||||||
|
|
||||||
Ok(GetSiteResponse {
|
Ok(GetSiteResponse {
|
||||||
site_view,
|
site_view,
|
||||||
|
@ -99,6 +101,7 @@ impl PerformCrud for GetSite {
|
||||||
federated_instances,
|
federated_instances,
|
||||||
all_languages,
|
all_languages,
|
||||||
discussion_languages,
|
discussion_languages,
|
||||||
|
taglines,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ use lemmy_db_schema::{
|
||||||
local_site_rate_limit::{LocalSiteRateLimit, LocalSiteRateLimitUpdateForm},
|
local_site_rate_limit::{LocalSiteRateLimit, LocalSiteRateLimitUpdateForm},
|
||||||
local_user::LocalUser,
|
local_user::LocalUser,
|
||||||
site::{Site, SiteUpdateForm},
|
site::{Site, SiteUpdateForm},
|
||||||
|
tagline::Tagline,
|
||||||
},
|
},
|
||||||
traits::Crud,
|
traits::Crud,
|
||||||
utils::{diesel_option_overwrite, diesel_option_overwrite_to_url, naive_now},
|
utils::{diesel_option_overwrite, diesel_option_overwrite_to_url, naive_now},
|
||||||
|
@ -175,6 +176,9 @@ impl PerformCrud for EditSite {
|
||||||
.map_err(|e| LemmyError::from_error_message(e, "couldnt_set_all_email_verified"))?;
|
.map_err(|e| LemmyError::from_error_message(e, "couldnt_set_all_email_verified"))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let taglines = data.taglines.to_owned();
|
||||||
|
Tagline::replace(context.pool(), local_site.id, taglines).await?;
|
||||||
|
|
||||||
let site_view = SiteView::read_local(context.pool()).await?;
|
let site_view = SiteView::read_local(context.pool()).await?;
|
||||||
|
|
||||||
let rate_limit_config =
|
let rate_limit_config =
|
||||||
|
|
|
@ -25,3 +25,4 @@ pub mod private_message_report;
|
||||||
pub mod registration_application;
|
pub mod registration_application;
|
||||||
pub mod secret;
|
pub mod secret;
|
||||||
pub mod site;
|
pub mod site;
|
||||||
|
pub mod tagline;
|
||||||
|
|
55
crates/db_schema/src/impls/tagline.rs
Normal file
55
crates/db_schema/src/impls/tagline.rs
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
use crate::{
|
||||||
|
newtypes::LocalSiteId,
|
||||||
|
schema::tagline::dsl::*,
|
||||||
|
source::tagline::*,
|
||||||
|
utils::{get_conn, DbPool},
|
||||||
|
};
|
||||||
|
use diesel::{insert_into, result::Error, ExpressionMethods, QueryDsl};
|
||||||
|
use diesel_async::{AsyncPgConnection, RunQueryDsl};
|
||||||
|
|
||||||
|
impl Tagline {
|
||||||
|
pub async fn replace(
|
||||||
|
pool: &DbPool,
|
||||||
|
for_local_site_id: LocalSiteId,
|
||||||
|
list_content: Option<Vec<String>>,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
if let Some(list) = list_content {
|
||||||
|
let conn = &mut get_conn(pool).await?;
|
||||||
|
conn
|
||||||
|
.build_transaction()
|
||||||
|
.run(|conn| {
|
||||||
|
Box::pin(async move {
|
||||||
|
Self::clear(conn).await?;
|
||||||
|
|
||||||
|
for item in list {
|
||||||
|
let form = TaglineForm {
|
||||||
|
local_site_id: for_local_site_id,
|
||||||
|
content: item,
|
||||||
|
updated: None,
|
||||||
|
};
|
||||||
|
insert_into(tagline)
|
||||||
|
.values(form)
|
||||||
|
.get_result::<Self>(conn)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}) as _
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn clear(conn: &mut AsyncPgConnection) -> Result<usize, Error> {
|
||||||
|
diesel::delete(tagline).execute(conn).await
|
||||||
|
}
|
||||||
|
pub async fn get_all(pool: &DbPool, for_local_site_id: LocalSiteId) -> Result<Vec<Self>, Error> {
|
||||||
|
use crate::schema::tagline::dsl::*;
|
||||||
|
let conn = &mut get_conn(pool).await?;
|
||||||
|
tagline
|
||||||
|
.filter(local_site_id.eq(for_local_site_id))
|
||||||
|
.get_results::<Self>(conn)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
|
@ -721,6 +721,16 @@ table! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table! {
|
||||||
|
tagline(id) {
|
||||||
|
id -> Int4,
|
||||||
|
local_site_id -> Int4,
|
||||||
|
content -> Text,
|
||||||
|
published -> Timestamp,
|
||||||
|
updated -> Nullable<Timestamp>,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
joinable!(person_block -> person (person_id));
|
joinable!(person_block -> person (person_id));
|
||||||
|
|
||||||
joinable!(comment -> person (creator_id));
|
joinable!(comment -> person (creator_id));
|
||||||
|
@ -804,6 +814,7 @@ joinable!(federation_allowlist -> instance (instance_id));
|
||||||
joinable!(federation_blocklist -> instance (instance_id));
|
joinable!(federation_blocklist -> instance (instance_id));
|
||||||
joinable!(local_site -> site (site_id));
|
joinable!(local_site -> site (site_id));
|
||||||
joinable!(local_site_rate_limit -> local_site (local_site_id));
|
joinable!(local_site_rate_limit -> local_site (local_site_id));
|
||||||
|
joinable!(tagline -> local_site (local_site_id));
|
||||||
|
|
||||||
allow_tables_to_appear_in_same_query!(
|
allow_tables_to_appear_in_same_query!(
|
||||||
activity,
|
activity,
|
||||||
|
@ -855,6 +866,7 @@ allow_tables_to_appear_in_same_query!(
|
||||||
email_verification,
|
email_verification,
|
||||||
registration_application,
|
registration_application,
|
||||||
language,
|
language,
|
||||||
|
tagline,
|
||||||
local_user_language,
|
local_user_language,
|
||||||
site_language,
|
site_language,
|
||||||
community_language,
|
community_language,
|
||||||
|
|
|
@ -26,3 +26,4 @@ pub mod private_message_report;
|
||||||
pub mod registration_application;
|
pub mod registration_application;
|
||||||
pub mod secret;
|
pub mod secret;
|
||||||
pub mod site;
|
pub mod site;
|
||||||
|
pub mod tagline;
|
||||||
|
|
28
crates/db_schema/src/source/tagline.rs
Normal file
28
crates/db_schema/src/source/tagline.rs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
use crate::newtypes::LocalSiteId;
|
||||||
|
#[cfg(feature = "full")]
|
||||||
|
use crate::schema::tagline;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, Debug, Clone, Serialize, Deserialize)]
|
||||||
|
#[cfg_attr(feature = "full", derive(Queryable, Associations, Identifiable))]
|
||||||
|
#[cfg_attr(feature = "full", diesel(table_name = tagline))]
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "full",
|
||||||
|
diesel(belongs_to(crate::source::local_site::LocalSite))
|
||||||
|
)]
|
||||||
|
pub struct Tagline {
|
||||||
|
pub id: i32,
|
||||||
|
pub local_site_id: LocalSiteId,
|
||||||
|
pub content: String,
|
||||||
|
pub published: chrono::NaiveDateTime,
|
||||||
|
pub updated: Option<chrono::NaiveDateTime>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Default)]
|
||||||
|
#[cfg_attr(feature = "full", derive(Insertable, AsChangeset))]
|
||||||
|
#[cfg_attr(feature = "full", diesel(table_name = tagline))]
|
||||||
|
pub struct TaglineForm {
|
||||||
|
pub local_site_id: LocalSiteId,
|
||||||
|
pub content: String,
|
||||||
|
pub updated: Option<chrono::NaiveDateTime>,
|
||||||
|
}
|
1
migrations/2022-11-13-181529_create_taglines/down.sql
Normal file
1
migrations/2022-11-13-181529_create_taglines/down.sql
Normal file
|
@ -0,0 +1 @@
|
||||||
|
drop table tagline;
|
7
migrations/2022-11-13-181529_create_taglines/up.sql
Normal file
7
migrations/2022-11-13-181529_create_taglines/up.sql
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
create table tagline (
|
||||||
|
id serial primary key,
|
||||||
|
local_site_id int references local_site on update cascade on delete cascade not null,
|
||||||
|
content text not null,
|
||||||
|
published timestamp without time zone default now() not null,
|
||||||
|
updated timestamp without time zone
|
||||||
|
);
|
Loading…
Reference in a new issue