mirror of
https://github.com/perstarkse/minne.git
synced 2026-04-22 08:48:30 +02:00
WIP: recent content
This commit is contained in:
59
Cargo.lock
generated
59
Cargo.lock
generated
@@ -2684,9 +2684,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minijinja"
|
name = "minijinja"
|
||||||
version = "2.5.0"
|
version = "2.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2c37e1b517d1dcd0e51dc36c4567b9d5a29262b3ec8da6cb5d35e27a8fb529b5"
|
checksum = "212b4cab3aad057bc6e611814472905546c533295723b9e26a31c7feb19a8e65"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memo-map",
|
"memo-map",
|
||||||
"self_cell",
|
"self_cell",
|
||||||
@@ -2703,6 +2703,18 @@ dependencies = [
|
|||||||
"notify",
|
"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]]
|
[[package]]
|
||||||
name = "minimal-lexical"
|
name = "minimal-lexical"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
@@ -3092,6 +3104,15 @@ dependencies = [
|
|||||||
"windows-targets",
|
"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]]
|
[[package]]
|
||||||
name = "password-hash"
|
name = "password-hash"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
@@ -4187,6 +4208,18 @@ dependencies = [
|
|||||||
"serde",
|
"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]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.210"
|
version = "1.0.210"
|
||||||
@@ -4877,6 +4910,21 @@ dependencies = [
|
|||||||
"time-core",
|
"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]]
|
[[package]]
|
||||||
name = "tiny-keccak"
|
name = "tiny-keccak"
|
||||||
version = "2.0.2"
|
version = "2.0.2"
|
||||||
@@ -5722,6 +5770,12 @@ dependencies = [
|
|||||||
"tap",
|
"tap",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xml-rs"
|
||||||
|
version = "0.8.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yaml-rust2"
|
name = "yaml-rust2"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
@@ -5847,6 +5901,7 @@ dependencies = [
|
|||||||
"mime_guess",
|
"mime_guess",
|
||||||
"minijinja",
|
"minijinja",
|
||||||
"minijinja-autoreload",
|
"minijinja-autoreload",
|
||||||
|
"minijinja-contrib",
|
||||||
"mockall",
|
"mockall",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"scraper",
|
"scraper",
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ mime = "0.3.17"
|
|||||||
mime_guess = "2.0.5"
|
mime_guess = "2.0.5"
|
||||||
minijinja = { version = "2.5.0", features = ["loader", "multi_template"] }
|
minijinja = { version = "2.5.0", features = ["loader", "multi_template"] }
|
||||||
minijinja-autoreload = "2.5.0"
|
minijinja-autoreload = "2.5.0"
|
||||||
|
minijinja-contrib = { version = "2.6.0", features = ["datetime", "timezone"] }
|
||||||
mockall = "0.13.0"
|
mockall = "0.13.0"
|
||||||
reqwest = {version = "0.12.12", features = ["charset", "json"]}
|
reqwest = {version = "0.12.12", features = ["charset", "json"]}
|
||||||
scraper = "0.22.0"
|
scraper = "0.22.0"
|
||||||
|
|||||||
4542
assets/style.css
4542
assets/style.css
File diff suppressed because one or more lines are too long
@@ -70,6 +70,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
|
|
||||||
notifier.set_fast_reload(true);
|
notifier.set_fast_reload(true);
|
||||||
notifier.watch_path(&template_path, true);
|
notifier.watch_path(&template_path, true);
|
||||||
|
minijinja_contrib::add_to_environment(&mut env);
|
||||||
Ok(env)
|
Ok(env)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -9,13 +9,14 @@ use crate::{
|
|||||||
error::HtmlError,
|
error::HtmlError,
|
||||||
page_data,
|
page_data,
|
||||||
server::{routes::html::render_template, AppState},
|
server::{routes::html::render_template, AppState},
|
||||||
storage::types::user::User,
|
storage::types::{text_content::TextContent, user::User},
|
||||||
};
|
};
|
||||||
|
|
||||||
page_data!(IndexData, "index/index.html", {
|
page_data!(IndexData, "index/index.html", {
|
||||||
gdpr_accepted: bool,
|
gdpr_accepted: bool,
|
||||||
queue_length: u32,
|
queue_length: u32,
|
||||||
user: Option<User>
|
user: Option<User>,
|
||||||
|
latest_text_contents: Vec<TextContent>
|
||||||
});
|
});
|
||||||
|
|
||||||
pub async fn index_handler(
|
pub async fn index_handler(
|
||||||
@@ -37,17 +38,29 @@ pub async fn index_handler(
|
|||||||
false => 0,
|
false => 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
// let latest_text_contents = match auth.current_user.is_some() {
|
let latest_text_contents = match auth.current_user.is_some() {
|
||||||
// true =>
|
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(
|
info!("{:?}", latest_text_contents);
|
||||||
// &auth.current_user.clone().unwrap().id,
|
|
||||||
// &state.surreal_db_client,
|
|
||||||
// )
|
|
||||||
// .await?;
|
|
||||||
|
|
||||||
// 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(
|
let output = render_template(
|
||||||
IndexData::template_name(),
|
IndexData::template_name(),
|
||||||
@@ -55,6 +68,7 @@ pub async fn index_handler(
|
|||||||
queue_length: queue_length.try_into().unwrap(),
|
queue_length: queue_length.try_into().unwrap(),
|
||||||
gdpr_accepted,
|
gdpr_accepted,
|
||||||
user: auth.current_user,
|
user: auth.current_user,
|
||||||
|
latest_text_contents,
|
||||||
},
|
},
|
||||||
state.templates.clone(),
|
state.templates.clone(),
|
||||||
)?;
|
)?;
|
||||||
|
|||||||
@@ -170,13 +170,13 @@ impl User {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_knowledge_entities(
|
pub async fn get_knowledge_entities(
|
||||||
id: &str,
|
user_id: &str,
|
||||||
db: &SurrealDbClient,
|
db: &SurrealDbClient,
|
||||||
) -> Result<Vec<KnowledgeEntity>, AppError> {
|
) -> Result<Vec<KnowledgeEntity>, AppError> {
|
||||||
let entities: Vec<KnowledgeEntity> = db
|
let entities: Vec<KnowledgeEntity> = db
|
||||||
.client
|
.client
|
||||||
.query("SELECT * FROM knowledge_entity WHERE user_id = $user_id")
|
.query("SELECT * FROM knowledge_entity WHERE user_id = $user_id")
|
||||||
.bind(("user_id", id.to_owned()))
|
.bind(("user_id", user_id.to_owned()))
|
||||||
.await?
|
.await?
|
||||||
.take(0)?;
|
.take(0)?;
|
||||||
|
|
||||||
@@ -184,13 +184,31 @@ impl User {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_latest_text_contents(
|
pub async fn get_latest_text_contents(
|
||||||
id: &str,
|
user_id: &str,
|
||||||
db: &SurrealDbClient,
|
db: &SurrealDbClient,
|
||||||
) -> Result<Vec<TextContent>, AppError> {
|
) -> Result<Vec<TextContent>, AppError> {
|
||||||
let items: Vec<TextContent> = db
|
let items: Vec<TextContent> = db
|
||||||
.client
|
.client
|
||||||
.query("SELECT * FROM text_content WHERE user_id = $user_id ORDER BY created_at DESC LIMIT 5")
|
.query("SELECT * FROM type::table($table_name) WHERE user_id = $user_id ORDER BY created_at DESC LIMIT 5")
|
||||||
.bind(("user_id", id.to_owned()))
|
.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?
|
.await?
|
||||||
.take(0)?;
|
.take(0)?;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
<div class="card bg-base-100 shadow-xl mt-4">
|
<div class="card bg-base-100 shadow-xl mt-4">
|
||||||
|
<!-- <div class="mt-4"> -->
|
||||||
|
<p>{{latest_text_contents}}</p>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h2 class="card-title">Recently Added Content</h2>
|
<h2 class="card-title">Recently Added Content</h2>
|
||||||
<ul class="list bg-base-100 rounded-box shadow-md">
|
<ul class="list bg-base-100 rounded-box shadow-md">
|
||||||
|
{% for item in latest_text_contents %}
|
||||||
<li class="list-row">
|
<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>
|
||||||
<div>Dio Lupa</div>
|
<div>{{item.category}}</div>
|
||||||
<div class="text-xs uppercase font-semibold opacity-60">Remaining Reason</div>
|
<div class="text-xs uppercase font-semibold opacity-60">{{item.text}}</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-outline">
|
<button class="btn btn-outline">
|
||||||
Edit
|
Edit
|
||||||
@@ -15,6 +18,7 @@
|
|||||||
<button class="btn btn-error">
|
<button class="btn btn-error">
|
||||||
Delete </button>
|
Delete </button>
|
||||||
</li>
|
</li>
|
||||||
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
Reference in New Issue
Block a user