diff --git a/resources/templates/base.html b/resources/templates/base.html index 5bff115..16ac26e 100644 --- a/resources/templates/base.html +++ b/resources/templates/base.html @@ -13,6 +13,7 @@ +
+ + diff --git a/resources/templates/overview.html b/resources/templates/overview.html index da7d37b..c087b7f 100644 --- a/resources/templates/overview.html +++ b/resources/templates/overview.html @@ -4,9 +4,22 @@ {% block body %} -overview + + + + + + + + + {%for user in users.content%} + + + + + {% endfor %} + +
Users
ID Name
{{ user.id }} {{ user.name }}
+ -{% for i in [{'a': 90}, 2, 3] %} -lll {{ i }} -{% endfor %} {% endblock %} diff --git a/src/db/_users.rs b/src/db/_users.rs index 891c3ae..31fb4fa 100644 --- a/src/db/_users.rs +++ b/src/db/_users.rs @@ -1,7 +1,8 @@ +use rusqlite::{Connection, params, Result, Row, Transaction}; +use serde::Serialize; + use crate::db::_external_id::{Id, UserId}; use crate::util::{CustomResult, Error}; -use rusqlite::{params, Connection, Result, Row, Transaction}; -use serde::Serialize; #[derive(Debug, Serialize)] pub struct User { @@ -14,6 +15,10 @@ impl User { pub fn id(&self) -> UserId { UserId::from_id(self.id) } + + pub fn get_name(&self) -> String { + self.name.clone() + } } pub fn create_user(tx: &Transaction, name: &String, public_key: &String) -> CustomResult { diff --git a/src/services/_users.rs b/src/services/_users.rs new file mode 100644 index 0000000..c53a3d5 --- /dev/null +++ b/src/services/_users.rs @@ -0,0 +1,52 @@ +use rusqlite::Connection; +use serde::Deserialize; +use serde::Serialize; + +use crate::db::external_id::UserId; +use crate::db::users::{list_users, User}; +use crate::util::CustomResult; + +#[derive(Serialize, Debug)] +pub struct Page where T: Serialize { + total_number_of_page: usize, + current_page_number: usize, + content: Vec, +} + +impl Page where T: Serialize{ + pub fn all_of(data: Vec) -> Page{ + Page{ + total_number_of_page: 0, + current_page_number: 10, + content: data + } + } +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct UserDTO { + name: String, + id: String, // todo: should be of type UserId +} + +impl UserDTO { + fn from_entity(user: &User) -> UserDTO { + return UserDTO { name: user.get_name(), id: user.id().to_string() } + } +} + +pub struct UserService<'a> { + conn: &'a Connection, +} + +impl UserService<'_> { + pub fn new(conn: &Connection) -> UserService { + UserService { conn } + } + + pub fn list_users(self) -> CustomResult> { + let users = list_users(self.conn)?.iter().map(UserDTO::from_entity).collect(); + let ret = Page::all_of(users); + return Ok(ret) + } +} diff --git a/src/services/mod.rs b/src/services/mod.rs index 31a58b4..97b5920 100644 --- a/src/services/mod.rs +++ b/src/services/mod.rs @@ -1 +1,19 @@ +use rusqlite::Connection; + +use crate::services::_users::UserService; + mod _transactions; +mod _users; + +pub struct ServiceFactory<'a> { + conn: &'a Connection, +} + +impl ServiceFactory<'_> { + pub fn new(conn: &Connection) -> ServiceFactory { + ServiceFactory { conn } + } + pub fn get_user_service(&self) -> UserService { + UserService::new(self.conn) + } +} diff --git a/src/webui/views.rs b/src/webui/views.rs index 3d274dc..f17d71b 100644 --- a/src/webui/views.rs +++ b/src/webui/views.rs @@ -5,8 +5,10 @@ use clap::builder::TypedValueParser; use log::info; use minijinja::context; use serde::Deserialize; +use crate::db::users::list_users; use crate::events::Event; +use crate::services::ServiceFactory; use crate::util::SQLiteConnectionFactory; use crate::webui::MiniJinjaRenderer; @@ -21,8 +23,16 @@ pub async fn actions(tmpl_env: MiniJinjaRenderer) -> actix_web::Result actix_web::Result { - tmpl_env.render("overview.html", ()) +pub async fn overview(tmpl_env: MiniJinjaRenderer, + connFactory: web::Data) -> actix_web::Result { + let conn = connFactory.readonly().unwrap(); // todo; to proper 500 + let service_factory = ServiceFactory::new(& conn); + let user_service = service_factory.get_user_service(); + let users = user_service.list_users().unwrap(); + let ctx = context! { + users => users, + }; + tmpl_env.render("overview.html", ctx) } #[actix_web::get("/partials/overview/submit_button")] @@ -42,7 +52,6 @@ pub async fn actions_partials( _req: HttpRequest, tmpl_env: MiniJinjaRenderer, query: web::Query>, - connFactory: web::Data, ) -> actix_web::Result { let event_type = query .get("event_type") diff --git a/src/webui/worker.rs b/src/webui/worker.rs index 36c9b9c..b2e1e4b 100644 --- a/src/webui/worker.rs +++ b/src/webui/worker.rs @@ -27,6 +27,6 @@ pub async fn event_processor_loop(conFact: SQLiteConnectionFactory, pub async fn bob() -> CustomResult<()> { loop { sleep(Duration::from_millis(1000)).await; - println!("100 ms have elapsed"); + // println!("100 ms have elapsed"); } }