From 3eb3316c313fb01e8026776cb38a58dc481eb406 Mon Sep 17 00:00:00 2001 From: Joshua Coles Date: Mon, 6 Nov 2023 20:13:13 +0000 Subject: [PATCH] (toggl-portal): Add project <-> time_entry fk relation --- migration/src/lib.rs | 2 + ...231106_201029_add_time_entry_project_fk.rs | 41 +++++++++++++++++++ src/entity/project.rs | 8 ++++ src/entity/time_entry.rs | 17 +++++++- 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 migration/src/m20231106_201029_add_time_entry_project_fk.rs diff --git a/migration/src/lib.rs b/migration/src/lib.rs index c633293..c4aa8ab 100644 --- a/migration/src/lib.rs +++ b/migration/src/lib.rs @@ -3,6 +3,7 @@ pub use sea_orm_migration::prelude::*; mod m20231101_172500_create_time_entry_table; mod m20231106_134950_create_clients; mod m20231106_195401_create_projects; +mod m20231106_201029_add_time_entry_project_fk; pub struct Migrator; @@ -13,6 +14,7 @@ impl MigratorTrait for Migrator { Box::new(m20231101_172500_create_time_entry_table::Migration), Box::new(m20231106_134950_create_clients::Migration), Box::new(m20231106_195401_create_projects::Migration), + Box::new(m20231106_201029_add_time_entry_project_fk::Migration), ] } diff --git a/migration/src/m20231106_201029_add_time_entry_project_fk.rs b/migration/src/m20231106_201029_add_time_entry_project_fk.rs new file mode 100644 index 0000000..cb90ab2 --- /dev/null +++ b/migration/src/m20231106_201029_add_time_entry_project_fk.rs @@ -0,0 +1,41 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // Add foreign key to time entry table referencing project table + manager + .create_foreign_key( + ForeignKey::create() + .name("time_entry_project_id") + .from(TimeEntry::Table, TimeEntry::ProjectId) + .to(Project::Table, Project::TogglId) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // Drop foreign key + manager + .drop_foreign_key(ForeignKey::drop().name("time_entry_project_id").to_owned()) + .await + } +} + +#[derive(DeriveIden)] +enum TimeEntry { + Table, + Id, + ProjectId, +} + +#[derive(DeriveIden)] +enum Project { + Table, + Id, + TogglId, +} diff --git a/src/entity/project.rs b/src/entity/project.rs index 887f301..1e0a1d4 100644 --- a/src/entity/project.rs +++ b/src/entity/project.rs @@ -28,6 +28,8 @@ pub enum Relation { on_delete = "NoAction" )] Client, + #[sea_orm(has_many = "super::time_entry::Entity")] + TimeEntry, } impl Related for Entity { @@ -36,4 +38,10 @@ impl Related for Entity { } } +impl Related for Entity { + fn to() -> RelationDef { + Relation::TimeEntry.def() + } +} + impl ActiveModelBehavior for ActiveModel {} diff --git a/src/entity/time_entry.rs b/src/entity/time_entry.rs index 08c56c5..c3041eb 100644 --- a/src/entity/time_entry.rs +++ b/src/entity/time_entry.rs @@ -19,6 +19,21 @@ pub struct Model { } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} +pub enum Relation { + #[sea_orm( + belongs_to = "super::project::Entity", + from = "Column::ProjectId", + to = "super::project::Column::TogglId", + on_update = "NoAction", + on_delete = "NoAction" + )] + Project, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Project.def() + } +} impl ActiveModelBehavior for ActiveModel {}