Skip to content
Snippets Groups Projects
Unverified Commit 9e31dddf authored by Sébastien Gaya's avatar Sébastien Gaya
Browse files

renaming and fix block destroy syncing about

parent 796eac31
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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
......
......@@ -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.
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment