Implement site settings for title, header, and owner

This commit is contained in:
Evie Viau-Chow-Stuart 2023-02-05 02:41:29 -08:00
parent 5715225050
commit a95db555ac
Signed by: evie
GPG key ID: 928652CDFCEC8099
10 changed files with 112 additions and 11 deletions

View file

@ -6,6 +6,7 @@ mod m20230204_014834_create_post_blocks;
mod m20230204_014838_create_page_blocks;
mod m20230204_194846_create_menus;
mod m20230204_201059_create_menu_entries;
mod m20230205_022300_create_settings;
pub struct Migrator;
#[async_trait::async_trait]
@ -18,6 +19,7 @@ impl MigratorTrait for Migrator {
Box::new(m20230204_014838_create_page_blocks::Migration),
Box::new(m20230204_194846_create_menus::Migration),
Box::new(m20230204_201059_create_menu_entries::Migration),
Box::new(m20230205_022300_create_settings::Migration),
]
}
}

View file

@ -0,0 +1,43 @@
use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.create_table(
Table::create()
.table(Settings::Table)
.if_not_exists()
.col(
ColumnDef::new(Settings::Id)
.string()
.not_null()
.primary_key(),
)
.col(ColumnDef::new(Settings::SiteName).string().not_null())
.col(ColumnDef::new(Settings::SiteHeader).string().not_null())
.col(ColumnDef::new(Settings::SiteOwner).string().not_null())
.to_owned(),
)
.await
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_table(Table::drop().table(Settings::Table).to_owned())
.await
}
}
/// Learn more at https://docs.rs/sea-query#iden
#[derive(Iden)]
enum Settings {
Table,
Id,
SiteName,
SiteHeader,
SiteOwner,
}

View file

@ -8,3 +8,4 @@ pub mod page;
pub mod page_block;
pub mod post;
pub mod post_block;
pub mod settings;

View file

@ -6,3 +6,4 @@ pub use super::page::Entity as Page;
pub use super::page_block::Entity as PageBlock;
pub use super::post::Entity as Post;
pub use super::post_block::Entity as PostBlock;
pub use super::settings::Entity as Settings;

18
src/entities/settings.rs Normal file
View file

@ -0,0 +1,18 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.7
use sea_orm::entity::prelude::*;
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
#[sea_orm(table_name = "settings")]
pub struct Model {
#[sea_orm(primary_key, auto_increment = false)]
pub id: String,
pub site_name: String,
pub site_header: String,
pub site_owner: String,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
impl ActiveModelBehavior for ActiveModel {}

View file

@ -21,7 +21,8 @@ pub(crate) struct PageTemplate {
description: Option<String>,
show_title: bool,
content_blocks: Vec<BlockTypes>,
year: String
year: String,
settings: settings::Model
}
#[derive(Template)]
@ -35,6 +36,7 @@ pub(crate) struct PostTemplate {
last_updated: Option<String>,
content_blocks: Vec<BlockTypes>,
year: String,
settings: settings::Model
}
#[derive(Template)]
@ -42,7 +44,8 @@ pub(crate) struct PostTemplate {
pub(crate) struct NotFoundTemplate {
menu: Vec<menu_entry::Model>,
slug: String,
year: String
year: String,
settings: settings::Model
}
#[derive(Template)]
@ -54,7 +57,8 @@ pub(crate) struct HomeSpecialTemplate {
description: Option<String>,
show_title: bool,
content_blocks: Vec<BlockTypes>,
year: String
year: String,
settings: settings::Model
}
// Handle the special home page
@ -105,6 +109,13 @@ pub(crate) async fn root(
.await
.expect("Failed to get primary menu items!");
let settings: settings::Model = Settings::find()
.filter(settings::Column::Id.eq("current"))
.one(&state.db_conn)
.await
.expect("Failed to get site settings!")
.unwrap();
HomeSpecialTemplate {
title: page_meta.clone().title,
description: page_meta.clone().description,
@ -112,6 +123,7 @@ pub(crate) async fn root(
content_blocks,
year: "2023".to_string(),
draft: false,
menu
menu,
settings
}
}

View file

@ -27,6 +27,13 @@ pub(crate) async fn resolver(
.await
.expect("Failed to get primary menu items!");
let settings: settings::Model = Settings::find()
.filter(settings::Column::Id.eq("current"))
.one(&state.db_conn)
.await
.expect("Failed to get site settings!")
.unwrap();
let page_search: Result<Option<page::Model>, DbErr> = Page::find()
.filter(page::Column::Slug.eq(&slug))
.one(&state.db_conn)
@ -36,7 +43,7 @@ pub(crate) async fn resolver(
Ok(page_result) => {
match page_result {
Some(page_result) => page_result,
None => return (StatusCode::NOT_FOUND, NotFoundTemplate { slug, year: "2023".to_owned(), menu }).into_response(),
None => return (StatusCode::NOT_FOUND, NotFoundTemplate { slug, year: "2023".to_owned(), menu, settings }).into_response(),
}
},
Err(e) => {
@ -77,6 +84,7 @@ pub(crate) async fn resolver(
show_title: page_meta.clone().show_title,
content_blocks,
year: "2023".to_string(),
menu
menu,
settings
}).into_response()
}

View file

@ -27,6 +27,13 @@ pub(crate) async fn resolver(
.await
.expect("Failed to get primary menu items!");
let settings: settings::Model = Settings::find()
.filter(settings::Column::Id.eq("current"))
.one(&state.db_conn)
.await
.expect("Failed to get site settings!")
.unwrap();
let post_search: Result<Option<post::Model>, DbErr> = Post::find()
.filter(post::Column::Slug.eq(&slug))
.one(&state.db_conn)
@ -36,7 +43,7 @@ pub(crate) async fn resolver(
Ok(post_result) => {
match post_result {
Some(post_result) => post_result,
None => return (StatusCode::NOT_FOUND, NotFoundTemplate { slug, year: "2023".to_owned(), menu }).into_response(),
None => return (StatusCode::NOT_FOUND, NotFoundTemplate { slug, year: "2023".to_owned(), menu, settings }).into_response(),
}
},
Err(e) => {
@ -84,5 +91,6 @@ pub(crate) async fn resolver(
content_blocks,
year: "2023".to_string(),
menu,
settings
}).into_response()
}

View file

@ -13,6 +13,7 @@ pub(crate) struct PageTemplate {
menu: Vec<menu_entry::Model>,
posts: Vec<post::Model>,
year: String,
settings: settings::Model
}
pub(crate) async fn posts(state: State<AppState>) -> impl IntoResponse {
@ -28,6 +29,13 @@ pub(crate) async fn posts(state: State<AppState>) -> impl IntoResponse {
.await
.expect("Failed to get primary menu items!");
let settings: settings::Model = Settings::find()
.filter(settings::Column::Id.eq("current"))
.one(&state.db_conn)
.await
.expect("Failed to get site settings!")
.unwrap();
let posts: Vec<post::Model> = Post::find()
.filter(post::Column::Draft.eq(false))
.order_by_desc(post::Column::Published)
@ -35,5 +43,5 @@ pub(crate) async fn posts(state: State<AppState>) -> impl IntoResponse {
.await
.expect("Failed to load posts!");
PageTemplate { menu, posts, year: "2023".to_owned() }
PageTemplate { menu, posts, year: "2023".to_owned(), settings }
}

View file

@ -3,14 +3,14 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Evie / eviee / uwueviee - {% block title %}{{ title }}{% endblock %}</title>
<title>{{ settings.site_name }} - {% block title %}{{ title }}{% endblock %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/css/sakura-pink.css" media="screen" type="text/css">
<link rel="stylesheet" href="/static/css/sakura-vader.css" media="screen and (prefers-color-scheme: dark)" type="text/css">
<link rel="stylesheet" href="/static/css/meow.css" type="text/css">
</head>
<body>
<h1>🐈 Evie / eviee / uwueviee</h1>
<h1>{{ settings.site_header }}</h1>
<ul class="primary-menu">
{% for entry in menu %}
@ -25,6 +25,6 @@
</div>
<hr />
<p class="footer">Proudly powered by <a href="https://git.gaycatgirl.sex/evie/kyanite">Kyanite</a>, Made with 🏳️‍⚧️💜 and Rust. <i>© {{ year }} Evie Viau</i></p>
<p class="footer">Proudly powered by <a href="https://git.gaycatgirl.sex/evie/kyanite">Kyanite</a>, Made with 🏳️‍⚧️💜 and Rust. <i>© {{ year }} {{ settings.site_owner }}</i></p>
</body>
</html>