diff --git a/Dockerfile b/Dockerfile index f708535..feed0db 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.64-bullseye as builder +FROM rust:1-bullseye as builder WORKDIR /usr/src/ RUN cargo new myapp --vcs none WORKDIR /usr/src/myapp diff --git a/src/api/systemlog.rs b/src/api/systemlog.rs index cce18c7..b6dee4c 100644 --- a/src/api/systemlog.rs +++ b/src/api/systemlog.rs @@ -1,4 +1,6 @@ use crate::api::{CurrentUser, JsonApi}; +use crate::cache::cached_user_count; +use crate::db_conn::Db; use crate::random_hasher::RandomHasher; use crate::rds_conn::RdsConn; use crate::rds_models::{get_admin_list, get_candidate_list, Systemlog}; @@ -6,13 +8,19 @@ use rocket::serde::json::{json, Value}; use rocket::State; #[get("/systemlog")] -pub async fn get_systemlog(user: CurrentUser, rh: &State, rconn: RdsConn) -> JsonApi { +pub async fn get_systemlog( + user: CurrentUser, + rh: &State, + db: Db, + mut rconn: RdsConn, +) -> JsonApi { let logs = Systemlog::get_list(&rconn, 50).await?; Ok(json!({ "tmp_token": rh.get_tmp_token(), "salt": look!(rh.salt), "start_time": rh.start_time.timestamp(), + "user_count": cached_user_count(&db, &mut rconn).await?, "custom_title": user.custom_title, "admin_list": get_admin_list(&rconn).await?, "candidate_list": get_candidate_list(&rconn).await?, diff --git a/src/cache.rs b/src/cache.rs index 501e4ee..6d771d2 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -1,4 +1,5 @@ -use crate::api::CurrentUser; +use crate::api::{Api, CurrentUser}; +use crate::db_conn::Db; use crate::models::{Comment, Post, User}; use crate::rds_conn::RdsConn; use crate::rds_models::{clear_all, init, BlockedUsers}; @@ -10,6 +11,9 @@ use futures_util::stream::StreamExt; use rocket::futures::future; use std::collections::HashMap; +const KEY_USER_COUNT: &str = "hole_v2:cache:user_count"; +const USER_COUNT_EXPIRE_TIME: usize = 5 * 60; + const INSTANCE_EXPIRE_TIME: usize = 60 * 60; const MIN_LENGTH: isize = 200; @@ -363,3 +367,16 @@ impl BlockDictCache { self.rconn.del(&self.key).await } } + +pub async fn cached_user_count(db: &Db, rconn: &mut RdsConn) -> Api { + let cnt: Option = rconn.get(KEY_USER_COUNT).await?; + if let Some(x) = cnt { + Ok(x) + } else { + let x = User::get_count(db).await?; + rconn + .set_ex(KEY_USER_COUNT, x, USER_COUNT_EXPIRE_TIME) + .await?; + Ok(x) + } +} diff --git a/src/models.rs b/src/models.rs index 5562362..b9c948a 100644 --- a/src/models.rs +++ b/src/models.rs @@ -450,6 +450,11 @@ impl User { .unwrap(); UserCache::clear_all(rconn).await; } + + pub async fn get_count(db: &Db) -> QueryResult { + db.run(move |c| users::table.count().get_result(with_log!(c))) + .await + } } #[derive(Insertable)]