affluence/src/db/users.rs

80 lines
2.0 KiB
Rust

use super::schema::users::{self, dsl::*};
use diesel::dsl::Eq;
use diesel::dsl::{AsSelect, Select};
use diesel::helper_types::Filter;
use diesel::prelude::*;
use diesel::sqlite::Sqlite;
use diesel::sqlite::SqliteConnection;
#[derive(Queryable, Selectable, AsChangeset)]
#[diesel(table_name = users)]
pub struct User {
pub id: i32,
pub discord_id: i64,
pub guild_id: i64,
pub email: String,
pub first_name: String,
pub last_name: String,
}
#[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_))
// }
pub fn by_guild_id(guild_id_: i64) -> ByGuild<i64> {
Self::all().filter(guild_id.eq(guild_id_))
}
pub fn get(
conn: &mut SqliteConnection,
guild_id_: i64,
discord_id_: i64,
) -> Result<Option<User>, diesel::result::Error> {
Self::all()
.filter(guild_id.eq(guild_id_))
.filter(discord_id.eq(discord_id_))
.first(conn)
.optional()
}
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)
}
}
impl NewUser {
pub fn insert(&self, conn: &mut SqliteConnection) -> Result<User, diesel::result::Error> {
diesel::insert_into(users::table)
.values(self)
.get_result(conn)
}
}