BreweryControlSystem/code/src/database.rs

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(())
}