diff --git a/src/db.rs b/src/db.rs new file mode 100644 index 0000000..d731cc8 --- /dev/null +++ b/src/db.rs @@ -0,0 +1,47 @@ +pub mod models; +pub mod schema; +use crate::Config; + +use self::models::*; + +use diesel::{prelude::*, r2d2::{ConnectionManager, Pool}}; + +pub fn establish_connection(cfg: Config) -> PgConnection { + PgConnection::establish(&cfg.db_url) + .unwrap_or_else(|_| panic!("Error connecting to {}", cfg.db_url)) +} + +#[derive(Clone)] +pub struct DB { + pool: Pool> +} + +impl DB { + pub fn new>(db_url: S) -> Self{ + let mg = diesel::r2d2::ConnectionManager::new(db_url); + let pool = diesel::r2d2::Pool::builder() + .max_size(15) + .build(mg) + .unwrap(); + DB { pool } + } + pub fn make_admin(&mut self, userid: i64) { + use self::schema::users::dsl::*; + let connection = &mut self.pool.get().unwrap(); + diesel::update(users).filter(id.eq(userid)).set(is_admin.eq(true)).execute(connection); + } + + pub fn get_or_init_user(&mut self, userid: i64) -> User { + use self::schema::users::dsl::*; + let connection = &mut self.pool.get().unwrap(); + + let user = users.filter(id.eq(userid)).first::(connection).optional().unwrap(); + + match user { + Some(existing_user) => existing_user, + None => { + diesel::insert_into(users).values((id.eq(userid as i64), is_admin.eq(false))).get_result(connection).unwrap() + } + } + } +} diff --git a/src/db/models.rs b/src/db/models.rs new file mode 100644 index 0000000..a6f7de1 --- /dev/null +++ b/src/db/models.rs @@ -0,0 +1,14 @@ +// Generated by diesel_ext + +#![allow(unused)] +#![allow(clippy::all)] + + +use diesel::prelude::*; +#[derive(Queryable, Debug)] +#[diesel(table_name = users)] +pub struct User { + pub id: i64, + pub is_admin: bool, +} + diff --git a/src/db/schema.rs b/src/db/schema.rs new file mode 100644 index 0000000..de81037 --- /dev/null +++ b/src/db/schema.rs @@ -0,0 +1,8 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + users (id) { + id -> Int8, + is_admin -> Bool, + } +}