Works on ingredients
This commit is contained in:
@@ -40,34 +40,52 @@ pub mod recipes {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub mod ingredients {
|
||||
use crate::models::{Ingredient, NewIngredient};
|
||||
use crate::models::{Ingredient, NewIngredient, fields::IngredientId};
|
||||
use super::{SqliteConnection, schema};
|
||||
use super::diesel::prelude::*;
|
||||
|
||||
pub fn find(conn: &SqliteConnection, name: &str) -> Option<Ingredient> {
|
||||
use self::schema::ingredients::dsl::*;
|
||||
|
||||
let results = ingredients.filter(alias.like(name))
|
||||
.limit(1)
|
||||
.load::<Ingredient>(conn)
|
||||
.expect("Error finding ingredient");
|
||||
|
||||
if !results.is_empty() {
|
||||
Some(results.into_iter().nth(0).unwrap())
|
||||
/// Returns the id of the ingredient identifiable by `name: &str`
|
||||
/// If the ingredient does not yet exists, it is inserted in database.
|
||||
pub fn get_id_or_create(conn: &SqliteConnection, name: &str) -> Result<i32,String> {
|
||||
if let Some(ingdt) = find(conn, name) {
|
||||
return Ok(ingdt.id);
|
||||
} else {
|
||||
None
|
||||
return create(conn, name);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create(conn: &SqliteConnection, name: &str) -> usize {
|
||||
use self::schema::ingredients;
|
||||
pub fn get(conn: &SqliteConnection, ingdt_id: &IngredientId) -> Result<Ingredient,String> {
|
||||
use self::schema::ingredients::dsl::*;
|
||||
|
||||
diesel::insert_into(ingredients::table)
|
||||
ingredients.filter(id.eq(ingdt_id))
|
||||
.first::<Ingredient>(conn)
|
||||
.map_err(|e| format!("Could not retrieve : {}", e))
|
||||
}
|
||||
|
||||
fn find(conn: &SqliteConnection, name: &str) -> Option<Ingredient> {
|
||||
use self::schema::ingredients::dsl::*;
|
||||
|
||||
match ingredients.filter(alias.like(name))
|
||||
.first(conn)
|
||||
{
|
||||
Ok(ingdt) => Some(ingdt),
|
||||
Err(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn create(conn: &SqliteConnection, name: &str) -> Result<i32,String> {
|
||||
use self::schema::ingredients::dsl::*;
|
||||
|
||||
let _ = diesel::insert_into(ingredients)
|
||||
.values(&NewIngredient { alias: name })
|
||||
.execute(conn)
|
||||
.expect("Error inserting ingredient")
|
||||
.map_err(|e| format!("Error inserting ingredient ! {:?}", e))?;
|
||||
let inserted = ingredients
|
||||
.order(id.desc())
|
||||
.first::<Ingredient>(conn)
|
||||
.map_err(|e| format!("No ingredient at all ! {:?}", e))?;
|
||||
Ok(inserted.id)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user