add tests; Closes #30

This commit is contained in:
2023-07-31 16:25:07 +02:00
parent bbb78cbc44
commit dc4b4b3499
6 changed files with 253 additions and 44 deletions

View File

@@ -1,21 +1,44 @@
use std::ops::Deref;
use argon2::{password_hash::SaltString, Argon2, PasswordHasher};
use chrono::{Datelike, Local, NaiveDate};
use chrono::{Datelike, Local, NaiveDate, NaiveDateTime};
use log::info;
use rocket::{
async_trait,
form::{self, FromFormField, ValueField},
http::{Cookie, Status},
request::{self, FromRequest, Outcome},
time::{Duration, OffsetDateTime},
Request,
FromForm, Request,
};
use serde::{Deserialize, Serialize};
use sqlx::{FromRow, SqlitePool};
use sqlx::{sqlite::SqliteValueRef, Decode, FromRow, SqlitePool};
use super::{log::Log, tripdetails::TripDetails, Day};
#[derive(FromRow, Debug, Serialize, Deserialize)]
#[derive(Debug, Serialize, Deserialize)]
pub struct MyNaiveDateTime(pub chrono::NaiveDateTime);
impl<'r> Decode<'r, sqlx::Sqlite> for MyNaiveDateTime {
fn decode(value: SqliteValueRef<'r>) -> Result<Self, Box<dyn std::error::Error + Send + Sync>> {
let dt: NaiveDateTime = Decode::decode(value)?;
Ok(MyNaiveDateTime(dt))
}
}
#[rocket::async_trait]
impl<'r> FromFormField<'r> for MyNaiveDateTime {
fn from_value(field: ValueField<'r>) -> form::Result<'r, Self> {
let dt = NaiveDateTime::parse_from_str(field.value, "%Y-%m-%d %H:%M:%S");
match dt {
Ok(parsed_dt) => Ok(MyNaiveDateTime(parsed_dt)),
Err(_) => Err(rocket::form::Error::validation("Invalid date/time format.").into()),
}
}
}
#[derive(FromRow, Debug, Serialize, Deserialize, FromForm)]
pub struct User {
pub id: i64,
pub name: String,
@@ -23,9 +46,8 @@ pub struct User {
pub is_cox: bool,
pub is_admin: bool,
pub is_guest: bool,
#[serde(default = "bool::default")]
pub deleted: bool,
pub last_access: Option<chrono::NaiveDateTime>,
pub last_access: Option<MyNaiveDateTime>,
}
#[derive(Debug)]
@@ -65,8 +87,7 @@ impl User {
}
pub async fn find_by_id(db: &SqlitePool, id: i32) -> Option<Self> {
sqlx::query_as!(
User,
let row = sqlx::query!(
"
SELECT id, name, pw, is_cox, is_admin, is_guest, deleted, last_access
FROM user
@@ -76,12 +97,22 @@ WHERE id like ?
)
.fetch_one(db)
.await
.ok()
.ok()?;
Some(User {
id: row.id,
name: row.name,
pw: row.pw,
is_cox: row.is_cox,
is_admin: row.is_admin,
is_guest: row.is_guest,
deleted: row.deleted,
last_access: row.last_access.map(MyNaiveDateTime),
})
}
pub async fn find_by_name(db: &SqlitePool, name: &str) -> Option<Self> {
sqlx::query_as!(
User,
let row = sqlx::query!(
"
SELECT id, name, pw, is_cox, is_admin, is_guest, deleted, last_access
FROM user
@@ -91,7 +122,18 @@ WHERE name like ?
)
.fetch_one(db)
.await
.ok()
.ok()?;
Some(User {
id: row.id,
name: row.name,
pw: row.pw,
is_cox: row.is_cox,
is_admin: row.is_admin,
is_guest: row.is_guest,
deleted: row.deleted,
last_access: row.last_access.map(MyNaiveDateTime),
})
}
pub async fn on_water(&self, db: &SqlitePool) -> bool {
@@ -122,8 +164,7 @@ WHERE name like ?
}
pub async fn all(db: &SqlitePool) -> Vec<Self> {
sqlx::query_as!(
User,
sqlx::query!(
"
SELECT id, name, pw, is_cox, is_admin, is_guest, deleted, last_access
FROM user
@@ -133,12 +174,23 @@ ORDER BY last_access DESC
)
.fetch_all(db)
.await
.unwrap() //TODO: fixme
.unwrap()
.into_iter()
.map(|row| User {
id: row.id,
name: row.name,
pw: row.pw,
is_cox: row.is_cox,
is_admin: row.is_admin,
is_guest: row.is_guest,
deleted: row.deleted,
last_access: row.last_access.map(MyNaiveDateTime),
})
.collect()
}
pub async fn cox(db: &SqlitePool) -> Vec<Self> {
sqlx::query_as!(
User,
sqlx::query!(
"
SELECT id, name, pw, is_cox, is_admin, is_guest, deleted, last_access
FROM user
@@ -148,7 +200,19 @@ ORDER BY last_access DESC
)
.fetch_all(db)
.await
.unwrap() //TODO: fixme
.unwrap()
.into_iter()
.map(|row| User {
id: row.id,
name: row.name,
pw: row.pw,
is_cox: row.is_cox,
is_admin: row.is_admin,
is_guest: row.is_guest,
deleted: row.deleted,
last_access: row.last_access.map(MyNaiveDateTime),
})
.collect()
}
pub async fn create(db: &SqlitePool, name: &str, is_guest: bool) -> bool {