WIP: recent content

This commit is contained in:
Per Stark
2025-01-27 09:37:48 +01:00
parent 3df72ce99d
commit 087f0941c3
7 changed files with 4656 additions and 23 deletions

59
Cargo.lock generated
View File

@@ -2684,9 +2684,9 @@ dependencies = [
[[package]]
name = "minijinja"
version = "2.5.0"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c37e1b517d1dcd0e51dc36c4567b9d5a29262b3ec8da6cb5d35e27a8fb529b5"
checksum = "212b4cab3aad057bc6e611814472905546c533295723b9e26a31c7feb19a8e65"
dependencies = [
"memo-map",
"self_cell",
@@ -2703,6 +2703,18 @@ dependencies = [
"notify",
]
[[package]]
name = "minijinja-contrib"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22c4652069ecd6ce1e7724229d859f11f8a0804512da4c274e67d937b833e47c"
dependencies = [
"minijinja",
"serde",
"time",
"time-tz",
]
[[package]]
name = "minimal-lexical"
version = "0.2.1"
@@ -3092,6 +3104,15 @@ dependencies = [
"windows-targets",
]
[[package]]
name = "parse-zoneinfo"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24"
dependencies = [
"regex",
]
[[package]]
name = "password-hash"
version = "0.5.0"
@@ -4187,6 +4208,18 @@ dependencies = [
"serde",
]
[[package]]
name = "serde-xml-rs"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65162e9059be2f6a3421ebbb4fef3e74b7d9e7c60c50a0e292c6239f19f1edfa"
dependencies = [
"log",
"serde",
"thiserror",
"xml-rs",
]
[[package]]
name = "serde_derive"
version = "1.0.210"
@@ -4877,6 +4910,21 @@ dependencies = [
"time-core",
]
[[package]]
name = "time-tz"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a422f65dfdf08a81317d54fa00b45dc58cbccab69be78c1447391cc39ae8c9d4"
dependencies = [
"cfg-if",
"parse-zoneinfo",
"phf",
"phf_codegen",
"serde",
"serde-xml-rs",
"time",
]
[[package]]
name = "tiny-keccak"
version = "2.0.2"
@@ -5722,6 +5770,12 @@ dependencies = [
"tap",
]
[[package]]
name = "xml-rs"
version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193"
[[package]]
name = "yaml-rust2"
version = "0.9.0"
@@ -5847,6 +5901,7 @@ dependencies = [
"mime_guess",
"minijinja",
"minijinja-autoreload",
"minijinja-contrib",
"mockall",
"reqwest",
"scraper",

View File

@@ -20,6 +20,7 @@ mime = "0.3.17"
mime_guess = "2.0.5"
minijinja = { version = "2.5.0", features = ["loader", "multi_template"] }
minijinja-autoreload = "2.5.0"
minijinja-contrib = { version = "2.6.0", features = ["datetime", "timezone"] }
mockall = "0.13.0"
reqwest = {version = "0.12.12", features = ["charset", "json"]}
scraper = "0.22.0"

File diff suppressed because one or more lines are too long

View File

@@ -70,6 +70,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
notifier.set_fast_reload(true);
notifier.watch_path(&template_path, true);
minijinja_contrib::add_to_environment(&mut env);
Ok(env)
});

View File

@@ -9,13 +9,14 @@ use crate::{
error::HtmlError,
page_data,
server::{routes::html::render_template, AppState},
storage::types::user::User,
storage::types::{text_content::TextContent, user::User},
};
page_data!(IndexData, "index/index.html", {
gdpr_accepted: bool,
queue_length: u32,
user: Option<User>
user: Option<User>,
latest_text_contents: Vec<TextContent>
});
pub async fn index_handler(
@@ -37,17 +38,29 @@ pub async fn index_handler(
false => 0,
};
// let latest_text_contents = match auth.current_user.is_some() {
// true =>
// }
let latest_text_contents = match auth.current_user.is_some() {
true => User::get_latest_text_contents(
auth.current_user.clone().unwrap().id.as_str(),
&state.surreal_db_client,
)
.await
.map_err(|e| HtmlError::new(e, state.templates.clone()))?,
false => vec![],
};
// let knowledge_entities = User::get_knowledge_entities(
// &auth.current_user.clone().unwrap().id,
// &state.surreal_db_client,
// )
// .await?;
info!("{:?}", latest_text_contents);
// info!("{:?}", knowledge_entities);
let latest_knowledge_entities = match auth.current_user.is_some() {
true => User::get_latest_knowledge_entities(
auth.current_user.clone().unwrap().id.as_str(),
&state.surreal_db_client,
)
.await
.map_err(|e| HtmlError::new(e, state.templates.clone()))?,
false => vec![],
};
info!("{:?}", latest_knowledge_entities);
let output = render_template(
IndexData::template_name(),
@@ -55,6 +68,7 @@ pub async fn index_handler(
queue_length: queue_length.try_into().unwrap(),
gdpr_accepted,
user: auth.current_user,
latest_text_contents,
},
state.templates.clone(),
)?;

View File

@@ -170,13 +170,13 @@ impl User {
}
pub async fn get_knowledge_entities(
id: &str,
user_id: &str,
db: &SurrealDbClient,
) -> Result<Vec<KnowledgeEntity>, AppError> {
let entities: Vec<KnowledgeEntity> = db
.client
.query("SELECT * FROM knowledge_entity WHERE user_id = $user_id")
.bind(("user_id", id.to_owned()))
.bind(("user_id", user_id.to_owned()))
.await?
.take(0)?;
@@ -184,13 +184,31 @@ impl User {
}
pub async fn get_latest_text_contents(
id: &str,
user_id: &str,
db: &SurrealDbClient,
) -> Result<Vec<TextContent>, AppError> {
let items: Vec<TextContent> = db
.client
.query("SELECT * FROM text_content WHERE user_id = $user_id ORDER BY created_at DESC LIMIT 5")
.bind(("user_id", id.to_owned()))
.query("SELECT * FROM type::table($table_name) WHERE user_id = $user_id ORDER BY created_at DESC LIMIT 5")
.bind(("user_id", user_id.to_owned()))
.bind(("table_name", TextContent::table_name()))
.await?
.take(0)?;
Ok(items)
}
pub async fn get_latest_knowledge_entities(
user_id: &str,
db: &SurrealDbClient,
) -> Result<Vec<KnowledgeEntity>, AppError> {
let items: Vec<KnowledgeEntity> = db
.client
.query(
"SELECT * FROM type::table($table_name) WHERE user_id = $user_id ORDER BY created_at DESC LIMIT 5",
)
.bind(("user_id", user_id.to_owned()))
.bind(("table_name", KnowledgeEntity::table_name()))
.await?
.take(0)?;

View File

@@ -1,13 +1,16 @@
<div class="card bg-base-100 shadow-xl mt-4">
<!-- <div class="mt-4"> -->
<p>{{latest_text_contents}}</p>
<div class="card-body">
<h2 class="card-title">Recently Added Content</h2>
<ul class="list bg-base-100 rounded-box shadow-md">
{% for item in latest_text_contents %}
<li class="list-row">
<div><img class="size-10 rounded-box" src="https://img.daisyui.com/images/profile/demo/1@94.webp" /></div>
<div class="text-2xl text-ellipsis text-nowrap overflow-hidden">
{{item.created_at|datetimeformat(format="short", tz="Europe/Stockholm")}}</div>
<div>
<div>Dio Lupa</div>
<div class="text-xs uppercase font-semibold opacity-60">Remaining Reason</div>
<div>{{item.category}}</div>
<div class="text-xs uppercase font-semibold opacity-60">{{item.text}}</div>
</div>
<button class="btn btn-outline">
Edit
@@ -15,6 +18,7 @@
<button class="btn btn-error">
Delete </button>
</li>
{% endfor %}
</ul>
</div>
</div>