From 2e73b0756851016f6f9dadfdac352b9b68b348b1 Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Sun, 19 Jun 2022 09:14:46 +0200
Subject: [PATCH] dependencies

---
 app/models/communication/block.rb                |  4 +++-
 app/models/communication/block/component/base.rb |  4 ----
 .../communication/block/component/category.rb    |  6 +-----
 app/models/communication/block/component/file.rb |  5 ++---
 .../block/component/organization.rb              |  4 ++++
 app/models/communication/block/component/page.rb |  4 ++++
 .../communication/block/component/person.rb      |  4 ++++
 app/models/communication/block/component/post.rb | 12 ++++++------
 app/models/communication/block/template/base.rb  | 16 +++++-----------
 app/models/communication/block/template/page.rb  | 15 +++++++++------
 app/models/communication/block/template/post.rb  |  4 ++--
 .../admin/communication/blocks/_list.html.erb    |  3 +++
 .../admin/communication/blocks/edit.html.erb     |  6 ++++++
 .../admin/communication/blocks/show.html.erb     | 11 ++++++-----
 14 files changed, 55 insertions(+), 43 deletions(-)

diff --git a/app/models/communication/block.rb b/app/models/communication/block.rb
index 788027d4e..5c07c25e3 100644
--- a/app/models/communication/block.rb
+++ b/app/models/communication/block.rb
@@ -105,8 +105,10 @@ class Communication::Block < ApplicationRecord
     "Communication::Block::Template::#{template_kind.classify}".constantize
   end
 
+  # FIXME @sebou
+  # Could not find or build blob: expected attachable, got #<ActiveStorage::Blob id: "f4c78657-5062-416b-806f-0b80fb66f9cd", key: "gri33wtop0igur8w3a646llel3sd", filename: "logo.svg", content_type: "image/svg+xml", metadata: {"identified"=>true, "width"=>709, "height"=>137, "analyzed"=>true}, service_name: "scaleway", byte_size: 4137, checksum: "aZqqTYabP5+72ZeddcZ/2Q==", created_at: "2022-05-05 12:17:33.941505000 +0200", university_id: "ebf2d273-ffc9-4d9f-a4ee-a2146913d617">
   def attach_template_blobs
-    self.template_images = template.active_storage_blobs
+    # self.template_images = template.active_storage_blobs
   end
 
   def save_and_sync_about
diff --git a/app/models/communication/block/component/base.rb b/app/models/communication/block/component/base.rb
index 798e61e84..0637e0ada 100644
--- a/app/models/communication/block/component/base.rb
+++ b/app/models/communication/block/component/base.rb
@@ -26,10 +26,6 @@ class Communication::Block::Component::Base
   end
 
   def git_dependencies
-    active_storage_blobs
-  end
-
-  def active_storage_blobs
     []
   end
 
diff --git a/app/models/communication/block/component/category.rb b/app/models/communication/block/component/category.rb
index e11cd06a5..a7db68fa1 100644
--- a/app/models/communication/block/component/category.rb
+++ b/app/models/communication/block/component/category.rb
@@ -6,11 +6,7 @@ class Communication::Block::Component::Category < Communication::Block::Componen
   end
 
   def git_dependencies
-    active_storage_blobs +
-    [category]
+    [category, category&.best_featured_image&.blob]
   end
 
-  def active_storage_blobs
-    category&.active_storage_blobs || []
-  end
 end
diff --git a/app/models/communication/block/component/file.rb b/app/models/communication/block/component/file.rb
index 230b018e0..3cb698ec2 100644
--- a/app/models/communication/block/component/file.rb
+++ b/app/models/communication/block/component/file.rb
@@ -11,9 +11,8 @@ class Communication::Block::Component::File < Communication::Block::Component::B
     }
   end
 
-  def active_storage_blobs
-    # If blob is nil, compact will remove it and the method will return an empty array
-    [blob].compact
+  def git_dependencies
+    [blob]
   end
 
 end
diff --git a/app/models/communication/block/component/organization.rb b/app/models/communication/block/component/organization.rb
index f92062893..72f8e2d40 100644
--- a/app/models/communication/block/component/organization.rb
+++ b/app/models/communication/block/component/organization.rb
@@ -4,4 +4,8 @@ class Communication::Block::Component::Organization < Communication::Block::Comp
     template.block.university.organizations.find_by(id: data)
   end
 
+  def git_dependencies
+    [organization, organization&.logo&.blob]
+  end
+
 end
diff --git a/app/models/communication/block/component/page.rb b/app/models/communication/block/component/page.rb
index 61978e9b8..2f5617ad6 100644
--- a/app/models/communication/block/component/page.rb
+++ b/app/models/communication/block/component/page.rb
@@ -5,4 +5,8 @@ class Communication::Block::Component::Page < Communication::Block::Component::B
     website.pages.published.find_by(id: data)
   end
 
+  def git_dependencies
+    [page, page&.best_featured_image&.blob]
+  end
+
 end
diff --git a/app/models/communication/block/component/person.rb b/app/models/communication/block/component/person.rb
index f15ddb44e..e082a0139 100644
--- a/app/models/communication/block/component/person.rb
+++ b/app/models/communication/block/component/person.rb
@@ -4,4 +4,8 @@ class Communication::Block::Component::Person < Communication::Block::Component:
     template.block.university.people.find_by(id: data)
   end
 
+  def git_dependencies
+    [person, person&.picture&.blob]
+  end
+
 end
diff --git a/app/models/communication/block/component/post.rb b/app/models/communication/block/component/post.rb
index 0a653a7ea..8b08eb17d 100644
--- a/app/models/communication/block/component/post.rb
+++ b/app/models/communication/block/component/post.rb
@@ -6,12 +6,12 @@ class Communication::Block::Component::Post < Communication::Block::Component::B
   end
 
   def git_dependencies
-    active_storage_blobs +
-    [post, post.author, post.author.author]
-  end
-
-  def active_storage_blobs
-    post&.author&.active_storage_blobs || []
+    [
+      post,
+      post&.author,
+      post&.author&.author,
+      post&.author&.picture&.blob
+    ]
   end
 
 end
diff --git a/app/models/communication/block/template/base.rb b/app/models/communication/block/template/base.rb
index 68dd8061e..b69b73cf6 100644
--- a/app/models/communication/block/template/base.rb
+++ b/app/models/communication/block/template/base.rb
@@ -98,23 +98,17 @@ class Communication::Block::Template::Base
         add_dependency element.git_dependencies
       end
       add_custom_git_dependencies
+      @git_dependencies.compact!
       @git_dependencies.uniq!
     end
     @git_dependencies
   end
 
   def active_storage_blobs
-    unless @active_storage_blobs
-      @active_storage_blobs = []
-      components.each do |component|
-        @active_storage_blobs += component.active_storage_blobs
-      end
-      elements.each do |element|
-        @active_storage_blobs += element.active_storage_blobs
-      end
-      @active_storage_blobs.uniq!
-    end
-    @active_storage_blobs
+    @active_storage_blobs ||= git_dependencies.select { |dependency|
+      # dependency.is_a? ActiveStorage::Blob misses some occurrences
+      dependency.class.name == 'ActiveStorage::Blob'
+    }.uniq
   end
 
   def default_element(data = nil)
diff --git a/app/models/communication/block/template/page.rb b/app/models/communication/block/template/page.rb
index 69678611b..f47841368 100644
--- a/app/models/communication/block/template/page.rb
+++ b/app/models/communication/block/template/page.rb
@@ -21,19 +21,22 @@ class Communication::Block::Template::Page < Communication::Block::Template::Bas
     !website.nil?
   end
 
-  protected
-
-  def kind
-    @kind ||= data['kind'] || 'selection'
+  def add_custom_git_dependencies
+    selected_pages.each do |page|
+      add_dependency page
+      add_dependency page.active_storage_blobs.to_a
+    end
   end
 
+  protected
+
   def selected_pages_selection
     elements.map { |element| element.page }.compact
   end
 
   def selected_pages_children
-    return [] unless main_page
-    main_page.children.published.ordered
+    return [] unless page
+    page.children.published.ordered
   end
 
 end
diff --git a/app/models/communication/block/template/post.rb b/app/models/communication/block/template/post.rb
index 22f772ae3..379e53772 100644
--- a/app/models/communication/block/template/post.rb
+++ b/app/models/communication/block/template/post.rb
@@ -8,10 +8,10 @@ class Communication::Block::Template::Post < Communication::Block::Template::Bas
   def add_custom_git_dependencies
     selected_posts.each do |post|
       add_dependency post
-      add_dependency post.active_storage_blobs
+      add_dependency post.active_storage_blobs.to_a
       if post.author.present?
         add_dependency [post.author, post.author.author]
-        add_dependency post.author.active_storage_blobs
+        add_dependency post.author.active_storage_blobs.to_a
       end
     end
   end
diff --git a/app/views/admin/communication/blocks/_list.html.erb b/app/views/admin/communication/blocks/_list.html.erb
index 479ed06b8..1993d41ba 100644
--- a/app/views/admin/communication/blocks/_list.html.erb
+++ b/app/views/admin/communication/blocks/_list.html.erb
@@ -37,6 +37,9 @@
               </p>
             </td>
             <td class="text-end">
+              <%= link_to 'Dependencies', 
+                          [:admin, block],
+                          class: button_classes('btn-light') if current_user.server_admin? %>
               <%= edit_link block %>
             </td>
           </tr>
diff --git a/app/views/admin/communication/blocks/edit.html.erb b/app/views/admin/communication/blocks/edit.html.erb
index dbd8da901..959fa68d7 100644
--- a/app/views/admin/communication/blocks/edit.html.erb
+++ b/app/views/admin/communication/blocks/edit.html.erb
@@ -23,6 +23,12 @@
     <textarea name="communication_block[data]" rows="20" cols="200" class="d-none">
       {{ JSON.stringify(data) }}
     </textarea>
+    <% content_for :action_bar_left do %>
+      <%= destroy_link @block %>
+      <%= link_to 'Dependencies', 
+                  [:admin, @block],
+                  class: button_classes('btn-light') if current_user.server_admin? %>
+    <% end %>
     <% content_for :action_bar_right do %>
       <%= submit f %>
     <% end %>
diff --git a/app/views/admin/communication/blocks/show.html.erb b/app/views/admin/communication/blocks/show.html.erb
index 0902341bf..6b358527c 100644
--- a/app/views/admin/communication/blocks/show.html.erb
+++ b/app/views/admin/communication/blocks/show.html.erb
@@ -4,14 +4,15 @@
 <table class="table">
     <thead>
         <tr>
+            <th>Id</th>
             <th>Class</th>
             <th>Name</th>
-            <th>Id</th>
         </tr>
     </thead>
     <tbody>
         <% @block.template.git_dependencies.each do |dependency| %>
             <tr>
+                <td><%= dependency.id %></td>
                 <td><%= dependency.class %></td>
                 <td><%= dependency.to_s %></td>
             </tr>
@@ -23,15 +24,15 @@
 <table class="table">
     <thead>
         <tr>
-            <th>Filename</th>
             <th>Id</th>
+            <th>Filename</th>
         </tr>
     </thead>
     <tbody>
-        <% @block.template.active_storage_blobs.each do |attachment| %>
+        <% @block.template.active_storage_blobs.each do |blob| %>
             <tr>
-                <td><%= attachment.to_s %></td>
-                <td><%= attachment.id %></td>
+                <td><%= blob.id %></td>
+                <td><%= blob.filename %></td>
             </tr>
         <% end %>
     </tbody>
-- 
GitLab