affluence/src/db/users.rs

80 lines
2.0 KiB
Rust
Raw Permalink Normal View History

2023-05-16 15:47:13 +02:00
use super::schema::users::{self, dsl::*};
use diesel::dsl::Eq;
2023-05-16 16:25:33 +02:00
use diesel::dsl::{AsSelect, Select};
2023-05-16 15:47:13 +02:00
use diesel::helper_types::Filter;
2023-05-16 16:25:33 +02:00
use diesel::prelude::*;
use diesel::sqlite::Sqlite;
use diesel::sqlite::SqliteConnection;
2023-05-15 17:38:13 +02:00
2023-05-16 16:52:59 +02:00
#[derive(Queryable, Selectable, AsChangeset)]
2023-05-16 15:47:13 +02:00
#[diesel(table_name = users)]
2023-05-15 17:38:13 +02:00
pub struct User {
2023-05-16 15:47:13 +02:00
pub id: i32,
2023-05-15 17:38:13 +02:00
pub discord_id: i64,
2023-05-16 15:47:13 +02:00
pub guild_id: i64,
2023-05-15 17:38:13 +02:00
pub email: String,
pub first_name: String,
pub last_name: String,
}
2023-05-16 15:47:13 +02:00
#[derive(Insertable)]
#[diesel(table_name = users)]
pub struct NewUser {
pub discord_id: i64,
pub guild_id: i64,
pub email: String,
pub first_name: String,
pub last_name: String,
}
type All = Select<users::table, AsSelect<User, Sqlite>>;
type WithGuild<T> = Eq<guild_id, T>;
type ByGuild<T> = Filter<All, WithGuild<T>>;
impl User {
pub fn all() -> All {
users::table.select(User::as_select())
}
// pub fn by_guild<T>(guild_id_: T) -> ByGuild<T>
// where T: AsExpression<BigInt>
// {
// Self::all().filter(guild_id.eq(guild_id_))
// }
2023-05-16 16:25:33 +02:00
pub fn by_guild_id(guild_id_: i64) -> ByGuild<i64> {
2023-05-16 15:47:13 +02:00
Self::all().filter(guild_id.eq(guild_id_))
}
2023-05-16 16:25:33 +02:00
pub fn get(
conn: &mut SqliteConnection,
guild_id_: i64,
discord_id_: i64,
2023-05-16 16:52:59 +02:00
) -> Result<Option<User>, diesel::result::Error> {
2023-05-16 16:25:33 +02:00
Self::all()
.filter(guild_id.eq(guild_id_))
.filter(discord_id.eq(discord_id_))
.first(conn)
2023-05-16 16:52:59 +02:00
.optional()
2023-05-16 15:47:13 +02:00
}
2023-05-16 16:52:59 +02:00
pub fn get_by_id(
conn: &mut SqliteConnection,
id_: i32,
) -> Result<Option<User>, diesel::result::Error> {
Self::all().find(id_).first(conn).optional()
}
pub fn update(&self, conn: &mut SqliteConnection) -> Result<usize, diesel::result::Error> {
diesel::update(users::table).set(self).execute(conn)
2023-05-16 15:47:13 +02:00
}
2023-05-15 17:38:13 +02:00
}
2023-05-16 15:47:13 +02:00
impl NewUser {
2023-05-16 16:52:59 +02:00
pub fn insert(&self, conn: &mut SqliteConnection) -> Result<User, diesel::result::Error> {
2023-05-16 15:47:13 +02:00
diesel::insert_into(users::table)
.values(self)
.get_result(conn)
}
2023-05-15 17:38:13 +02:00
}