diff --git a/Cargo.lock b/Cargo.lock index 23e690d2ae..ead17cf6ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -182,6 +182,7 @@ dependencies = [ "diesel", "diesel-derive-newtype", "diesel_json", + "diesel_migrations", "domain", "dotenv", "envtestkit", @@ -5088,6 +5089,7 @@ name = "testing" version = "0.1.0" dependencies = [ "anyhow", + "diesel_migrations", "domain", "infrastructure", "lapin", diff --git a/api/Cargo.toml b/api/Cargo.toml index 4fa99a4246..146618d3a7 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -25,6 +25,7 @@ diesel = { version = "2.1.0", default-features = false, features = [ "uuid", "chrono", ] } +diesel_migrations = "2.1.0" diesel-derive-newtype = "2.1.0" diesel_json = "0.2.0" uuid = { version = "1.3.3", default_features = false, features = [ diff --git a/api/src/presentation/http/bootstrap.rs b/api/src/presentation/http/bootstrap.rs index 57678811f3..35c0c26461 100644 --- a/api/src/presentation/http/bootstrap.rs +++ b/api/src/presentation/http/bootstrap.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use anyhow::Result; +use diesel_migrations::{embed_migrations, EmbeddedMigrations}; use domain::{AggregateRepository, CompositePublisher, EventPublisher}; use infrastructure::{amqp, dbclient, event_bus::EXCHANGE_NAME, github}; use rocket::{Build, Rocket}; @@ -12,12 +13,14 @@ use crate::{ Config, }; +pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!("../migrations"); + pub async fn bootstrap(config: Config) -> Result> { info!("Bootstrapping api http server"); let database = Arc::new(dbclient::Client::new(dbclient::init_pool( config.database.clone(), )?)); - database.run_migrations()?; + database.run_migrations(MIGRATIONS)?; let github_api_client: Arc = github::RoundRobinClient::new(config.github_api_client.clone())?.into(); diff --git a/common/infrastructure/src/dbclient/mod.rs b/common/infrastructure/src/dbclient/mod.rs index 3201fd020c..c2a059c832 100644 --- a/common/infrastructure/src/dbclient/mod.rs +++ b/common/infrastructure/src/dbclient/mod.rs @@ -20,11 +20,9 @@ use crate::diesel_migrations::MigrationHarness; pub type Pool = r2d2::Pool>; type PooledConnection = r2d2::PooledConnection>; -pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!(); - -pub fn run_migrations(pool: &Pool) { +pub fn run_migrations(pool: &Pool, migrations: EmbeddedMigrations) { let mut connection = pool.get().expect("Unable to get connection from pool"); - connection.run_pending_migrations(MIGRATIONS).expect("diesel migration failure"); + connection.run_pending_migrations(migrations).expect("diesel migration failure"); } pub struct Client { @@ -48,9 +46,9 @@ impl Client { }) } - pub fn run_migrations(&self) -> Result<()> { + pub fn run_migrations(&self, migrations: EmbeddedMigrations) -> Result<()> { let mut connection = self.connection()?; - connection.run_pending_migrations(MIGRATIONS).map_err(|e| { + connection.run_pending_migrations(migrations).map_err(|e| { error!(error = e.to_field(), "Failed to run migrations"); DatabaseError::Migration(anyhow!(e)) })?; diff --git a/common/infrastructure/src/lib.rs b/common/infrastructure/src/lib.rs index 88519186f4..4aaaa28fe2 100644 --- a/common/infrastructure/src/lib.rs +++ b/common/infrastructure/src/lib.rs @@ -15,7 +15,6 @@ pub mod http; pub mod tracing; pub mod web3; -#[macro_use] extern crate diesel_migrations; #[macro_use] extern crate lazy_static; diff --git a/common/testing/Cargo.toml b/common/testing/Cargo.toml index ceb88edf37..2c1dd440d0 100644 --- a/common/testing/Cargo.toml +++ b/common/testing/Cargo.toml @@ -20,6 +20,7 @@ project-root = "0.2.2" serde_json = "1.0.81" serde = { version = "1.0.137", features = ["derive"] } reqwest = { version = "0.11" } +diesel_migrations = "2.1.0" # Local dependecies domain = { path = "../domain" } diff --git a/common/testing/src/context/database.rs b/common/testing/src/context/database.rs index 387324b3f4..343f61daee 100644 --- a/common/testing/src/context/database.rs +++ b/common/testing/src/context/database.rs @@ -1,11 +1,14 @@ use std::sync::Arc; use anyhow::{anyhow, Result}; +use diesel_migrations::{embed_migrations, EmbeddedMigrations}; use infrastructure::dbclient; use testcontainers::{ clients::Cli, core::WaitFor, images::generic::GenericImage, Container, RunnableImage, }; +pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!("../../migrations"); + static USER: &str = "postgres"; static PASSWORD: &str = "Passw0rd"; static DATABASE: &str = "marketplace_db"; @@ -31,7 +34,7 @@ impl<'docker> Context<'docker> { let client = dbclient::Client::new(dbclient::init_pool(config.clone())?); - client.run_migrations()?; + client.run_migrations(MIGRATIONS)?; Ok(Self { _container: container,