Clean up code
This commit is contained in:
parent
b922771a5a
commit
7d5fadf47e
8 changed files with 301 additions and 200 deletions
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal 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
12
.idea/kyanite.iml
generated
Normal 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
8
.idea/modules.xml
generated
Normal 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
6
.idea/vcs.xml
generated
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
39
src/main.rs
39
src/main.rs
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
Reference in a new issue