Clean up code

This commit is contained in:
Evie Viau-Chow-Stuart 2023-02-07 23:59:32 -08:00
parent b922771a5a
commit 7d5fadf47e
Signed by: evie
GPG key ID: 928652CDFCEC8099
8 changed files with 301 additions and 200 deletions

8
.idea/.gitignore generated vendored Normal file
View file

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

12
.idea/kyanite.iml generated Normal file
View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="CPP_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
<excludeFolder url="file://$MODULE_DIR$/migration/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml generated Normal file
View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/kyanite.iml" filepath="$PROJECT_DIR$/.idea/kyanite.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View file

@ -1,15 +1,15 @@
use std::{net::SocketAddr, env};
use std::str::FromStr;
use std::{env, net::SocketAddr};
use axum::{Router, routing::get};
use axum::{routing::get, Router};
use log::info;
use sea_orm::{Database, DatabaseConnection, ConnectOptions};
use sea_orm::{ConnectOptions, Database, DatabaseConnection};
use migration::{Migrator, MigratorTrait};
mod routes;
mod entities;
mod block_types;
mod entities;
mod routes;
#[tokio::main]
async fn main() {
@ -22,7 +22,8 @@ async fn main() {
info!("Starting up..");
let db_url = env::var("DATABASE_URL").expect("DATABASE_URL is not set in the enviroment! HALTING");
let db_url =
env::var("DATABASE_URL").expect("DATABASE_URL is not set in the environment! HALTING");
let host = env::var("HOST").unwrap_or("0.0.0.0".to_string());
let port = env::var("PORT").unwrap_or("3621".to_string());
@ -34,8 +35,12 @@ async fn main() {
migration_db_opt.sqlx_logging_level(log::LevelFilter::Debug);
info!("Checking for migrations needed...");
let migrator_conn = migration::sea_orm::Database::connect(migration_db_opt).await.expect("Failed to connect to the database! HALTING");
Migrator::up(&migrator_conn, None).await.expect("Failed to run migrations! HALTING");
let migrator_conn = migration::sea_orm::Database::connect(migration_db_opt)
.await
.expect("Failed to connect to the database! HALTING");
Migrator::up(&migrator_conn, None)
.await
.expect("Failed to run migrations! HALTING");
let mut db_opt = ConnectOptions::new(db_url.clone());
db_opt.sqlx_logging_level(log::LevelFilter::Debug);
@ -57,26 +62,26 @@ async fn main() {
info!("Attempting to bind to address...");
let listen_addr = SocketAddr::from_str(&server_url).expect("Failed to parse host and port! HALTING");
let listen_addr =
SocketAddr::from_str(&server_url).expect("Failed to parse host and port! HALTING");
let bind = axum::Server::try_bind(&listen_addr);
match bind {
Ok(bind) => {
info!("Binded to address successfully!");
info!("Bound to address successfully!");
info!("Listening for connections...");
match bind.serve(app.into_make_service()).await {
Err(e) => panic!("Failed to start server! HALTING {}", e),
_ => (),
if let Err(e) = bind.serve(app.into_make_service()).await {
panic!("Failed to start server! HALTING {e}")
}
},
}
Err(e) => {
panic!("Failed to bind! HALTING {}", e)
},
panic!("Failed to bind! HALTING {e}")
}
}
}
#[derive(Clone)]
struct AppState {
db_conn: DatabaseConnection,
}
}

View file

@ -2,9 +2,9 @@ pub(crate) mod page_resolver;
pub(crate) mod post_resolver;
pub(crate) mod posts;
use askama::Template;
use chrono::{Utc, Datelike};
use crate::{block_types::BlockTypes, AppState};
use askama::Template;
use chrono::{Datelike, Utc};
use axum::extract::State;
use log::warn;
@ -23,7 +23,7 @@ pub(crate) struct PageTemplate {
show_title: bool,
content_blocks: Vec<BlockTypes>,
year: String,
settings: settings::Model
settings: settings::Model,
}
#[derive(Template)]
@ -38,7 +38,7 @@ pub(crate) struct PostTemplate {
content_blocks: Vec<BlockTypes>,
year: String,
settings: settings::Model,
featured_image: Option<image::Model>
featured_image: Option<image::Model>,
}
#[derive(Template)]
@ -47,7 +47,7 @@ pub(crate) struct PageNotFoundTemplate {
menu: Vec<menu_entry::Model>,
slug: String,
year: String,
settings: settings::Model
settings: settings::Model,
}
#[derive(Template)]
@ -56,7 +56,7 @@ pub(crate) struct PostNotFoundTemplate {
menu: Vec<menu_entry::Model>,
slug: String,
year: String,
settings: settings::Model
settings: settings::Model,
}
#[derive(Template)]
@ -69,25 +69,24 @@ pub(crate) struct HomeSpecialTemplate {
show_title: bool,
content_blocks: Vec<BlockTypes>,
year: String,
settings: settings::Model
settings: settings::Model,
}
// Handle the special home page
pub(crate) async fn root(
state: State<AppState>
) -> HomeSpecialTemplate {
pub(crate) async fn root(state: State<AppState>) -> HomeSpecialTemplate {
// Grab special home slug page content
let page_meta: page::Model = match Page::find()
.filter(page::Column::Slug.eq("home"))
.one(&state.db_conn)
.await
.expect("Failed to get home page! HALTING") {
Some(page_meta) => page_meta,
None => panic!("Missing \"home\" page in database!"),
};
.expect("Failed to get home page! HALTING")
{
Some(page_meta) => page_meta,
None => panic!("Missing \"home\" page in database!"),
};
let blocks: Vec<page_block::Model> = page_meta.find_related(PageBlock)
let blocks: Vec<page_block::Model> = page_meta
.find_related(PageBlock)
.order_by_asc(page_block::Column::Order)
.all(&state.db_conn)
.await
@ -96,60 +95,74 @@ pub(crate) async fn root(
let mut content_blocks: Vec<BlockTypes> = vec![];
for block in blocks {
content_blocks.push(
match block.r#type.as_str() {
"HR" => BlockTypes::HR,
"PARAGRAPH" => BlockTypes::PARAGRAPH { text: block.content },
"MARKDOWN" => BlockTypes::MARKDOWN { content: block.content },
"HEADER" => {
let deserde: block_types::Header = serde_json::from_str(&block.content.as_str()).expect("Incorrect HEADER blockormatting");
content_blocks.push(match block.r#type.as_str() {
"HR" => BlockTypes::HR,
"PARAGRAPH" => BlockTypes::PARAGRAPH {
text: block.content,
},
"MARKDOWN" => BlockTypes::MARKDOWN {
content: block.content,
},
"HEADER" => {
let deserde: block_types::Header = serde_json::from_str(block.content.as_str())
.expect("Incorrect HEADER block formatting");
BlockTypes::HEADER { text: deserde.text, size: deserde.size }
},
"HTML" => BlockTypes::HTML { content: block.content },
"IMAGE" => BlockTypes::IMAGE { content: {
Image::find_by_id(block.content)
.one(&state.db_conn)
.await
.expect("Failed to get image! HALTING")
}},
_ => {
warn!("Unsupported block type! ({})", block.r#type.as_str());
BlockTypes::UNSUPPORTED
}
});
BlockTypes::HEADER {
text: deserde.text,
size: deserde.size,
}
}
"HTML" => BlockTypes::HTML {
content: block.content,
},
"IMAGE" => BlockTypes::IMAGE {
content: {
Image::find_by_id(block.content)
.one(&state.db_conn)
.await
.expect("Failed to get image! HALTING")
},
},
_ => {
warn!("Unsupported block type! ({})", block.r#type.as_str());
BlockTypes::UNSUPPORTED
}
});
}
let menu: Vec<menu_entry::Model> = match Menu::find()
.filter(menu::Column::Name.eq("primary"))
.one(&state.db_conn)
.await
.expect("Failed to get primary menu! HALTING") {
Some(menu) => menu,
None => panic!("Missing \"primary\" menu in database!"),
}.find_related(MenuEntry)
.order_by_asc(menu_entry::Column::Order)
.all(&state.db_conn)
.await
.expect("Failed to get primary menu items!");
.expect("Failed to get primary menu! HALTING")
{
Some(menu) => menu,
None => panic!("Missing \"primary\" menu in database!"),
}
.find_related(MenuEntry)
.order_by_asc(menu_entry::Column::Order)
.all(&state.db_conn)
.await
.expect("Failed to get primary menu items!");
let settings: settings::Model = match Settings::find()
.filter(settings::Column::Id.eq("current"))
.one(&state.db_conn)
.await
.expect("Failed to get site settings!") {
Some (settings) => settings,
None => panic!("Missing \"current\" settings in database!")
};
.expect("Failed to get site settings!")
{
Some(settings) => settings,
None => panic!("Missing \"current\" settings in database!"),
};
HomeSpecialTemplate {
title: page_meta.clone().title,
description: page_meta.clone().description,
show_title: page_meta.clone().show_title,
content_blocks,
year: Utc::now().date_naive().year().to_string(),
year: Utc::now().date_naive().year().to_string(),
draft: false,
menu,
settings
settings,
}
}
}

View file

@ -1,43 +1,45 @@
use askama_axum::IntoResponse;
use axum::extract::{State, Path};
use axum::extract::{Path, State};
use axum::http::StatusCode;
use log::{warn, error};
use log::{error, warn};
use crate::block_types;
use crate::{block_types::BlockTypes, AppState};
use crate::entities::{prelude::*, *};
use crate::{block_types::BlockTypes, AppState};
use sea_orm::*;
use chrono::{Utc, Datelike};
use chrono::{Datelike, Utc};
use super::{PageTemplate, PageNotFoundTemplate};
use super::{PageNotFoundTemplate, PageTemplate};
pub(crate) async fn resolver(
Path(slug): Path<String>,
state: State<AppState>
) -> impl IntoResponse {
Path(slug): Path<String>,
state: State<AppState>,
) -> impl IntoResponse {
let menu: Vec<menu_entry::Model> = match Menu::find()
.filter(menu::Column::Name.eq("primary"))
.one(&state.db_conn)
.await
.expect("Failed to get primary menu! HALTING") {
Some(menu) => menu,
None => panic!("Missing \"primary\" menu in database!"),
}.find_related(MenuEntry)
.order_by_asc(menu_entry::Column::Order)
.all(&state.db_conn)
.await
.expect("Failed to get primary menu items!");
.expect("Failed to get primary menu! HALTING")
{
Some(menu) => menu,
None => panic!("Missing \"primary\" menu in database!"),
}
.find_related(MenuEntry)
.order_by_asc(menu_entry::Column::Order)
.all(&state.db_conn)
.await
.expect("Failed to get primary menu items!");
let settings: settings::Model = match Settings::find()
.filter(settings::Column::Id.eq("current"))
.one(&state.db_conn)
.await
.expect("Failed to get site settings!") {
Some (settings) => settings,
None => panic!("Missing \"current\" settings in database!")
};
.expect("Failed to get site settings!")
{
Some(settings) => settings,
None => panic!("Missing \"current\" settings in database!"),
};
let page_search: Result<Option<page::Model>, DbErr> = Page::find()
.filter(page::Column::Slug.eq(&slug))
@ -45,19 +47,29 @@ pub(crate) async fn resolver(
.await;
let page_meta: page::Model = match page_search {
Ok(page_result) => {
match page_result {
Some(page_result) => page_result,
None => return (StatusCode::NOT_FOUND, PageNotFoundTemplate { slug, year: Utc::now().date_naive().year().to_string(), menu, settings }).into_response(),
Ok(page_result) => match page_result {
Some(page_result) => page_result,
None => {
return (
StatusCode::NOT_FOUND,
PageNotFoundTemplate {
slug,
year: Utc::now().date_naive().year().to_string(),
menu,
settings,
},
)
.into_response()
}
},
Err(e) => {
error!("{}", e);
return (StatusCode::INTERNAL_SERVER_ERROR, ()).into_response();
},
}
};
let blocks: Vec<page_block::Model> = page_meta.find_related(PageBlock)
let blocks: Vec<page_block::Model> = page_meta
.find_related(PageBlock)
.order_by_asc(page_block::Column::Order)
.all(&state.db_conn)
.await
@ -66,38 +78,53 @@ pub(crate) async fn resolver(
let mut content_blocks: Vec<BlockTypes> = vec![];
for block in blocks {
content_blocks.push(
match block.r#type.as_str() {
"HR" => BlockTypes::HR,
"PARAGRAPH" => BlockTypes::PARAGRAPH { text: block.content },
"MARKDOWN" => BlockTypes::MARKDOWN { content: block.content },
"HEADER" => {
let deserde: block_types::Header = serde_json::from_str(&block.content.as_str()).expect("Incorrect HEADER blockormatting");
content_blocks.push(match block.r#type.as_str() {
"HR" => BlockTypes::HR,
"PARAGRAPH" => BlockTypes::PARAGRAPH {
text: block.content,
},
"MARKDOWN" => BlockTypes::MARKDOWN {
content: block.content,
},
"HEADER" => {
let deserde: block_types::Header = serde_json::from_str(block.content.as_str())
.expect("Incorrect HEADER block formatting");
BlockTypes::HEADER { text: deserde.text, size: deserde.size }
},
"HTML" => BlockTypes::HTML { content: block.content },
"IMAGE" => BlockTypes::IMAGE { content: {
Image::find_by_id(block.content)
.one(&state.db_conn)
.await
.expect("Failed to get image! HALTING")
}},
_ => {
warn!("Unsupported block type! ({})", block.r#type.as_str());
BlockTypes::UNSUPPORTED
}
});
BlockTypes::HEADER {
text: deserde.text,
size: deserde.size,
}
}
"HTML" => BlockTypes::HTML {
content: block.content,
},
"IMAGE" => BlockTypes::IMAGE {
content: {
Image::find_by_id(block.content)
.one(&state.db_conn)
.await
.expect("Failed to get image! HALTING")
},
},
_ => {
warn!("Unsupported block type! ({})", block.r#type.as_str());
BlockTypes::UNSUPPORTED
}
});
}
(StatusCode::FOUND, PageTemplate {
draft: page_meta.clone().draft,
title: page_meta.clone().title,
description: page_meta.clone().description,
show_title: page_meta.clone().show_title,
content_blocks,
year: Utc::now().date_naive().year().to_string(),
menu,
settings
}).into_response()
}
(
StatusCode::FOUND,
PageTemplate {
draft: page_meta.clone().draft,
title: page_meta.clone().title,
description: page_meta.clone().description,
show_title: page_meta.clone().show_title,
content_blocks,
year: Utc::now().date_naive().year().to_string(),
menu,
settings,
},
)
.into_response()
}

View file

@ -1,43 +1,45 @@
use askama_axum::IntoResponse;
use axum::extract::{State, Path};
use axum::extract::{Path, State};
use axum::http::StatusCode;
use log::{warn, error};
use log::{error, warn};
use crate::block_types;
use crate::{block_types::BlockTypes, AppState};
use crate::entities::{prelude::*, *};
use crate::{block_types::BlockTypes, AppState};
use sea_orm::*;
use chrono::{Utc, Datelike};
use chrono::{Datelike, Utc};
use super::{PostTemplate, PostNotFoundTemplate};
use super::{PostNotFoundTemplate, PostTemplate};
pub(crate) async fn resolver(
Path(slug): Path<String>,
state: State<AppState>
) -> impl IntoResponse {
Path(slug): Path<String>,
state: State<AppState>,
) -> impl IntoResponse {
let menu: Vec<menu_entry::Model> = match Menu::find()
.filter(menu::Column::Name.eq("primary"))
.one(&state.db_conn)
.await
.expect("Failed to get primary menu! HALTING") {
Some(menu) => menu,
None => panic!("Missing \"primary\" menu in database!"),
}.find_related(MenuEntry)
.order_by_asc(menu_entry::Column::Order)
.all(&state.db_conn)
.await
.expect("Failed to get primary menu items!");
.expect("Failed to get primary menu! HALTING")
{
Some(menu) => menu,
None => panic!("Missing \"primary\" menu in database!"),
}
.find_related(MenuEntry)
.order_by_asc(menu_entry::Column::Order)
.all(&state.db_conn)
.await
.expect("Failed to get primary menu items!");
let settings: settings::Model = match Settings::find()
.filter(settings::Column::Id.eq("current"))
.one(&state.db_conn)
.await
.expect("Failed to get site settings!") {
Some (settings) => settings,
None => panic!("Missing \"current\" settings in database!")
};
.expect("Failed to get site settings!")
{
Some(settings) => settings,
None => panic!("Missing \"current\" settings in database!"),
};
let post_search: Result<Option<post::Model>, DbErr> = Post::find()
.filter(post::Column::Slug.eq(&slug))
@ -45,19 +47,29 @@ pub(crate) async fn resolver(
.await;
let post_meta: post::Model = match post_search {
Ok(post_result) => {
match post_result {
Some(post_result) => post_result,
None => return (StatusCode::NOT_FOUND, PostNotFoundTemplate { slug, year: Utc::now().date_naive().year().to_string(), menu, settings }).into_response(),
Ok(post_result) => match post_result {
Some(post_result) => post_result,
None => {
return (
StatusCode::NOT_FOUND,
PostNotFoundTemplate {
slug,
year: Utc::now().date_naive().year().to_string(),
menu,
settings,
},
)
.into_response()
}
},
Err(e) => {
error!("{}", e);
return (StatusCode::INTERNAL_SERVER_ERROR, ()).into_response();
},
}
};
let blocks: Vec<post_block::Model> = post_meta.find_related(PostBlock)
let blocks: Vec<post_block::Model> = post_meta
.find_related(PostBlock)
.order_by_asc(post_block::Column::Order)
.all(&state.db_conn)
.await
@ -66,56 +78,66 @@ pub(crate) async fn resolver(
let mut content_blocks: Vec<BlockTypes> = vec![];
for block in blocks {
content_blocks.push(
match block.r#type.as_str() {
"HR" => BlockTypes::HR,
"PARAGRAPH" => BlockTypes::PARAGRAPH { text: block.content },
"MARKDOWN" => BlockTypes::MARKDOWN { content: block.content },
"HEADER" => {
let deserde: block_types::Header = serde_json::from_str(&block.content.as_str()).expect("Incorrect HEADER blockormatting");
content_blocks.push(match block.r#type.as_str() {
"HR" => BlockTypes::HR,
"PARAGRAPH" => BlockTypes::PARAGRAPH {
text: block.content,
},
"MARKDOWN" => BlockTypes::MARKDOWN {
content: block.content,
},
"HEADER" => {
let deserde: block_types::Header = serde_json::from_str(block.content.as_str())
.expect("Incorrect HEADER block formatting");
BlockTypes::HEADER { text: deserde.text, size: deserde.size }
},
"HTML" => BlockTypes::HTML { content: block.content },
"IMAGE" => BlockTypes::IMAGE { content: {
Image::find_by_id(block.content)
.one(&state.db_conn)
.await
.expect("Failed to get image! HALTING")
}},
_ => {
warn!("Unsupported block type! ({})", block.r#type.as_str());
BlockTypes::UNSUPPORTED
}
});
BlockTypes::HEADER {
text: deserde.text,
size: deserde.size,
}
}
"HTML" => BlockTypes::HTML {
content: block.content,
},
"IMAGE" => BlockTypes::IMAGE {
content: {
Image::find_by_id(block.content)
.one(&state.db_conn)
.await
.expect("Failed to get image! HALTING")
},
},
_ => {
warn!("Unsupported block type! ({})", block.r#type.as_str());
BlockTypes::UNSUPPORTED
}
});
}
let last_updated = match post_meta.clone().updated {
Some(updated) => Some(updated.to_string()),
None => None,
};
let last_updated = post_meta.clone().updated.map(|updated| updated.to_string());
let featured_image: Option<image::Model> = match post_meta.clone().featured_image {
Some(featured_image) => {
Image::find()
.filter(image::Column::Id.eq(featured_image))
.one(&state.db_conn)
.await
.expect("Failed to get image! HALTING")
},
Some(featured_image) => Image::find()
.filter(image::Column::Id.eq(featured_image))
.one(&state.db_conn)
.await
.expect("Failed to get image! HALTING"),
None => None,
};
(StatusCode::FOUND, PostTemplate {
draft: post_meta.clone().draft,
title: post_meta.clone().title,
summary: post_meta.clone().summary,
publish_date: post_meta.clone().published.to_string(),
last_updated,
content_blocks,
year: Utc::now().date_naive().year().to_string(),
menu,
settings,
featured_image,
}).into_response()
}
(
StatusCode::FOUND,
PostTemplate {
draft: post_meta.clone().draft,
title: post_meta.clone().title,
summary: post_meta.clone().summary,
publish_date: post_meta.clone().published.to_string(),
last_updated,
content_blocks,
year: Utc::now().date_naive().year().to_string(),
menu,
settings,
featured_image,
},
)
.into_response()
}