use diesel::pg::PgConnection;
use diesel::prelude::*;
use indicatif::ProgressBar;
use std::error::Error;
use crate::pg_pool::Pool;
use rayon::prelude::*;
use crate::models::category::{Category, NewCategory};
pub fn populate(pool: &Pool, row_count: u32, bar: &ProgressBar) -> Result<Vec<String>, Box<dyn Error>> {
bar.set_message(&format!("Seeding {} categories", row_count));
let categories: Vec<String> = (0..row_count)
.into_par_iter()
.map(|_| {
let pool = pool.clone();
let conn = pool.get().unwrap();
let title = format!("{}{}{}", fake!(Lorem.word), fake!(Number.between(9, 9999)), fake!(Lorem.word));
create(&conn, &title);
title
})
.collect();
Ok(categories)
}
pub fn get<'a>(conn: &PgConnection, category_title: &'a str) -> Result<Category, diesel::result::Error> {
use crate::schema::categories::dsl::*;
categories.find(category_title).first(conn)
}
pub fn get_all(conn: &PgConnection) -> Result<Vec<Category>, diesel::result::Error> {
use crate::schema::categories::dsl::*;
categories.get_results(conn)
}
pub fn create<'a>(conn: &PgConnection, title: &'a str) -> Category {
use crate::schema::categories;
let new_category = NewCategory { title };
diesel::insert_into(categories::table)
.values(&new_category)
.get_result(conn)
.expect("Error saving new vote")
}
pub fn delete<'a>(conn: &PgConnection, category_title: &'a str) -> Result<(), Box<dyn Error>> {
use crate::schema::categories::dsl::*;
diesel::delete(categories.filter(title.eq(category_title))).execute(conn)?;
Ok(())
}