From 57aea8793d11061b2e0cb737bf62585441717b98 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Sat, 23 Sep 2023 23:14:44 +0100 Subject: [PATCH] Add database module --- src/db/manual.rs | 60 ++++++++++++++++++++ src/db/members.rs | 139 ++++++++++++++++++++++++++++++++++++++++++++++ src/db/mod.rs | 8 +++ src/db/pending.rs | 60 ++++++++++++++++++++ 4 files changed, 267 insertions(+) create mode 100644 src/db/manual.rs create mode 100644 src/db/members.rs create mode 100644 src/db/mod.rs create mode 100644 src/db/pending.rs diff --git a/src/db/manual.rs b/src/db/manual.rs new file mode 100644 index 0000000..b31c953 --- /dev/null +++ b/src/db/manual.rs @@ -0,0 +1,60 @@ +use crate::{Error, ManualMember}; + +/// Get count of entries in manual table +pub(crate) async fn count_manual(pool: &sqlx::PgPool) -> Result { + Ok(sqlx::query!("select count(*) as \"i64!\" from manual") + .fetch_one(pool) + .await? + .i64) +} + +/// Delete manual by Discord ID +pub(crate) async fn delete_manual_by_id(pool: &sqlx::PgPool, id: i64) -> Result { + let r = sqlx::query!("delete from manual where discord_id=$1", id) + .execute(pool) + .await? + .rows_affected(); + Ok(r == 1) +} + +/// Get all entries in manual table +pub(crate) async fn get_all_manual(pool: &sqlx::PgPool) -> Result, Error> { + Ok(sqlx::query_as!(ManualMember, "select * from manual") + .fetch_all(pool) + .await?) +} + +/// Get manual entry by Discord ID +pub(crate) async fn get_manual_by_id( + pool: &sqlx::PgPool, + id: i64, +) -> Result, Error> { + Ok( + sqlx::query_as!(ManualMember, "select * from manual where discord_id=$1", id) + .fetch_optional(pool) + .await?, + ) +} + +/// Add manual entry to manual table +pub(crate) async fn insert_manual(pool: &sqlx::PgPool, m: ManualMember) -> Result<(), Error> { + sqlx::query!( + "insert into manual values ($1,$2,$3,$4,$5)", + m.discord_id, + m.shortcode, + m.nickname, + m.realname, + m.fresher + ) + .execute(pool) + .await?; + Ok(()) +} + +/// Delete all entries in manual table +pub(crate) async fn delete_all_manual(pool: &sqlx::PgPool) -> Result { + Ok(sqlx::query!("delete from manual") + .execute(pool) + .await? + .rows_affected()) +} diff --git a/src/db/members.rs b/src/db/members.rs new file mode 100644 index 0000000..9dc1b0d --- /dev/null +++ b/src/db/members.rs @@ -0,0 +1,139 @@ +use crate::{Error, ManualMember, Member, PendingMember}; + +/// Get count of entries in members table +pub(crate) async fn count_members(pool: &sqlx::PgPool) -> Result { + Ok(sqlx::query!("select count(*) as \"i64!\" from members") + .fetch_one(pool) + .await? + .i64) +} + +/// Delete member by Discord ID +pub(crate) async fn delete_member_by_id(pool: &sqlx::PgPool, id: i64) -> Result { + let r = sqlx::query!("delete from members where discord_id=$1", id) + .execute(pool) + .await? + .rows_affected(); + Ok(r == 1) +} + +/// Get all entries in members table +pub(crate) async fn get_all_members(pool: &sqlx::PgPool) -> Result, Error> { + Ok(sqlx::query_as!(Member, "select * from members") + .fetch_all(pool) + .await?) +} + +/// Get member entry by Discord ID +pub(crate) async fn get_member_by_id( + pool: &sqlx::PgPool, + id: i64, +) -> Result, Error> { + Ok( + sqlx::query_as!(Member, "select * from members where discord_id=$1", id) + .fetch_optional(pool) + .await?, + ) +} + +/// Get member entry by Shortcode +pub(crate) async fn get_member_by_shortcode( + pool: &sqlx::PgPool, + shortcode: &str, +) -> Result, Error> { + Ok(sqlx::query_as!( + Member, + "select * from members where shortcode=$1", + shortcode + ) + .fetch_optional(pool) + .await?) +} + +/// Get member entry by Nickname +pub(crate) async fn get_member_by_nickname( + pool: &sqlx::PgPool, + nickname: &str, +) -> Result, Error> { + Ok( + sqlx::query_as!(Member, "select * from members where nickname=$1", nickname) + .fetch_optional(pool) + .await?, + ) +} + +/// Get member entry by Real Name +pub(crate) async fn get_member_by_realname( + pool: &sqlx::PgPool, + realname: &str, +) -> Result, Error> { + Ok( + sqlx::query_as!(Member, "select * from members where realname=$1", realname) + .fetch_optional(pool) + .await?, + ) +} + +/// Add member entry to members table +pub(crate) async fn insert_member(pool: &sqlx::PgPool, m: Member) -> Result<(), Error> { + sqlx::query!( + "insert into members values ($1, $2, $3, $4, $5)", + m.discord_id, + m.shortcode, + m.nickname, + m.realname, + m.fresher + ) + .execute(pool) + .await?; + Ok(()) +} + +/// Add member entry to members table from pending table +pub(crate) async fn insert_member_from_pending( + pool: &sqlx::PgPool, + id: i64, + nickname: &str, + fresher: bool, +) -> Result<(), Error> { + let p = sqlx::query_as!( + PendingMember, + "delete from pending where discord_id=$1 returning *", + id + ) + .fetch_one(pool) + .await?; + sqlx::query!( + "insert into members values ($1, $2, $3, $4, $5)", + id, + p.shortcode, + nickname, + p.realname, + fresher + ) + .execute(pool) + .await?; + Ok(()) +} + +/// Add member entry to members table from manual table +pub(crate) async fn insert_member_from_manual(pool: &sqlx::PgPool, id: i64) -> Result<(), Error> { + let m = sqlx::query_as!( + ManualMember, + "delete from manual where discord_id=$1 returning *", + id + ) + .fetch_one(pool) + .await?; + sqlx::query!( + "insert into members values ($1, $2, $3, $4, $5)", + id, + m.shortcode, + m.nickname, + m.realname, + m.fresher + ) + .execute(pool) + .await?; + Ok(()) +} diff --git a/src/db/mod.rs b/src/db/mod.rs new file mode 100644 index 0000000..0d25bb8 --- /dev/null +++ b/src/db/mod.rs @@ -0,0 +1,8 @@ +pub(crate) mod members; +pub(crate) use members::*; + +pub(crate) mod pending; +pub(crate) use pending::*; + +pub(crate) mod manual; +pub(crate) use manual::*; diff --git a/src/db/pending.rs b/src/db/pending.rs new file mode 100644 index 0000000..6696580 --- /dev/null +++ b/src/db/pending.rs @@ -0,0 +1,60 @@ +use crate::{Error, PendingMember}; + +/// Get count of entries in pending table +pub(crate) async fn count_pending(pool: &sqlx::PgPool) -> Result { + Ok(sqlx::query!("select count(*) as \"i64!\" from pending") + .fetch_one(pool) + .await? + .i64) +} + +/// Delete pending by Discord ID +pub(crate) async fn delete_pending_by_id(pool: &sqlx::PgPool, id: i64) -> Result { + let r = sqlx::query!("delete from pending where discord_id=$1", id) + .execute(pool) + .await? + .rows_affected(); + Ok(r == 1) +} + +/// Get all entries in pending table +pub(crate) async fn get_all_pending(pool: &sqlx::PgPool) -> Result, Error> { + Ok(sqlx::query_as!(PendingMember, "select * from pending") + .fetch_all(pool) + .await?) +} + +/// Get pending entry by Discord ID +pub(crate) async fn get_pending_by_id( + pool: &sqlx::PgPool, + id: i64, +) -> Result, Error> { + Ok(sqlx::query_as!( + PendingMember, + "select * from pending where discord_id=$1", + id + ) + .fetch_optional(pool) + .await?) +} + +/// Add pending entry to pending table +pub(crate) async fn insert_pending(pool: &sqlx::PgPool, p: PendingMember) -> Result<(), Error> { + sqlx::query!( + "insert into pending values ($1, $2, $3)", + p.discord_id, + p.shortcode, + p.realname + ) + .execute(pool) + .await?; + Ok(()) +} + +/// Delete all entries in pending table +pub(crate) async fn delete_all_pending(pool: &sqlx::PgPool) -> Result { + Ok(sqlx::query!("delete from pending") + .execute(pool) + .await? + .rows_affected()) +}