From 9e31dddf71f8ec65e51a566d1de135d858573e30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com> Date: Thu, 11 May 2023 16:47:48 +0200 Subject: [PATCH] renaming and fix block destroy syncing about --- app/models/concerns/as_direct_object.rb | 6 +++--- app/models/concerns/as_indirect_object.rb | 8 ++++---- app/models/concerns/with_dependencies.rb | 9 +++++++-- .../communication/website/dependency_test.rb | 17 ++++++++++++----- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/app/models/concerns/as_direct_object.rb b/app/models/concerns/as_direct_object.rb index 6b21fb09c..21677277b 100644 --- a/app/models/concerns/as_direct_object.rb +++ b/app/models/concerns/as_direct_object.rb @@ -22,8 +22,8 @@ module AsDirectObject class_name: 'Communication::Website::Connection', dependent: :destroy # When the direct object disappears all connections with the object as a source must disappear - after_save :sync_connections - after_touch :sync_connections + after_save :connect_dependencies + after_touch :connect_dependencies end def is_direct_object? @@ -34,7 +34,7 @@ module AsDirectObject false end - def sync_connections + def connect_dependencies dependencies.each do |dependency| website.connect(dependency, self) end diff --git a/app/models/concerns/as_indirect_object.rb b/app/models/concerns/as_indirect_object.rb index 42989fba2..4bb3d77ca 100644 --- a/app/models/concerns/as_indirect_object.rb +++ b/app/models/concerns/as_indirect_object.rb @@ -13,14 +13,14 @@ module AsIndirectObject has_many :connections, as: :indirect_object, class_name: 'Communication::Website::Connection' - # Pas dependent_destroy parce que le processus est plus sophistiqué, et est fait dans la méthode destroy + # Pas dependent_destroy parce que le processus est plus sophistiqué, et est fait dans la méthode destroy du WithDependencies has_many :websites, through: :connections # Ce serait super de faire la ligne ci-dessous, mais Rails ne sait pas faire ça avec un objet polymorphe (direct_source) # has_many :direct_sources, through: :connections - after_save :sync_connections - after_touch :sync_connections + after_save :connect_and_sync_direct_sources + after_touch :connect_and_sync_direct_sources end def is_direct_object? @@ -58,7 +58,7 @@ module AsIndirectObject : reference.direct_sources # Récursivité sur les références end - def sync_connections + def connect_and_sync_direct_sources direct_sources.each do |direct_source| direct_source.website.connect self, direct_source direct_source.sync_with_git diff --git a/app/models/concerns/with_dependencies.rb b/app/models/concerns/with_dependencies.rb index a84da4259..4a4b37b16 100644 --- a/app/models/concerns/with_dependencies.rb +++ b/app/models/concerns/with_dependencies.rb @@ -20,13 +20,18 @@ module WithDependencies # et on a besoin que ces recursive_dependencies n'incluent pas l'objet courant, puisqu'il est "en cours de destruction" (ni ses propres recursive_dependencies). # Mais si on détruit juste l'objet et qu'on fait un `after_destroy :clean_website_connections` # on ne peut plus accéder aux websites (puisque l'objet est déjà détruit et ses connexions en cascades). + # Egalement, quand on supprime un objet indirect, il faut synchroniser ses anciennes sources directes pour supprimer toute référence éventuelle # Donc : - # 1. on stocke les websites + # 1. on stocke les websites (et les sources directes si nécessaire) # 2. on laisse la méthode destroy normale faire son travail - # 3. PUIS on demande aux websites stockés de nettoyer leurs connexions et leurs git files + # 3. PUIS on demande aux websites stockés de nettoyer leurs connexions et leurs git files (et on synchronise les potentielles sources directes) self.transaction do + snapshot_direct_sources = try(:direct_sources).to_a || [] website_ids = websites_to_clean.pluck(:id) super + snapshot_direct_sources.each do |direct_source| + direct_source.sync_with_git + end clean_websites(Communication::Website.where(id: website_ids)) # TODO: Actuellement, on ne nettoie pas les références # Exemple : Quand on supprime un auteur, il n'est pas nettoyé dans le static de ses anciens posts. diff --git a/test/models/communication/website/dependency_test.rb b/test/models/communication/website/dependency_test.rb index 12566f998..f9ffd5c08 100644 --- a/test/models/communication/website/dependency_test.rb +++ b/test/models/communication/website/dependency_test.rb @@ -37,9 +37,12 @@ class Communication::Website::DependencyTest < ActiveSupport::TestCase assert_equal 9, page.recursive_dependencies.count - # Vérifie qu'on a bien une tâche de nettoyage si le block est supprimé + # Vérifie qu'on a bien + # - une tâche pour resynchroniser la page + # - une tâche de nettoyage si le block est supprimé Delayed::Job.destroy_all block.destroy + assert(sync_with_git_job(page)) assert(destroy_obsolete_git_files_job) end @@ -85,15 +88,19 @@ class Communication::Website::DependencyTest < ActiveSupport::TestCase protected - def destroy_obsolete_git_files_job(website_id = website_with_github.id) - find_performable_method_job(:destroy_obsolete_git_files_without_delay, website_id) + def sync_with_git_job(object) + find_performable_method_job(:sync_with_git_without_delay, object) + end + + def destroy_obsolete_git_files_job(website = website_with_github) + find_performable_method_job(:destroy_obsolete_git_files_without_delay, website) end # On ne peut pas utiliser assert_enqueued_jobs sur les méthodes asynchrones gérées avec handle_asynchronously - def find_performable_method_job(method, id) + def find_performable_method_job(method, object) Delayed::Job.all.detect { |job| job.payload_object.method_name == method && - job.payload_object.object.id == id + job.payload_object.object == object } end end -- GitLab