103 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
use std::ops::DerefMut;
 | 
						|
 | 
						|
use serde::{Deserialize, Serialize};
 | 
						|
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
 | 
						|
 | 
						|
use super::{logbook::Logbook, user::User};
 | 
						|
 | 
						|
#[derive(FromRow, Debug, Serialize, Deserialize)]
 | 
						|
pub struct Rower {
 | 
						|
    pub logbook_id: i64,
 | 
						|
    pub rower_id: i64,
 | 
						|
}
 | 
						|
 | 
						|
impl Rower {
 | 
						|
    pub async fn for_log(db: &SqlitePool, log: &Logbook) -> Vec<User> {
 | 
						|
        let mut tx = db.begin().await.unwrap();
 | 
						|
        let ret = Self::for_log_tx(&mut tx, log).await;
 | 
						|
        tx.commit().await.unwrap();
 | 
						|
        ret
 | 
						|
    }
 | 
						|
 | 
						|
    pub async fn for_log_tx(db: &mut Transaction<'_, Sqlite>, log: &Logbook) -> Vec<User> {
 | 
						|
        sqlx::query_as!(
 | 
						|
            User,
 | 
						|
            "
 | 
						|
SELECT id, name, pw, deleted, last_access, dob, weight, sex, member_since_date, birthdate, mail, nickname, phone, address, family_id, user_token
 | 
						|
FROM user
 | 
						|
WHERE id in (SELECT rower_id FROM rower WHERE logbook_id=?)
 | 
						|
        ",
 | 
						|
            log.id
 | 
						|
        )
 | 
						|
        .fetch_all(db.deref_mut())
 | 
						|
        .await
 | 
						|
        .unwrap()
 | 
						|
    }
 | 
						|
 | 
						|
    pub async fn create(
 | 
						|
        db: &mut Transaction<'_, Sqlite>,
 | 
						|
        logbook_id: i64,
 | 
						|
        rower_id: i64,
 | 
						|
    ) -> Result<(), String> {
 | 
						|
        //TODO: Check if rower is allowed to row
 | 
						|
 | 
						|
        sqlx::query!(
 | 
						|
            "INSERT INTO rower(logbook_id, rower_id) VALUES (?,?);",
 | 
						|
            logbook_id,
 | 
						|
            rower_id
 | 
						|
        )
 | 
						|
        .execute(db.deref_mut())
 | 
						|
        .await
 | 
						|
        .map_err(|e| e.to_string())?;
 | 
						|
 | 
						|
        Ok(())
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#[cfg(test)]
 | 
						|
mod test {
 | 
						|
    use sqlx::SqlitePool;
 | 
						|
 | 
						|
    use super::Logbook;
 | 
						|
    use crate::model::{rower::Rower, user::User};
 | 
						|
    use crate::testdb;
 | 
						|
 | 
						|
    #[sqlx::test]
 | 
						|
    fn test_for_log() {
 | 
						|
        let pool = testdb!();
 | 
						|
 | 
						|
        let logbook = Logbook::find_by_id(&pool, 3).await.unwrap();
 | 
						|
        let rowers = Rower::for_log(&pool, &logbook).await;
 | 
						|
        let expected = User::find_by_id(&pool, 3).await.unwrap();
 | 
						|
        assert_eq!(rowers, vec![expected]);
 | 
						|
    }
 | 
						|
 | 
						|
    #[sqlx::test]
 | 
						|
    fn test_for_log_none() {
 | 
						|
        let pool = testdb!();
 | 
						|
 | 
						|
        let logbook = Logbook::find_by_id(&pool, 2).await.unwrap();
 | 
						|
        let rowers = Rower::for_log(&pool, &logbook).await;
 | 
						|
        assert_eq!(rowers, vec![]);
 | 
						|
    }
 | 
						|
 | 
						|
    #[sqlx::test]
 | 
						|
    fn test_create() {
 | 
						|
        let pool = testdb!();
 | 
						|
 | 
						|
        let logbook = Logbook::find_by_id(&pool, 3).await.unwrap();
 | 
						|
 | 
						|
        let mut tx = pool.begin().await.unwrap();
 | 
						|
        Rower::create(&mut tx, logbook.id, 2).await.unwrap();
 | 
						|
        tx.commit().await.unwrap();
 | 
						|
        let rowers = Rower::for_log(&pool, &logbook).await;
 | 
						|
        assert_eq!(
 | 
						|
            rowers,
 | 
						|
            vec![
 | 
						|
                User::find_by_id(&pool, 2).await.unwrap(),
 | 
						|
                User::find_by_id(&pool, 3).await.unwrap()
 | 
						|
            ]
 | 
						|
        );
 | 
						|
    }
 | 
						|
}
 |