85 lines
3.2 KiB
Rust
85 lines
3.2 KiB
Rust
use sqlx::mysql::MySqlPoolOptions;
|
|
use sqlx::mysql::MySqlPool;
|
|
|
|
|
|
use dotenvy::dotenv_override;
|
|
use std::env;
|
|
// use crate::schema::equipment::dsl::*;
|
|
// use crate::schema::worker::dsl::*;
|
|
use crate::models::*;
|
|
|
|
pub struct DBOperator{
|
|
pool: MySqlPool,
|
|
}
|
|
impl DBOperator{
|
|
pub async fn new() -> Self{
|
|
dotenv_override().ok();
|
|
let db_url = env::var("DATABASE_URL").expect("DATABASE_URL установи!");
|
|
Self{pool: MySqlPool::connect(&db_url).await.unwrap()}
|
|
|
|
}
|
|
pub async fn get_position(&self) -> Result<Vec<Position>, sqlx::Error>{
|
|
let rets: Vec<Position> = sqlx::query_as:: <_, Position>("SELECT * FROM `position`").fetch_all(&self.pool).await?;
|
|
Ok(rets)
|
|
}
|
|
pub async fn get_workers(&self) -> Result<Vec<Worker>, sqlx::Error>{
|
|
let pre_rets: Vec<WorkerRow> = sqlx::query_as::<_, WorkerRow>("SELECT * FROM `worker`").fetch_all(&self.pool).await?;
|
|
let mut rets:Vec<Worker> = Vec::new();
|
|
let pos = self.get_position().await.unwrap();
|
|
for worker in pre_rets{
|
|
let mut ppos = Position::default();
|
|
for position in pos.clone(){
|
|
if position.id == worker.position_id{
|
|
ppos = position.clone();
|
|
break;
|
|
}
|
|
}
|
|
rets.push(Worker{ id: worker.id, full_name: worker.full_name, hire_date: worker.hire_date, position: ppos, is_fired: worker.is_fired });
|
|
}
|
|
Ok(rets)
|
|
}
|
|
pub async fn get_equipment(&self) -> Result<Vec<Equipment>,sqlx::Error>{
|
|
let pre_rets = sqlx::query_as::<_, EquipmentRow>("SELECT * FROM `equipment`").fetch_all(&self.pool).await?;
|
|
let mut rets: Vec<Equipment> = Vec::new();
|
|
let workers = self.get_workers().await?;
|
|
for eq in pre_rets{
|
|
let mut pworker = Worker::default();
|
|
for worker in workers.clone(){
|
|
if worker.id == eq.worker_id{
|
|
pworker = worker.clone();
|
|
break;
|
|
}
|
|
}
|
|
rets.push(Equipment { id: eq.id, name: eq.name, inv_number: eq.inv_number, maintenance_date: eq.maintenance_date, worker: pworker });
|
|
}
|
|
Ok(rets)
|
|
}
|
|
pub async fn check_worker(&self, worker: Worker) -> Result<bool, sqlx::Error>{
|
|
let ret = sqlx::query(&format!("SELECT * FROM `worker` WHERE full_name = {}, position_id = {}, hire_date = {}", worker.full_name, worker.position.id, worker.hire_date.to_string())).fetch_all(&self.pool).await?;
|
|
if ret.len() > 0{
|
|
return Ok(true)
|
|
}
|
|
Ok(false)
|
|
}
|
|
pub async fn add_worker(&self, worker: Worker){
|
|
match sqlx::query!("INSERT INTO Brewery.worker (id, position_id, hire_date, is_fired, full_name) VALUES(0, ?, ?, ?, ?);",worker.position.id, worker.hire_date ,worker.is_fired,worker.full_name).fetch(&self.pool).{
|
|
Ok(_) =>{
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub async fn estabilish_connection() -> Result<(), sqlx::Error>{
|
|
dotenv_override().ok();
|
|
let db_url = env::var("DATABASE_URL").expect("DATABASE_URL установи!");
|
|
let pool = MySqlPoolOptions::new()
|
|
.max_connections(5)
|
|
.connect(&db_url).await?;
|
|
|
|
Ok(())
|
|
} |