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