111 lines
3.3 KiB
Rust
111 lines
3.3 KiB
Rust
use crate::models::characters::{Character, NewCharacter, StrippedCharacter};
|
|
use crate::models::users::{NewUser, User};
|
|
use crate::schema::characters;
|
|
use diesel::prelude::*;
|
|
use rocket_contrib::databases::diesel;
|
|
|
|
#[database("tenebrous_db")]
|
|
pub(crate) struct TenebrousDbConn(SqliteConnection);
|
|
|
|
#[rocket::async_trait]
|
|
pub(crate) trait Dao {
|
|
async fn load_user_by_id(&self, id: i32) -> QueryResult<Option<User>>;
|
|
|
|
async fn load_user(&self, for_username: String) -> QueryResult<Option<User>>;
|
|
|
|
//async fn insert_user<'a>(&self, new_user: &'a NewUser<'a>) -> QueryResult<User>;
|
|
|
|
async fn insert_user(&self, new_user: NewUser) -> QueryResult<User>;
|
|
|
|
async fn load_character_list(&self, for_user_id: i32) -> QueryResult<Vec<StrippedCharacter>>;
|
|
|
|
async fn load_character(&self, character_id: i32) -> QueryResult<Option<Character>>;
|
|
|
|
//async fn insert_character<'a>(&self, new_character: NewCharacter<'a>) -> QueryResult<()>;
|
|
async fn insert_character(&self, new_character: NewCharacter) -> QueryResult<()>;
|
|
}
|
|
|
|
type StrippedCharacterColumns = (
|
|
characters::id,
|
|
characters::user_id,
|
|
characters::viewable,
|
|
characters::character_name,
|
|
characters::data_type,
|
|
characters::data_version,
|
|
);
|
|
|
|
const STRIPPED_CHARACTER_COLUMNS: StrippedCharacterColumns = (
|
|
characters::id,
|
|
characters::user_id,
|
|
characters::viewable,
|
|
characters::character_name,
|
|
characters::data_type,
|
|
characters::data_version,
|
|
);
|
|
|
|
#[rocket::async_trait]
|
|
impl Dao for TenebrousDbConn {
|
|
async fn load_user_by_id(&self, user_id: i32) -> QueryResult<Option<User>> {
|
|
use crate::schema::users::dsl::*;
|
|
self.run(move |conn| users.filter(id.eq(user_id)).first(conn).optional())
|
|
.await
|
|
}
|
|
|
|
async fn load_user(&self, for_username: String) -> QueryResult<Option<User>> {
|
|
use crate::schema::users::dsl::*;
|
|
|
|
self.run(move |conn| {
|
|
users
|
|
.filter(username.eq(for_username))
|
|
.first(conn)
|
|
.optional()
|
|
})
|
|
.await
|
|
}
|
|
|
|
async fn insert_user(&self, new_user: NewUser) -> QueryResult<User> {
|
|
self.run(move |conn| {
|
|
diesel::insert_into(users).values(&new_user).execute(conn)?;
|
|
|
|
use crate::schema::users::dsl::*;
|
|
users.filter(username.eq(new_user.username)).first(conn)
|
|
})
|
|
.await
|
|
}
|
|
|
|
async fn load_character_list(&self, for_user_id: i32) -> QueryResult<Vec<StrippedCharacter>> {
|
|
use crate::schema::characters::dsl::*;
|
|
|
|
self.run(move |conn| {
|
|
characters
|
|
.filter(user_id.eq(for_user_id))
|
|
.select(STRIPPED_CHARACTER_COLUMNS)
|
|
.load(conn)
|
|
})
|
|
.await
|
|
}
|
|
|
|
async fn load_character(&self, character_id: i32) -> QueryResult<Option<Character>> {
|
|
use crate::schema::characters::dsl::*;
|
|
|
|
self.run(move |conn| {
|
|
characters
|
|
.filter(id.eq(character_id))
|
|
.first(conn)
|
|
.optional()
|
|
})
|
|
.await
|
|
}
|
|
|
|
async fn insert_character(&self, new_character: NewCharacter) -> QueryResult<()> {
|
|
self.run(|conn| {
|
|
diesel::insert_into(characters::table)
|
|
.values(new_character)
|
|
.execute(conn)
|
|
})
|
|
.await?;
|
|
|
|
Ok(())
|
|
}
|
|
}
|