From 562377d6e2e110bbce29c9963fb25ca6a5395a7b Mon Sep 17 00:00:00 2001 From: shockrah Date: Tue, 3 Nov 2020 23:37:14 -0800 Subject: [PATCH] 1st pass implementation of the new .filter implementation ! Totally untested so far and WILL have to go through a battery of tests before I'm confident with this --- server-api/db/src/member.rs | 46 +++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/server-api/db/src/member.rs b/server-api/db/src/member.rs index bb443a9..617163e 100644 --- a/server-api/db/src/member.rs +++ b/server-api/db/src/member.rs @@ -9,7 +9,6 @@ use crate::{UBigInt, BigInt, Integer, VarChar}; use crate::common::{FromDB}; -#[allow(dead_code)] // only because some fields are read by the user pub struct Member { pub id: UBigInt, pub secret: VarChar, @@ -19,6 +18,11 @@ pub struct Member { pub permissions: UBigInt, } + +pub const STATUS_ONLINE: Integer = 0; +pub const STATUS_OFFLINE: Integer = 1; +pub const STATUS_AWAY: Integer = 2; +pub const STATUS_DO_NOT_DISTURB: Integer = 3; /* * * conn = getconn @@ -27,7 +31,7 @@ pub struct Member { * */ #[async_trait] -impl FromDB for Member { +impl FromDB for Member { type Row = Option<(VarChar, VarChar, BigInt, Integer, UBigInt)>; async fn get(p: &Pool, id: UBigInt) -> Response { @@ -108,4 +112,42 @@ impl FromDB for Member { return Response::Empty; } + + async fn filter(p: &Pool, status: Integer) -> Response { + //! @params status + return match (p.get_conn().await, status) { + (Ok(conn), STATUS_ONLINE) | (Ok(conn), STATUS_OFFLINE) | + (Ok(conn), STATUS_AWAY) | (Ok(conn), STATUS_DO_NOT_DISTURB) => { + // TODO: Allow people to query somewhere in the middle of this set + // i.e. we should be able to get user 100 -> 150 instead of just the + // first 1000 people + let q = + "SELECT id, name, status, permissions FROM memebrs + WHERE status = :stat LIMIT 1000"; // high limit for now + if let Ok(query) = conn.prep_exec(q, params!{"stat" => status}).await { + let mapping_r = query.map_and_drop(|row| { + let (id, name, status, permissions): (UBigInt, VarChar, Integer, UBigInt) = + mysql_async::from_row(row); + + Member { + id: id, + secret: "".into(), // no show for obv reasons + name: name, + joindate: 0, // doesn't matter + status: status, + permissions: permissions + } + }).await; + match mapping_r { + Ok((_, members)) => Response::Set(members), + Err(_) => Response::Other(sql_err!("db::Members::filter")) + } + } + else { + Response::Other(sql_err!("db::Members::filter")) + } + } + _ => Response::Other(sql_err!("err")) + } + } }