Corrige ejecución de las migraciones en módulos

This commit is contained in:
Manuel Cillero 2022-03-17 19:41:41 +01:00
parent 2167ab9417
commit 58afd1f258
9 changed files with 35 additions and 38 deletions

View file

@ -1,12 +1 @@
use crate::db::migration::*;
pub mod m20220312_000001_create_table_user; pub mod m20220312_000001_create_table_user;
pub struct Migrator;
#[async_trait::async_trait]
impl MigratorTrait for Migrator {
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
vec![Box::new(m20220312_000001_create_table_user::Migration)]
}
}

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
localize!("en-US", "src/base/module/user/locales"); localize!("src/base/module/user/locales");
mod entity; mod entity;
mod migration; mod migration;
@ -24,8 +24,10 @@ impl ModuleTrait for UserModule {
cfg.route("/user/login", server::web::get().to(login)); cfg.route("/user/login", server::web::get().to(login));
} }
fn migrations(&self, dbconn: &db::DbConn) -> Result<(), db::DbErr> { fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> {
db_migrations!(dbconn) vec![
boxed_migration!(m20220312_000001_create_table_user)
]
} }
} }

View file

@ -45,15 +45,15 @@ pub static CONFIG: Lazy<Config> = Lazy::new(|| {
/// seguros. Produce un *panic!* en caso de asignaciones no válidas. /// seguros. Produce un *panic!* en caso de asignaciones no válidas.
macro_rules! config_map { macro_rules! config_map {
( (
$COMM:expr, $doc:expr,
$CONF:ident, $SETTINGS:ident,
$TYPE:tt $Type:tt
$(, $key:expr => $value:expr)* $(, $key:expr => $value:expr)*
) => { ) => {
$crate::doc_comment! { $crate::doc_comment! {
concat!($COMM), concat!($doc),
pub static $CONF: $crate::Lazy<$TYPE> = $crate::Lazy::new(|| { pub static $SETTINGS: $crate::Lazy<$Type> = $crate::Lazy::new(|| {
let mut settings = $crate::config::CONFIG.clone(); let mut settings = $crate::config::CONFIG.clone();
$( $(
settings.set_default($key, $value).unwrap(); settings.set_default($key, $value).unwrap();

View file

@ -1,4 +1,5 @@
use crate::{Lazy, trace}; use crate::{Lazy, run_now};
use crate::db::migration::*;
use crate::core::theme::ThemeTrait; use crate::core::theme::ThemeTrait;
use crate::core::module::ModuleTrait; use crate::core::module::ModuleTrait;
use crate::core::server; use crate::core::server;
@ -41,9 +42,18 @@ pub fn modules(cfg: &mut server::web::ServiceConfig) {
} }
#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))]
pub fn migrations() { pub fn run_migrations() {
trace::info!("Checking migrations"); run_now({
struct Migrator;
impl MigratorTrait for Migrator {
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
let mut migrations = vec![];
for m in MODULES.read().unwrap().iter() { for m in MODULES.read().unwrap().iter() {
m.migrations(&*server::db::DBCONN).expect("Failed to run migrations"); migrations.append(&mut m.migrations());
}
migrations
} }
} }
Migrator::up(&server::db::DBCONN, None)
}).unwrap();
}

View file

@ -19,7 +19,7 @@ pub trait ModuleTrait: Send + Sync {
#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))]
#[allow(unused_variables)] #[allow(unused_variables)]
fn migrations(&self, dbconn: &db::DbConn) -> Result<(), db::DbErr> { fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> {
Ok(()) vec![]
} }
} }

View file

@ -74,7 +74,7 @@ impl Application {
// Comprueba actualizaciones pendientes de la base de datos (opcional). // Comprueba actualizaciones pendientes de la base de datos (opcional).
#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))]
all::migrations(); all::run_migrations();
// Prepara el servidor web. // Prepara el servidor web.
let server = server::HttpServer::new(move || { let server = server::HttpServer::new(move || {

View file

@ -14,12 +14,8 @@ pub mod migration {
} }
#[macro_export] #[macro_export]
macro_rules! db_migrations { macro_rules! boxed_migration {
( $DBCONN:ident ) => {{ ( $migration_module:ident ) => {{
$crate::run_now({ Box::new(migration::$migration_module::Migration)
use $crate::db::migration::MigratorTrait;
migration::Migrator::up($DBCONN, None)
})
}}; }};
} }

View file

@ -6,7 +6,7 @@ pub use crate::trace;
pub use crate::localize; pub use crate::localize;
#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))]
pub use crate::{db, db_migrations}; pub use crate::{db, boxed_migration};
pub use crate::core::html::*; pub use crate::core::html::*;
pub use crate::core::theme::*; pub use crate::core::theme::*;

View file

@ -9,10 +9,10 @@
/// ]; /// ];
/// ``` /// ```
macro_rules! args { macro_rules! args {
( $($KEY:expr => $VALUE:expr),* ) => {{ ( $($key:expr => $value:expr),* ) => {{
let mut a = std::collections::HashMap::new(); let mut a = std::collections::HashMap::new();
$( $(
a.insert(String::from($KEY), $VALUE.into()); a.insert(String::from($key), $value.into());
)* )*
a a
}}; }};