From 2272f9b41a7e419c46f3b90d0ea56b6c2dafb47d Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Thu, 2 Jun 2022 17:41:57 +0200
Subject: [PATCH] wip

---
 app/models/communication/block.rb             | 13 ++----------
 .../communication/block/component/base.rb     | 20 +++++++++++++++++++
 .../block/component/rich_text.rb              |  2 ++
 .../block/{template.rb => template/base.rb}   | 12 ++++++++---
 .../block/template/call_to_action.rb          |  2 +-
 .../communication/block/template/chapter.rb   |  2 +-
 .../communication/block/template/datatable.rb |  2 +-
 .../block/template/definition.rb              |  2 +-
 .../communication/block/template/embed.rb     |  2 +-
 .../communication/block/template/file.rb      |  2 +-
 .../communication/block/template/gallery.rb   |  2 +-
 .../communication/block/template/image.rb     |  2 +-
 .../block/template/key_figure.rb              |  2 +-
 .../block/template/organization_chart.rb      |  2 +-
 .../communication/block/template/page.rb      |  2 +-
 .../communication/block/template/partner.rb   |  2 +-
 .../communication/block/template/post.rb      |  2 +-
 .../block/template/testimonial.rb             |  2 +-
 .../communication/block/template/timeline.rb  |  2 +-
 .../communication/block/template/video.rb     |  2 +-
 20 files changed, 49 insertions(+), 30 deletions(-)
 create mode 100644 app/models/communication/block/component/base.rb
 create mode 100644 app/models/communication/block/component/rich_text.rb
 rename app/models/communication/block/{template.rb => template/base.rb} (89%)

diff --git a/app/models/communication/block.rb b/app/models/communication/block.rb
index 44c0606c0..27dc22dc0 100644
--- a/app/models/communication/block.rb
+++ b/app/models/communication/block.rb
@@ -62,14 +62,11 @@ class Communication::Block < ApplicationRecord
   after_commit :save_and_sync_about, on: [:update, :destroy]
 
   def data=(value)
-    # Symbol does not work (:data)
-    attributes['data'] = default_data
-    # Template data setter will write properly sanitized values to block data
-    template.data = value
+    attributes['data'] = template.parse(value).to_json
   end
 
   def data
-    attributes['data'] ||= default_data
+    template.to_json
   end
 
   def git_dependencies
@@ -91,12 +88,6 @@ class Communication::Block < ApplicationRecord
 
   protected
 
-  def default_data
-    {
-      'elements': []
-    }
-  end
-
   def attach_template_blobs
     self.template_images = template.active_storage_blobs
   end
diff --git a/app/models/communication/block/component/base.rb b/app/models/communication/block/component/base.rb
new file mode 100644
index 000000000..f27eeead1
--- /dev/null
+++ b/app/models/communication/block/component/base.rb
@@ -0,0 +1,20 @@
+class Communication::Block::Component::Base
+  attr_reader :property, :template
+
+  def initialize(property, template)
+    @property = property.to_s
+    @template = template
+  end
+
+  def value
+    data[property]
+  end
+
+  def value=(v)
+    data[property] = v
+  end
+
+  def data
+    template.data
+  end
+end
diff --git a/app/models/communication/block/component/rich_text.rb b/app/models/communication/block/component/rich_text.rb
new file mode 100644
index 000000000..587c0b946
--- /dev/null
+++ b/app/models/communication/block/component/rich_text.rb
@@ -0,0 +1,2 @@
+class Communication::Block::Component::RichText < Communication::Block::Component::Base
+end
diff --git a/app/models/communication/block/template.rb b/app/models/communication/block/template/base.rb
similarity index 89%
rename from app/models/communication/block/template.rb
rename to app/models/communication/block/template/base.rb
index 0f3ba1c87..59922847b 100644
--- a/app/models/communication/block/template.rb
+++ b/app/models/communication/block/template/base.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template
+class Communication::Block::Template::Base
   class_attribute :fields
 
   attr_reader :block
@@ -36,11 +36,11 @@ class Communication::Block::Template
     sanitizer_type = sanitizers[kind]
     class_eval <<-CODE, __FILE__, __LINE__ + 1
       def #{property}
-        #{ kind == :image ? "extract_image_alt_and_credit(data, '#{property}')" : "data['#{property}']" }
+        Communication::Block::Component::#{kind.classify}.new(property, self).value
       end
 
       def #{property}=(value)
-        data['#{property}'] = #{ sanitizer_type ? "Osuny::Sanitizer.sanitize(value, '#{sanitizer_type}')" : "value" }
+        Communication::Block::Component::#{kind.classify}.new(property, self).value = value
       end
     CODE
   end
@@ -73,6 +73,12 @@ class Communication::Block::Template
 
   protected
 
+  def default_data
+    {
+      'elements': []
+    }
+  end
+
   def update_field(field, json)
     name = field[:name]
     value = json["#{name}"]
diff --git a/app/models/communication/block/template/call_to_action.rb b/app/models/communication/block/template/call_to_action.rb
index 0bbdb6071..4d82b7985 100644
--- a/app/models/communication/block/template/call_to_action.rb
+++ b/app/models/communication/block/template/call_to_action.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::CallToAction < Communication::Block::Template
+class Communication::Block::Template::CallToAction < Communication::Block::Template::Base
   def sanitized_data
     {
       "text" => Osuny::Sanitizer.sanitize(text),
diff --git a/app/models/communication/block/template/chapter.rb b/app/models/communication/block/template/chapter.rb
index d2e850c06..a744759c1 100644
--- a/app/models/communication/block/template/chapter.rb
+++ b/app/models/communication/block/template/chapter.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Chapter < Communication::Block::Template
+class Communication::Block::Template::Chapter < Communication::Block::Template::Base
   has_rich_text :text
   has_rich_text :notes
   has_image :image
diff --git a/app/models/communication/block/template/datatable.rb b/app/models/communication/block/template/datatable.rb
index 6a764e8e1..579750d21 100644
--- a/app/models/communication/block/template/datatable.rb
+++ b/app/models/communication/block/template/datatable.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Datatable < Communication::Block::Template
+class Communication::Block::Template::Datatable < Communication::Block::Template::Base
   def build_git_dependencies
   end
 end
diff --git a/app/models/communication/block/template/definition.rb b/app/models/communication/block/template/definition.rb
index 63b6777e5..2b9e596ee 100644
--- a/app/models/communication/block/template/definition.rb
+++ b/app/models/communication/block/template/definition.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Definition < Communication::Block::Template
+class Communication::Block::Template::Definition < Communication::Block::Template::Base
   def definitions
     @definitions ||= elements.map { |element| definition(element) }
                               .compact
diff --git a/app/models/communication/block/template/embed.rb b/app/models/communication/block/template/embed.rb
index 69df31672..556f425af 100644
--- a/app/models/communication/block/template/embed.rb
+++ b/app/models/communication/block/template/embed.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Embed < Communication::Block::Template
+class Communication::Block::Template::Embed < Communication::Block::Template::Base
   def build_git_dependencies
   end
 
diff --git a/app/models/communication/block/template/file.rb b/app/models/communication/block/template/file.rb
index ad69e9def..b1172690a 100644
--- a/app/models/communication/block/template/file.rb
+++ b/app/models/communication/block/template/file.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::File < Communication::Block::Template
+class Communication::Block::Template::File < Communication::Block::Template::Base
   def build_git_dependencies
     files.each do |file|
       add_dependency file.blob
diff --git a/app/models/communication/block/template/gallery.rb b/app/models/communication/block/template/gallery.rb
index 963063b9f..38c7d1b3d 100644
--- a/app/models/communication/block/template/gallery.rb
+++ b/app/models/communication/block/template/gallery.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Gallery < Communication::Block::Template
+class Communication::Block::Template::Gallery < Communication::Block::Template::Base
 
   LAYOUTS = [:grid, :carousel].freeze
 
diff --git a/app/models/communication/block/template/image.rb b/app/models/communication/block/template/image.rb
index f6968d1ee..262bf513a 100644
--- a/app/models/communication/block/template/image.rb
+++ b/app/models/communication/block/template/image.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Image < Communication::Block::Template
+class Communication::Block::Template::Image < Communication::Block::Template::Base
   def sanitized_data
     {
       "text" => Osuny::Sanitizer.sanitize(text),
diff --git a/app/models/communication/block/template/key_figure.rb b/app/models/communication/block/template/key_figure.rb
index 0c4abee7d..386547355 100644
--- a/app/models/communication/block/template/key_figure.rb
+++ b/app/models/communication/block/template/key_figure.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::KeyFigure < Communication::Block::Template
+class Communication::Block::Template::KeyFigure < Communication::Block::Template::Base
   def build_git_dependencies
   end
 
diff --git a/app/models/communication/block/template/organization_chart.rb b/app/models/communication/block/template/organization_chart.rb
index 0164c35af..aebeb9545 100644
--- a/app/models/communication/block/template/organization_chart.rb
+++ b/app/models/communication/block/template/organization_chart.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::OrganizationChart < Communication::Block::Template
+class Communication::Block::Template::OrganizationChart < Communication::Block::Template::Base
   def build_git_dependencies
     add_dependency persons
     persons.each do |person|
diff --git a/app/models/communication/block/template/page.rb b/app/models/communication/block/template/page.rb
index 103560f6d..ef482aa88 100644
--- a/app/models/communication/block/template/page.rb
+++ b/app/models/communication/block/template/page.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Page < Communication::Block::Template
+class Communication::Block::Template::Page < Communication::Block::Template::Base
   has_rich_text :text
 
   LAYOUTS = [:grid, :list, :cards].freeze
diff --git a/app/models/communication/block/template/partner.rb b/app/models/communication/block/template/partner.rb
index 7a30863ea..4a19277ae 100644
--- a/app/models/communication/block/template/partner.rb
+++ b/app/models/communication/block/template/partner.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Partner < Communication::Block::Template
+class Communication::Block::Template::Partner < Communication::Block::Template::Base
   def build_git_dependencies
     add_dependency active_storage_blobs
     add_dependency organizations
diff --git a/app/models/communication/block/template/post.rb b/app/models/communication/block/template/post.rb
index b25c07e1a..be7aa8961 100644
--- a/app/models/communication/block/template/post.rb
+++ b/app/models/communication/block/template/post.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Post < Communication::Block::Template
+class Communication::Block::Template::Post < Communication::Block::Template::Base
   def build_git_dependencies
     add_dependency category unless category.nil?
     add_dependency selected_posts
diff --git a/app/models/communication/block/template/testimonial.rb b/app/models/communication/block/template/testimonial.rb
index 85a231cdd..4da01d1b9 100644
--- a/app/models/communication/block/template/testimonial.rb
+++ b/app/models/communication/block/template/testimonial.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Testimonial < Communication::Block::Template
+class Communication::Block::Template::Testimonial < Communication::Block::Template::Base
   def build_git_dependencies
     add_dependency active_storage_blobs
   end
diff --git a/app/models/communication/block/template/timeline.rb b/app/models/communication/block/template/timeline.rb
index 94c030a84..8dcc3d98a 100644
--- a/app/models/communication/block/template/timeline.rb
+++ b/app/models/communication/block/template/timeline.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Timeline < Communication::Block::Template
+class Communication::Block::Template::Timeline < Communication::Block::Template::Base
 
   def description
     "#{data['description']}"
diff --git a/app/models/communication/block/template/video.rb b/app/models/communication/block/template/video.rb
index 9420e9468..a1f8c3115 100644
--- a/app/models/communication/block/template/video.rb
+++ b/app/models/communication/block/template/video.rb
@@ -1,4 +1,4 @@
-class Communication::Block::Template::Video < Communication::Block::Template
+class Communication::Block::Template::Video < Communication::Block::Template::Base
   has_string :url
   has_text :transcription
 
-- 
GitLab