diff --git a/Cargo.lock b/Cargo.lock index ee384d4..a5cc41d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,7 +86,6 @@ name = "api-lib" version = "0.1.0" dependencies = [ "application", - "diesel", "infrastructure", "mysql", "r2d2", @@ -100,10 +99,10 @@ dependencies = [ name = "application" version = "0.1.0" dependencies = [ - "diesel", + "infrastructure", "mysql", "sea-query", - "sea-query-diesel", + "serde", "shared", ] @@ -194,17 +193,6 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" -[[package]] -name = "bigdecimal" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "bigdecimal" version = "0.4.3" @@ -636,47 +624,6 @@ dependencies = [ "syn 2.0.48", ] -[[package]] -name = "diesel" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559" -dependencies = [ - "bigdecimal 0.3.1", - "bitflags 2.4.1", - "byteorder", - "chrono", - "diesel_derives", - "mysqlclient-sys", - "num-bigint", - "num-integer", - "num-traits", - "percent-encoding", - "r2d2", - "url", -] - -[[package]] -name = "diesel_derives" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d02eecb814ae714ffe61ddc2db2dd03e6c49a42e269b5001355500d431cce0c" -dependencies = [ - "diesel_table_macro_syntax", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "diesel_table_macro_syntax" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" -dependencies = [ - "syn 2.0.48", -] - [[package]] name = "digest" version = "0.10.7" @@ -1116,7 +1063,8 @@ dependencies = [ name = "infrastructure" version = "0.1.0" dependencies = [ - "diesel", + "mysql", + "r2d2", "shared", ] @@ -1399,7 +1347,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ccdc1fe2bb3ef97e07ba4397327ed45509a1e2e499e2f8265243879cbc7313c" dependencies = [ "base64 0.21.7", - "bigdecimal 0.4.3", + "bigdecimal", "bindgen", "bitflags 2.4.1", "bitvec", @@ -1431,16 +1379,6 @@ dependencies = [ "zstd", ] -[[package]] -name = "mysqlclient-sys" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61b381528ba293005c42a409dd73d034508e273bf90481f17ec2e964a6e969b" -dependencies = [ - "pkg-config", - "vcpkg", -] - [[package]] name = "named_pipe" version = "0.4.1" @@ -2103,10 +2041,7 @@ version = "0.30.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4166a1e072292d46dc91f31617c2a1cdaf55a8be4b5c9f4bf2ba248e3ac4999b" dependencies = [ - "bigdecimal 0.3.1", - "chrono", "inherent", - "rust_decimal", "sea-query-derive", ] @@ -2123,19 +2058,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "sea-query-diesel" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a09ac7c3ff2bf910d468c9c8df7fe277322802d13e12d76dabb6a844914f04f6" -dependencies = [ - "bigdecimal 0.3.1", - "chrono", - "diesel", - "rust_decimal", - "sea-query", -] - [[package]] name = "seahash" version = "4.1.0" diff --git a/Cargo.toml b/Cargo.toml index 79b0266..df1437d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,12 +20,5 @@ proc-macro2 = "1.0.78" quote = "1.0.35" syn = { version = "2.0.48", features = ["parsing"] } sea-query = { version = "0.30.7", features = ["backend-mysql"] } -sea-query-diesel = { version = "0.1.0", features = [ - "mysql", - "with-chrono", - "with-rust_decimal", - "with-bigdecimal", -] } r2d2 = "0.8.10" -diesel = { version = "2.1.5", features = ["mysql", "chrono", "r2d2"] } mysql = { version = "25.0.0" } diff --git a/bin/api/src/main.rs b/bin/api/src/main.rs index e1f541d..0c61ebd 100644 --- a/bin/api/src/main.rs +++ b/bin/api/src/main.rs @@ -9,5 +9,5 @@ fn rocket() -> _ { rocket::build() .mount("/api", api_lib::handlers::handlers()) - .manage(mysql::Pool::new("mysql://user:password@localhost:3306/f1db").unwrap()) + .manage(infrastructure::ConnectionPool::try_new().unwrap()) } diff --git a/crates/api/Cargo.toml b/crates/api/Cargo.toml index 7117263..b9589b1 100644 --- a/crates/api/Cargo.toml +++ b/crates/api/Cargo.toml @@ -7,7 +7,6 @@ edition = "2021" [dependencies] rocket.workspace = true -diesel.workspace = true serde.workspace = true r2d2.workspace = true serde_json.workspace = true diff --git a/crates/api/src/circuit.rs b/crates/api/src/circuit.rs index fc2ca9c..b300128 100644 --- a/crates/api/src/circuit.rs +++ b/crates/api/src/circuit.rs @@ -1,28 +1,29 @@ -use diesel::{Connection, RunQueryDsl}; -use mysql::prelude::Queryable; -use mysql::Pool; use rocket::serde::json::Json; use rocket::{get, routes, State}; -use application; +use application::{self, models::Circuits}; use infrastructure::ConnectionPool; use shared::prelude::*; #[get("//circuits?")] pub fn circuits( - db: &State, + db: &State, series: Series, param: shared::parameters::GetCircuitsParameter, -) -> Result<()> { - let mut conn = db.get_conn().unwrap(); +) -> Result>>> { + let conn = &mut db.from_series(series).get().unwrap(); let query = application::circuit::CircuitQueryBuilder::filter(param.into()).build(); - let res: Vec = conn.query(query).unwrap(); + let res = query.query_and_count::(conn); - println!("{:?}", res); + let response = Response { + data: res.0, + pagination: res.1, + series, + }; - Ok(()) + Ok(Json(response)) } pub fn handlers() -> Vec { diff --git a/crates/api/src/lib.rs b/crates/api/src/lib.rs index a3f405b..9765612 100644 --- a/crates/api/src/lib.rs +++ b/crates/api/src/lib.rs @@ -2,8 +2,6 @@ pub mod circuit; -type Backend = diesel::mysql::Mysql; - pub mod handlers { use crate::*; use rocket::Route; diff --git a/crates/application/Cargo.toml b/crates/application/Cargo.toml index 465e725..ef3f3fd 100644 --- a/crates/application/Cargo.toml +++ b/crates/application/Cargo.toml @@ -7,8 +7,8 @@ edition = "2021" [dependencies] sea-query.workspace = true -sea-query-diesel.workspace = true -diesel.workspace = true mysql.workspace = true +serde.workspace = true shared.workspace = true +infrastructure.workspace = true diff --git a/crates/application/src/circuit.rs b/crates/application/src/circuit.rs index 8482b3d..7336ff0 100644 --- a/crates/application/src/circuit.rs +++ b/crates/application/src/circuit.rs @@ -1,8 +1,9 @@ -use diesel::QueryResult; use sea_query::{Expr, Query, SelectStatement}; -use sea_query_diesel::{DieselBinder, SeaQuery}; -use crate::iden::*; +use crate::{ + iden::*, + pagination::{Paginate, Paginated}, +}; use shared::filters::GetCircuitsFilter; pub struct CircuitQueryBuilder { @@ -12,28 +13,40 @@ pub struct CircuitQueryBuilder { impl CircuitQueryBuilder { pub fn filter(filter: GetCircuitsFilter) -> Self { - let mut stmt = Query::select(); - stmt.distinct().from(Circuits::Table).columns( - [ - Circuits::CircuitId, - Circuits::CircuitRef, - Circuits::Name, - Circuits::Location, - Circuits::Country, - Circuits::Lat, - Circuits::Lng, - Circuits::Alt, - Circuits::Url, - ] - .into_iter() - .map(|c| (Circuits::Table, c)), - ); + let stmt = Query::select() + .distinct() + .from(Circuits::Table) + .columns( + [ + Circuits::CircuitId, + Circuits::CircuitRef, + Circuits::Name, + Circuits::Location, + Circuits::Country, + Circuits::Lat, + Circuits::Lng, + Circuits::Alt, + Circuits::Url, + ] + .into_iter() + .map(|c| (Circuits::Table, c)), + ) + .to_owned(); Self { stmt, filter } } - pub fn build(self) -> String { - self.stmt.to_string(sea_query::MysqlQueryBuilder) + pub fn build(self) -> Paginated { + let page: u64 = self.filter.page.unwrap_or_default().0; + let limit: u64 = self.filter.limit.unwrap_or_default().0; + + self.races_table() + .results_table() + .constructors_table() + .drivers_table() + .stmt + .paginate(page) + .per_page(limit) } fn one_of(&self) -> bool { diff --git a/crates/application/src/entities/circuits.rs b/crates/application/src/entities/circuits.rs deleted file mode 100644 index 7c43527..0000000 --- a/crates/application/src/entities/circuits.rs +++ /dev/null @@ -1,27 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "circuits")] -pub struct Model { - #[sea_orm(column_name = "circuitId", primary_key)] - pub circuit_id: i32, - #[sea_orm(column_name = "circuitRef")] - pub circuit_ref: String, - pub name: String, - pub location: Option, - pub country: Option, - #[sea_orm(column_type = "Float", nullable)] - pub lat: Option, - #[sea_orm(column_type = "Float", nullable)] - pub lng: Option, - pub alt: Option, - #[sea_orm(unique)] - pub url: String, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/constructor_results.rs b/crates/application/src/entities/constructor_results.rs deleted file mode 100644 index d9c1110..0000000 --- a/crates/application/src/entities/constructor_results.rs +++ /dev/null @@ -1,22 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "constructorResults")] -pub struct Model { - #[sea_orm(column_name = "constructorResultsId", primary_key)] - pub constructor_results_id: i32, - #[sea_orm(column_name = "raceId")] - pub race_id: i32, - #[sea_orm(column_name = "constructorId")] - pub constructor_id: i32, - #[sea_orm(column_type = "Float", nullable)] - pub points: Option, - pub status: Option, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/constructor_standings.rs b/crates/application/src/entities/constructor_standings.rs deleted file mode 100644 index 06a73bf..0000000 --- a/crates/application/src/entities/constructor_standings.rs +++ /dev/null @@ -1,25 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "constructorStandings")] -pub struct Model { - #[sea_orm(column_name = "constructorStandingsId", primary_key)] - pub constructor_standings_id: i32, - #[sea_orm(column_name = "raceId")] - pub race_id: i32, - #[sea_orm(column_name = "constructorId")] - pub constructor_id: i32, - #[sea_orm(column_type = "Float")] - pub points: f32, - pub position: Option, - #[sea_orm(column_name = "positionText")] - pub position_text: Option, - pub wins: i32, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/constructors.rs b/crates/application/src/entities/constructors.rs deleted file mode 100644 index 24f2f72..0000000 --- a/crates/application/src/entities/constructors.rs +++ /dev/null @@ -1,21 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "constructors")] -pub struct Model { - #[sea_orm(column_name = "constructorId", primary_key)] - pub constructor_id: i32, - #[sea_orm(column_name = "constructorRef")] - pub constructor_ref: String, - #[sea_orm(unique)] - pub name: String, - pub nationality: Option, - pub url: String, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/driver_standings.rs b/crates/application/src/entities/driver_standings.rs deleted file mode 100644 index d55d2d3..0000000 --- a/crates/application/src/entities/driver_standings.rs +++ /dev/null @@ -1,25 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "driverStandings")] -pub struct Model { - #[sea_orm(column_name = "driverStandingsId", primary_key)] - pub driver_standings_id: i32, - #[sea_orm(column_name = "raceId")] - pub race_id: i32, - #[sea_orm(column_name = "driverId")] - pub driver_id: i32, - #[sea_orm(column_type = "Float")] - pub points: f32, - pub position: Option, - #[sea_orm(column_name = "positionText")] - pub position_text: Option, - pub wins: i32, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/drivers.rs b/crates/application/src/entities/drivers.rs deleted file mode 100644 index fb7c216..0000000 --- a/crates/application/src/entities/drivers.rs +++ /dev/null @@ -1,25 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "drivers")] -pub struct Model { - #[sea_orm(column_name = "driverId", primary_key)] - pub driver_id: i32, - #[sea_orm(column_name = "driverRef")] - pub driver_ref: String, - pub number: Option, - pub code: Option, - pub forename: String, - pub surname: String, - pub dob: Option, - pub nationality: Option, - #[sea_orm(unique)] - pub url: String, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/lap_times.rs b/crates/application/src/entities/lap_times.rs deleted file mode 100644 index 8c1eb9d..0000000 --- a/crates/application/src/entities/lap_times.rs +++ /dev/null @@ -1,22 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "lapTimes")] -pub struct Model { - #[sea_orm(column_name = "raceId", primary_key, auto_increment = false)] - pub race_id: i32, - #[sea_orm(column_name = "driverId", primary_key, auto_increment = false)] - pub driver_id: i32, - #[sea_orm(primary_key, auto_increment = false)] - pub lap: i32, - pub position: Option, - pub time: Option, - pub milliseconds: Option, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/mod.rs b/crates/application/src/entities/mod.rs deleted file mode 100644 index 67c810e..0000000 --- a/crates/application/src/entities/mod.rs +++ /dev/null @@ -1,18 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -pub mod prelude; - -pub mod circuits; -pub mod constructor_results; -pub mod constructor_standings; -pub mod constructors; -pub mod driver_standings; -pub mod drivers; -pub mod lap_times; -pub mod pit_stops; -pub mod qualifying; -pub mod races; -pub mod results; -pub mod seasons; -pub mod sprint_results; -pub mod status; diff --git a/crates/application/src/entities/pit_stops.rs b/crates/application/src/entities/pit_stops.rs deleted file mode 100644 index 635a9c1..0000000 --- a/crates/application/src/entities/pit_stops.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "pitStops")] -pub struct Model { - #[sea_orm(column_name = "raceId", primary_key, auto_increment = false)] - pub race_id: i32, - #[sea_orm(column_name = "driverId", primary_key, auto_increment = false)] - pub driver_id: i32, - #[sea_orm(primary_key, auto_increment = false)] - pub stop: i32, - pub lap: i32, - pub time: Time, - pub duration: Option, - pub milliseconds: Option, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/prelude.rs b/crates/application/src/entities/prelude.rs deleted file mode 100644 index 4158d93..0000000 --- a/crates/application/src/entities/prelude.rs +++ /dev/null @@ -1,16 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -pub use super::circuits::Entity as Circuits; -pub use super::constructor_results::Entity as ConstructorResults; -pub use super::constructor_standings::Entity as ConstructorStandings; -pub use super::constructors::Entity as Constructors; -pub use super::driver_standings::Entity as DriverStandings; -pub use super::drivers::Entity as Drivers; -pub use super::lap_times::Entity as LapTimes; -pub use super::pit_stops::Entity as PitStops; -pub use super::qualifying::Entity as Qualifying; -pub use super::races::Entity as Races; -pub use super::results::Entity as Results; -pub use super::seasons::Entity as Seasons; -pub use super::sprint_results::Entity as SprintResults; -pub use super::status::Entity as Status; diff --git a/crates/application/src/entities/qualifying.rs b/crates/application/src/entities/qualifying.rs deleted file mode 100644 index 4e23306..0000000 --- a/crates/application/src/entities/qualifying.rs +++ /dev/null @@ -1,26 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "qualifying")] -pub struct Model { - #[sea_orm(column_name = "qualifyId", primary_key)] - pub qualify_id: i32, - #[sea_orm(column_name = "raceId")] - pub race_id: i32, - #[sea_orm(column_name = "driverId")] - pub driver_id: i32, - #[sea_orm(column_name = "constructorId")] - pub constructor_id: i32, - pub number: i32, - pub position: Option, - pub q1: Option, - pub q2: Option, - pub q3: Option, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/application/src/entities/races.rs b/crates/application/src/entities/races.rs deleted file mode 100644 index 0e17dda..0000000 --- a/crates/application/src/entities/races.rs +++ /dev/null @@ -1,34 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "races")] -pub struct Model { - #[sea_orm(column_name = "raceId", primary_key)] - pub race_id: i32, - pub year: i32, - pub round: i32, - #[sea_orm(column_name = "circuitId")] - pub circuit_id: i32, - pub name: String, - pub date: Date, - pub time: Option