aboutsummaryrefslogtreecommitdiff
path: root/src/cli/migrate.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/migrate.rs')
-rw-r--r--src/cli/migrate.rs38
1 files changed, 33 insertions, 5 deletions
diff --git a/src/cli/migrate.rs b/src/cli/migrate.rs
index 4b5123a..a6efbb5 100644
--- a/src/cli/migrate.rs
+++ b/src/cli/migrate.rs
@@ -1,19 +1,47 @@
use structopt::StructOpt;
-use crate::{Settings, UrlMap, db::backend::{Connectable, Connection}};
+use crate::{Settings, UrlMap};
+use crate::db::backend::Connectable;
+use crate::db::migration::{DatabaseChange, CreateModelOption};
+use crate::db::models::Field;
#[derive(StructOpt)]
/// Perform database migrations
pub struct Migrate {
}
+const CREATE_MIGRATION_TABLE: DatabaseChange = DatabaseChange::CreateModel {
+ name: "Migration",
+ fields: &[
+ Field::CharField {
+ name: "app_name",
+ max_length: None,
+ },
+ Field::IntField {
+ name: "migration_id",
+ },
+ Field::CharField {
+ name: "migration_name",
+ max_length: None,
+ },
+ Field::DateTimeField {
+ name: "applied_at",
+ }
+ ],
+ options: &[CreateModelOption::IfNotExist],
+};
+
impl Migrate {
- pub fn execute(self, _urls: UrlMap, settings: Settings<impl Connectable>) {
+ pub fn execute<C: Connectable>(self, _urls: UrlMap, settings: Settings<C>) {
let database = settings.database;
let connection = database.connect().unwrap();
- let migration_table_vibe_check = connection.transaction::<(), diesel::result::Error, _>(|| {
- todo!()
- });
+ CREATE_MIGRATION_TABLE.apply::<C>("tosin_meta", &connection);
+
+ for app in settings.installed_apps {
+ for migration in app.migrations {
+ migration.apply::<C>(app.name, &connection);
+ }
+ }
}
}