diff --git a/.gitignore b/.gitignore index 3b188827..a6f70900 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ .rustdoc_fingerprint.json config.toml /snapshots -/tantivy \ No newline at end of file +/tantivy +.DS_Store \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 1be5b05c..a7d3997d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -352,9 +352,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cached" @@ -412,9 +412,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" dependencies = [ "jobserver", "libc", @@ -660,12 +660,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1067,9 +1067,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" [[package]] name = "httparse" @@ -1323,9 +1323,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -1360,9 +1360,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jieba-rs" @@ -1379,9 +1379,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d9d414fc817d3e3d62b2598616733f76c4cc74fbac96069674739b881295c8" +checksum = "db69f08d4fb10524cacdb074c10b296299d71274ddbc830a8ee65666867002e9" [[package]] name = "jobserver" @@ -1394,10 +1394,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1421,9 +1422,9 @@ checksum = "0c2cdeb66e45e9f36bfad5bbdb4d2384e70936afbee843c6f6543f0c551ebb25" [[package]] name = "libc" -version = "0.2.164" +version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "libm" @@ -1586,11 +1587,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", @@ -1598,9 +1598,9 @@ dependencies = [ [[package]] name = "mozjpeg" -version = "0.10.10" +version = "0.10.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969e1dbc9af2f18ffe6ddba72bbe86506c7214ecb28670d98ecfba51cb9b8c6b" +checksum = "55571bce4f12d80ceb4296526e7614f796df72daaaac85f265ab732fa47b7bc9" dependencies = [ "arrayvec", "bytemuck", @@ -1944,7 +1944,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls", "socket2", "thiserror 2.0.3", @@ -1962,7 +1962,7 @@ dependencies = [ "getrandom", "rand", "ring", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls", "rustls-pki-types", "slab", @@ -2217,7 +2217,7 @@ dependencies = [ "proc-macro2", "quote", "rinja_parser", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "syn", ] @@ -2264,9 +2264,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustix" @@ -2283,9 +2283,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.18" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "once_cell", "ring", @@ -2485,9 +2485,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2560,9 +2560,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.89" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -3025,9 +3025,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-core", @@ -3035,18 +3035,18 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "once_cell", @@ -3184,9 +3184,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" dependencies = [ "cfg-if", "once_cell", @@ -3195,9 +3195,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" dependencies = [ "bumpalo", "log", @@ -3210,21 +3210,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3232,9 +3233,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" dependencies = [ "proc-macro2", "quote", @@ -3245,15 +3246,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/README.md b/README.md index c6a69201..ffbd1678 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ cd freedit && cargo build -r * generate local documentation: ```bash -cargo doc --no-deps --open +cargo doc --no-deps --document-private-items --open ``` ## Development diff --git a/src/controller/admin.rs b/src/controller/admin.rs index 62080d2e..6187f741 100644 --- a/src/controller/admin.rs +++ b/src/controller/admin.rs @@ -200,10 +200,6 @@ pub(crate) async fn admin_view( let id = u8_slice_to_u32(&v); ones.push(format!("name: {name}, id: {id}")); } - "inns_private" => { - let id = u8_slice_to_u32(&k); - ones.push(format!("id: {id}")); - } "user_solos" => { let uid = u8_slice_to_u32(&k[0..4]); let sid = u8_slice_to_u32(&k[4..8]); @@ -264,7 +260,7 @@ pub(crate) async fn admin_view( let one_fmt = unescape(&format!("{:?}", one)).unwrap(); ones.push(format!("{key}: {one_fmt}")); } - "feed_errs" | "pub_keys" => { + "feed_errs" => { let id = ivec_to_u32(&k); let msg = String::from_utf8_lossy(&v); ones.push(format!("{id}: {msg}")); @@ -280,15 +276,6 @@ pub(crate) async fn admin_view( let one_fmt = unescape(&format!("{:?}", one)).unwrap(); ones.push(format!("{key}: {one_fmt}")); } - "home_pages" => { - let uid = u8_slice_to_u32(&k); - ones.push(format!("{uid}: {}", v[0])); - } - "lang" => { - let uid = u8_slice_to_u32(&k); - let lang = String::from_utf8_lossy(&v); - ones.push(format!("{uid}: {lang}")); - } "tan" => { let id = String::from_utf8_lossy(&k); ones.push(format!("{id}: {:?}", v)); diff --git a/src/controller/fmt.rs b/src/controller/fmt.rs index effea69b..b3f622af 100644 --- a/src/controller/fmt.rs +++ b/src/controller/fmt.rs @@ -50,7 +50,6 @@ const MATHML_TAGS: [&str; 31] = [ /// convert latex and markdown to html. /// Inspired by [cmark-syntax](https://github.com/grego/cmark-syntax/blob/master/src/lib.rs) - // This file is part of cmark-syntax. This program comes with ABSOLUTELY NO WARRANTY; // This is free software, and you are welcome to redistribute it under the // conditions of the GNU General Public License version 3.0. diff --git a/src/controller/inn.rs b/src/controller/inn.rs index 758e4625..b596deff 100644 --- a/src/controller/inn.rs +++ b/src/controller/inn.rs @@ -305,10 +305,6 @@ pub(crate) async fn mod_inn_post( limit_edit_seconds: input.limit_edit_seconds, }; - if InnType::from(inn.inn_type) == InnType::Private { - DB.open_tree("inns_private")?.insert(&iid_ivec, &[])?; - } - set_one(&DB, "inns", iid, &inn)?; inn_names_tree.insert(inn_name_key, iid_ivec)?; @@ -981,10 +977,8 @@ pub(crate) async fn inn( if iid == 0 { index = get_pids_all(&DB, joined_inns, &page_params, is_site_admin)?; } else { - if DB - .open_tree("inns_private")? - .contains_key(u32_to_ivec(iid))? - { + let inn: Inn = get_one(&DB, "inns", iid)?; + if inn.is_private() { if joined_inns.contains(&iid) || is_site_admin { index = get_pids_by_iids(&DB, &[iid], &page_params)?; } diff --git a/src/controller/message.rs b/src/controller/message.rs index 85edb9ea..f479905c 100644 --- a/src/controller/message.rs +++ b/src/controller/message.rs @@ -3,16 +3,19 @@ use axum::{ response::{IntoResponse, Redirect}, Form, }; -use axum_extra::{headers::Cookie, TypedHeader}; +use axum_extra::{ + headers::{Cookie, Referer}, + TypedHeader, +}; use rinja_axum::{into_response, Template}; use serde::Deserialize; -use crate::controller::filters; +use crate::{controller::filters, set_one}; use crate::{controller::fmt::clean_html, error::AppError, DB}; use super::{ db_utils::{get_one, incr_id, u32_to_ivec, u8_slice_to_u32}, - meta_handler::PageData, + meta_handler::{get_referer, PageData}, notification::{add_notification, mark_read, NtType}, Claim, SiteConfig, User, }; @@ -35,27 +38,18 @@ pub(crate) async fn message( let cookie = cookie.ok_or(AppError::NonLogin)?; let site_config = SiteConfig::get(&DB)?; let claim = Claim::get(&DB, &cookie, &site_config).ok_or(AppError::NonLogin)?; - - if DB - .open_tree("pub_keys")? - .get(u32_to_ivec(claim.uid))? - .is_none() - { + let user: User = get_one(&DB, "users", claim.uid)?; + if user.pub_key.is_none() { return Ok(Redirect::to("/key").into_response()); } - let pub_key = DB - .open_tree("pub_keys")? - .get(u32_to_ivec(uid))? - .map(|s| String::from_utf8_lossy(&s).to_string()); - - let title = format!("Sending e2ee Message to {}", uid); - let user: User = get_one(&DB, "users", uid)?; + let rcpt: User = get_one(&DB, "users", uid)?; + let title = format!("Sending e2ee Message to {}", rcpt.username); let page_message = PageMessage { receiver_id: uid, page_data: PageData::new(&title, &site_config, Some(claim), false), - pub_key, + pub_key: rcpt.pub_key, receiver_name: user.username, }; @@ -112,12 +106,8 @@ pub(crate) async fn key( let cookie = cookie.ok_or(AppError::NonLogin)?; let site_config = SiteConfig::get(&DB)?; let claim = Claim::get(&DB, &cookie, &site_config).ok_or(AppError::NonLogin)?; - - let pub_key = DB - .open_tree("pub_keys")? - .get(u32_to_ivec(claim.uid))? - .map(|r| String::from_utf8_lossy(&r).to_string()) - .unwrap_or_default(); + let user: User = get_one(&DB, "users", claim.uid)?; + let pub_key = user.pub_key.unwrap_or_default(); let page_key = PageKey { page_data: PageData::new("Generate Key Pairs", &site_config, Some(claim), false), @@ -136,6 +126,7 @@ pub(crate) struct FormKey { /// `POST /key` pub(crate) async fn key_post( cookie: Option>, + referer: Option>, Form(input): Form, ) -> Result { let cookie = cookie.ok_or(AppError::NonLogin)?; @@ -143,11 +134,16 @@ pub(crate) async fn key_post( let claim = Claim::get(&DB, &cookie, &site_config).ok_or(AppError::NonLogin)?; let pub_key = clean_html(&input.pub_key); - - DB.open_tree("pub_keys")? - .insert(u32_to_ivec(claim.uid), pub_key.as_str())?; - - Ok(Redirect::to("/key")) + let mut user: User = get_one(&DB, "users", claim.uid)?; + user.pub_key = Some(pub_key); + set_one(&DB, "users", claim.uid, &user)?; + + let target = if let Some(referer) = get_referer(referer) { + referer + } else { + format!("/user/{}", claim.uid) + }; + Ok(Redirect::to(&target)) } /// Page data: `inbox.html` diff --git a/src/controller/meta_handler.rs b/src/controller/meta_handler.rs index e87dd139..08dc13d7 100644 --- a/src/controller/meta_handler.rs +++ b/src/controller/meta_handler.rs @@ -1,7 +1,7 @@ use std::sync::LazyLock; -use super::{db_utils::u32_to_ivec, fmt::md2html, Claim, SiteConfig}; -use crate::{controller::filters, error::AppError, DB}; +use super::{fmt::md2html, Claim, SiteConfig, User}; +use crate::{controller::filters, error::AppError, get_one, DB}; use axum::{ http::{HeaderMap, HeaderValue, Uri}, response::{IntoResponse, Redirect, Response}, @@ -71,13 +71,10 @@ pub(crate) async fn home( let mut home_page_code = site_config.home_page; if let Some(claim) = claim { - if let Some(home_page) = DB.open_tree("home_pages")?.get(u32_to_ivec(claim.uid))? { - if let Some(code) = home_page.first() { - home_page_code = *code; - if home_page_code == 1 { - return Ok(Redirect::to(&format!("/feed/{}", claim.uid))); - } - }; + let user: User = get_one(&DB, "users", claim.uid)?; + home_page_code = user.home_page; + if home_page_code == 1 { + return Ok(Redirect::to(&format!("/feed/{}", claim.uid))); } } diff --git a/src/controller/mod.rs b/src/controller/mod.rs index b877f005..d312a199 100644 --- a/src/controller/mod.rs +++ b/src/controller/mod.rs @@ -9,20 +9,14 @@ //! | default | "users_count" | N | //! | "users" | `uid` | [`User`] | //! | "usernames" | `username` | `uid` | -//! | "user_following" | `uid#uid` | `&[]` | -//! | "user_followers" | `uid#uid` | `&[]` | -//! | "user_stats" | `timestamp_uid_type` | N | +//! | "user_following" | `uid#uid` | | +//! | "user_followers" | `uid#uid` | | +//! | "user_stats" | `timestamp#uid#type` | N | //! | "user_uploads" | `uid#img_id` | `image_hash.ext` | //! | default | "imgs_count" | N | -//! | "home_pages" | `uid` | `u8` | -//! | "tan" | `ctype#id` | `&[]` | -//! | "lang" | `uid` | `lang` | -//! -//! ### notification -//! | tree | key | value | -//! |-----------------|-----------------------|-------------------| -//! | default | "notifications_count" | N | -//! | "notifications" | `uid#nid#nt_type` | `id1#id2#is_read` | +//! | "tan" | `ctype#id` | | +//! | default | "notifications_count"| N | +//! | "notifications" | `uid#nid#nt_type` | `id1#id2#is_read` | //! //! ### captcha //! @@ -36,10 +30,10 @@ //! | default | "solos_count" | N | //! | "solos" | `sid` | [`Solo`] | //! | "user_solos" | `uid#sid` | `solo_type` | -//! | "user_solos_like" | `uid#sid` | `&[]` | -//! | "solo_users_like" | `sid#uid` | `&[]` | +//! | "user_solos_like" | `uid#sid` | | +//! | "solo_users_like" | `sid#uid` | | //! | "solo_timeline" | `sid` | `uid#solo_type` | -//! | "hashtags" | `hashtag#sid` | `&[]` | +//! | "hashtags" | `hashtag#sid` | | //! //! ### session //! | tree | key | value | @@ -57,39 +51,38 @@ //! | default | "inns_count" | N | //! | "inns" | `iid` | [`Inn`] | //! | "inn_names" | `inn_name` | `iid` | -//! | "topics" | `topic#iid` | `&[]` | -//! | "mod_inns" | `uid#iid` | `&[]` | -//! | "user_inns" | `uid#iid` | `&[]` | -//! | "inn_apply" | `iid#uid` | `&[]` | +//! | "topics" | `topic#iid` | | +//! | "mod_inns" | `uid#iid` | | +//! | "user_inns" | `uid#iid` | | +//! | "inn_apply" | `iid#uid` | | //! | "inn_users" | `iid#uid` | `&[1/2/3/4/5/8/10]` | -//! | "inns_private" | `iid` | `&[]` | -//! | "drafts" | `uid` | [`FormPost`] | +//! | "drafts" | `uid#title` | [`FormPost`] | //! | "inn_feeds" | `iid#feed_id` | `uid` | -//! | "inn_items" | `iid#item_id` | `&[]` | +//! | "inn_items" | `iid#item_id` | | //! //! ### post //! | tree | key | value | //! |-------------------- |---------------------|----------------------| //! | default | "posts_count" | N | //! | "posts" | `pid` | [`Post`] | -//! | "inn_posts" | `iid#pid` | `&[]` | +//! | "inn_posts" | `iid#pid` | | //! | "user_posts" | `uid#pid` | `iid#inn_type` | -//! | "tags" | `tag#pid` | `&[]` | -//! | "post_upvotes" | `pid#uid` | `&[]` | -//! | "post_downvotes" | `pid#uid` | `&[]` | +//! | "tags" | `tag#pid` | | +//! | "post_upvotes" | `pid#uid` | | +//! | "post_downvotes" | `pid#uid` | | //! | "post_timeline_idx" | `iid#pid` | `timestamp#inn_type` | //! | "post_timeline" | `timestamp#iid#pid` | `inn_type` | //! | "post_pageviews" | `pid` | N | -//! | "post_pins" | `iid#pid` | `&[]` | +//! | "post_pins" | `iid#pid` | | //! //! ### comment //! | tree | key | value | //! |-----------------------|----------------------|-------------| //! | "post_comments_count" | `pid` | N | //! | "post_comments" | `pid#cid` | [`Comment`] | -//! | "user_comments" | `uid#pid#cid` | `&[]` | -//! | "comment_upvotes" | `pid#cid#uid` | `&[]` | -//! | "comment_downvotes" | `pid#cid#uid` | `&[]` | +//! | "user_comments" | `uid#pid#cid` | | +//! | "comment_upvotes" | `pid#cid#uid` | | +//! | "comment_downvotes" | `pid#cid#uid` | | //! //! ### rss //! | tree | key | value | @@ -103,7 +96,7 @@ //! | "feed_links" | `feed_link` | `feed_id` | //! | "item_links" | `item_link` | `item_id` | //! | "items" | `item_id` | [`Item`] | -//! | "read" | `uid#item_id` | `&[]` | +//! | "read" | `uid#item_id` | | //! | "star" | `uid#item_id` | `timestamp` | //! //! ### e2ee message @@ -111,8 +104,7 @@ //! |-----------------------|------------------|--------------------| //! | default | "messages_count" | N | //! | "messages" | `mid` | `#uid#uid#message` | -//! | "pub_keys" | `uid` | `pub_key` | -//! | "user_messages" | `uid#mid` | `&[]` | +//! | "user_message" | `uid#mid` | | pub(super) mod db_utils; pub(super) mod feed; @@ -165,6 +157,9 @@ struct User { role: u8, url: String, about: String, + lang: Option, + home_page: u8, + pub_key: Option, } impl User { @@ -301,6 +296,11 @@ impl Inn { InnType::from(self.inn_type) == InnType::Hidden || InnType::from(self.inn_type) == InnType::PrivateHidden } + + fn is_private(&self) -> bool { + InnType::from(self.inn_type) == InnType::Private + || InnType::from(self.inn_type) == InnType::PrivateHidden + } } #[derive(Encode, Decode, Serialize, PartialEq, PartialOrd, Debug, Clone)] diff --git a/src/controller/user.rs b/src/controller/user.rs index a233920a..33a716c9 100644 --- a/src/controller/user.rs +++ b/src/controller/user.rs @@ -633,11 +633,6 @@ pub(crate) async fn user_setting( } } - let home_page = DB - .open_tree("home_pages")? - .get(u32_to_ivec(claim.uid))? - .map_or(0, |hp| hp[0]); - let has_unread = User::has_unread(&DB, claim.uid)?; let page_user_setting = PageUserSetting { uid: claim.uid, @@ -646,7 +641,7 @@ pub(crate) async fn user_setting( about: user.about, url: user.url, sessions, - home_page, + home_page: user.home_page, }; Ok(into_response(&page_user_setting)) @@ -767,18 +762,16 @@ pub(crate) async fn user_setting_post( user.username = username.to_string(); user.about = clean_html(&input.about); user.url = clean_html(&input.url); - DB.open_tree("home_pages")? - .insert(u32_to_ivec(user.uid), &[input.home_page])?; + user.home_page = input.home_page; - let lang = match input.lang.as_str() { + match input.lang.as_str() { "en" | "zh_cn" | "ja" | "fr" => { claim.update_lang(&DB, &input.lang)?; - &input.lang + user.lang = Some(input.lang.clone()); } - _ => "en", + _ => {} }; - DB.open_tree("lang")?.insert(u32_to_ivec(user.uid), lang)?; set_one(&DB, "users", claim.uid, &user)?; let target = format!("/user/{}", claim.uid); @@ -940,7 +933,7 @@ pub(crate) async fn signup() -> Result { /// Captcha with digits /// -/// From: https://github.com/daniel-e/captcha/blob/master/examples/captcha.rs +/// From: fn captcha_digits() -> Captcha { let mut c = Captcha::new(); c.set_chars(&['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']); @@ -1214,10 +1207,6 @@ impl Claim { let seconds = expire_seconds(expiry); let now = Timestamp::now().as_second(); let session_id = generate_nanoid_ttl(seconds); - let lang = db - .open_tree("lang")? - .get(u32_to_ivec(user.uid))? - .map(|s| String::from_utf8_lossy(&s).to_string()); let claim = Claim { uid: user.uid, @@ -1225,7 +1214,7 @@ impl Claim { role: user.role, last_write: now, session_id: session_id.clone(), - lang, + lang: user.lang, }; set_one_with_key(db, "sessions", &session_id, &claim)?;