diff --git a/queries/admin/flist_stats.sql b/queries/admin/flist_stats.sql new file mode 100644 index 0000000..fd99244 --- /dev/null +++ b/queries/admin/flist_stats.sql @@ -0,0 +1,12 @@ +SELECT + COALESCE( + ( + SELECT + count(*) + FROM + flist_file + WHERE + discovered_at > current_timestamp - interval '24 hours' + ), + 0 + ) "recent_posts!"; diff --git a/queries/admin/reddit_stats.sql b/queries/admin/reddit_stats.sql new file mode 100644 index 0000000..4756deb --- /dev/null +++ b/queries/admin/reddit_stats.sql @@ -0,0 +1,12 @@ +SELECT + COALESCE( + ( + SELECT + count(*) + FROM + reddit_post + WHERE + posted_at > current_timestamp - interval '24 hours' + ), + 0 + ) "recent_posts!"; diff --git a/sqlx-data.json b/sqlx-data.json index b87468a..806b5d9 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -1128,6 +1128,24 @@ }, "query": "SELECT\n id \"id!\",\n owner_id \"owner_id!\",\n perceptual_hash,\n sha256_hash \"sha256_hash!: Sha256Hash\",\n last_modified \"last_modified!\",\n content_url,\n content_size,\n thumb_url,\n event_count \"event_count!\",\n last_event,\n accounts \"accounts: sqlx::types::Json>\"\nFROM\n owned_media_item_accounts\nWHERE\n owner_id = $1\n AND (\n $4::uuid IS NULL\n OR exists(\n SELECT\n 1\n FROM\n owned_media_item_account\n WHERE\n owned_media_item_account.owned_media_item_id = owned_media_item_accounts.id\n AND account_id = $4\n )\n )\nORDER BY\n event_count DESC,\n last_modified DESC\nLIMIT\n $2 OFFSET ($3::integer * $2::integer);\n" }, + "3e28bd747546206ba02f572b3f145a24096d29e247137a2f4b72579f57839239": { + "describe": { + "columns": [ + { + "name": "recent_posts!", + "ordinal": 0, + "type_info": "Int8" + } + ], + "nullable": [ + null + ], + "parameters": { + "Left": [] + } + }, + "query": "SELECT\n COALESCE(\n (\n SELECT\n count(*)\n FROM\n reddit_post\n WHERE\n posted_at > current_timestamp - interval '24 hours'\n ),\n 0\n ) \"recent_posts!\";\n" + }, "3f091fdddbee429487163837c17f18b8139e3c2bee1d43168d936018169d868f": { "describe": { "columns": [ @@ -3062,6 +3080,24 @@ }, "query": "SELECT\n *\nFROM\n user_account\nWHERE\n telegram_id = $1;\n" }, + "b7554449d0a2aa49a51187e25d42f14fd9f684cb49937247338db7b95dd38642": { + "describe": { + "columns": [ + { + "name": "recent_posts!", + "ordinal": 0, + "type_info": "Int8" + } + ], + "nullable": [ + null + ], + "parameters": { + "Left": [] + } + }, + "query": "SELECT\n COALESCE(\n (\n SELECT\n count(*)\n FROM\n flist_file\n WHERE\n discovered_at > current_timestamp - interval '24 hours'\n ),\n 0\n ) \"recent_posts!\";\n" + }, "b8946dfef01780773713136e31594b2347be98536da6e066ed49378f88b11e13": { "describe": { "columns": [], diff --git a/src/admin.rs b/src/admin.rs index 4b5e0d5..7434acb 100644 --- a/src/admin.rs +++ b/src/admin.rs @@ -4,6 +4,7 @@ use actix_web::{get, post, services, web, HttpResponse, Scope}; use askama::Template; use async_trait::async_trait; use foxlib::jobs::{FaktoryProducer, JobQueue}; +use futures::TryFutureExt; use rand::Rng; use serde::Deserialize; use sha2::{Digest, Sha256}; @@ -126,6 +127,8 @@ async fn admin_inject( #[derive(Template)] #[template(path = "admin/sites/reddit.html")] struct AdminReddit { + active_subreddits: usize, + added_posts: i64, subreddits: Vec, } @@ -139,12 +142,23 @@ async fn admin_sites_reddit( return Err(actix_web::error::ErrorUnauthorized("Unauthorized").into()); } - let subreddits = models::RedditSubreddit::subreddits(&conn).await?; + let (subreddits, stats) = futures::try_join!( + models::RedditSubreddit::subreddits(&conn), + sqlx::query_file!("queries/admin/reddit_stats.sql") + .fetch_one(&**conn) + .map_err(Error::from) + )?; - let body = AdminReddit { subreddits } - .wrap_admin(&request, &user) - .await - .render()?; + let active_subreddits = subreddits.iter().filter(|s| !s.disabled).count(); + + let body = AdminReddit { + active_subreddits, + added_posts: stats.recent_posts, + subreddits, + } + .wrap_admin(&request, &user) + .await + .render()?; Ok(HttpResponse::Ok().content_type("text/html").body(body)) } @@ -152,6 +166,7 @@ async fn admin_sites_reddit( #[derive(Template)] #[template(path = "admin/sites/flist.html")] struct AdminFlist { + added_posts: i64, recent_flist_runs: Vec, } @@ -165,12 +180,20 @@ async fn admin_sites_flist( return Err(actix_web::error::ErrorUnauthorized("Unauthorized").into()); } - let recent_flist_runs = models::FListImportRun::recent_runs(&conn).await?; + let (recent_flist_runs, stats) = futures::try_join!( + models::FListImportRun::recent_runs(&conn), + sqlx::query_file!("queries/admin/flist_stats.sql") + .fetch_one(&**conn) + .map_err(Error::from) + )?; - let body = AdminFlist { recent_flist_runs } - .wrap_admin(&request, &user) - .await - .render()?; + let body = AdminFlist { + added_posts: stats.recent_posts, + recent_flist_runs, + } + .wrap_admin(&request, &user) + .await + .render()?; Ok(HttpResponse::Ok().content_type("text/html").body(body)) } diff --git a/templates/admin/overview.html b/templates/admin/overview.html index 78d6415..6413f3a 100644 --- a/templates/admin/overview.html +++ b/templates/admin/overview.html @@ -9,7 +9,7 @@
-

Last 24 hr Sessions

+

24 hr Sessions

{{ recent_users }}

@@ -30,7 +30,7 @@
-

Last 24 hr Media

+

24 hr Media

{{ recent_media }}

diff --git a/templates/admin/sites/flist.html b/templates/admin/sites/flist.html index 5985e54..2076d1c 100644 --- a/templates/admin/sites/flist.html +++ b/templates/admin/sites/flist.html @@ -1,5 +1,26 @@
-

F-List Import Runs

+
+
+
+

Last Import

+ {% match recent_flist_runs.first() %} + {% when Some with (import_run) %} +

+ {{ import_run.started_at }} +

+ {% else %} +

Never

+ {% endmatch %} +
+
+ +
+
+

24 hr Posts

+

{{ added_posts }}

+
+
+
diff --git a/templates/admin/sites/reddit.html b/templates/admin/sites/reddit.html index be37dfd..a1fc41c 100644 --- a/templates/admin/sites/reddit.html +++ b/templates/admin/sites/reddit.html @@ -1,6 +1,20 @@
-

Monitored Subreddits

+
+
+
+

Monitored Subreddits

+

{{ active_subreddits }}

+
+
+ +
+
+

24 hr Posts

+

{{ added_posts }}

+
+
+