From aad2ebf70411dc2ae47b5a79aaf774620ebae61f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com>
Date: Mon, 25 Oct 2021 16:23:52 +0200
Subject: [PATCH] no more communication website media

---
 .../communication/websites_controller.rb      |  4 +-
 .../communication/website/imported/medium.rb  | 38 ++++-------
 .../communication/website/imported/post.rb    | 25 ++++---
 .../communication/website/imported/website.rb | 22 +++---
 app/models/communication/website/medium.rb    | 68 -------------------
 app/models/concerns/with_github.rb            |  1 +
 app/models/research/researcher.rb             |  1 +
 app/services/github.rb                        |  4 ++
 app/services/wordpress.rb                     |  1 +
 .../communication/websites/import.html.erb    |  6 +-
 ...4617_remove_communication_website_media.rb |  6 ++
 db/schema.rb                                  | 20 +-----
 .../website/imported/medium_test.rb           |  3 -
 .../communication/website/medium_test.rb      | 31 ---------
 14 files changed, 59 insertions(+), 171 deletions(-)
 delete mode 100644 app/models/communication/website/medium.rb
 create mode 100644 db/migrate/20211025124617_remove_communication_website_media.rb
 delete mode 100644 test/models/communication/website/medium_test.rb

diff --git a/app/controllers/admin/communication/websites_controller.rb b/app/controllers/admin/communication/websites_controller.rb
index 84a2eb91c..66cff8d06 100644
--- a/app/controllers/admin/communication/websites_controller.rb
+++ b/app/controllers/admin/communication/websites_controller.rb
@@ -22,8 +22,8 @@ class Admin::Communication::WebsitesController < Admin::Communication::Applicati
     @imported_website = @website.imported_website
     @imported_pages = @imported_website.pages.page params[:pages_page]
     @imported_posts = @imported_website.posts.page params[:posts_page]
-    @imported_media = @imported_website.media.includes(medium: { file_attachment: :blob }).page params[:media_page]
-    @imported_media_total_size = @imported_website.media.joins(medium: { file_attachment: :blob }).sum(:byte_size)
+    @imported_media = @imported_website.media.includes(file_attachment: :blob ).page params[:media_page]
+    @imported_media_total_size = @imported_website.media.joins(file_attachment: :blob).sum(:byte_size)
     breadcrumb
     add_breadcrumb Communication::Website::Imported::Website.model_name.human
   end
diff --git a/app/models/communication/website/imported/medium.rb b/app/models/communication/website/imported/medium.rb
index 9211ae724..4a1347d8c 100644
--- a/app/models/communication/website/imported/medium.rb
+++ b/app/models/communication/website/imported/medium.rb
@@ -10,19 +10,16 @@
 #  mime_type     :string
 #  created_at    :datetime
 #  updated_at    :datetime
-#  medium_id     :uuid
 #  university_id :uuid             not null
 #  website_id    :uuid             not null
 #
 # Indexes
 #
-#  index_communication_website_imported_media_on_medium_id      (medium_id)
 #  index_communication_website_imported_media_on_university_id  (university_id)
 #  index_communication_website_imported_media_on_website_id     (website_id)
 #
 # Foreign Keys
 #
-#  fk_rails_...  (medium_id => communication_website_media.id)
 #  fk_rails_...  (university_id => universities.id)
 #  fk_rails_...  (website_id => communication_website_imported_websites.id)
 #
@@ -30,9 +27,6 @@ class Communication::Website::Imported::Medium < ApplicationRecord
   belongs_to :university
   belongs_to :website,
              class_name: 'Communication::Website::Imported::Website'
-  belongs_to :medium,
-             class_name: 'Communication::Website::Medium',
-             optional: true
   has_many   :pages,
              class_name: 'Communication::Website::Imported::Page',
              foreign_key: :featured_medium_id
@@ -40,7 +34,9 @@ class Communication::Website::Imported::Medium < ApplicationRecord
              class_name: 'Communication::Website::Imported::Post',
              foreign_key: :featured_medium_id
 
-  before_validation :sync
+  has_one_attached_deletable :file
+
+  after_commit :download_file_from_file_url, on: [:create, :update], if: :saved_change_to_file_url
 
   def data=(value)
     super value
@@ -54,23 +50,15 @@ class Communication::Website::Imported::Medium < ApplicationRecord
 
   protected
 
-  def sync
-    if medium.nil?
-      self.medium = Communication::Website::Medium.new  university: university,
-                                                        website: website.website # Real website, not imported website
-      self.medium.save
-    else
-      # Continue only if there are remote changes
-      # Don't touch if there are local changes (page.updated_at > updated_at)
-      # Don't touch if there are no remote changes (page.updated_at == updated_at)
-      return unless updated_at > medium.updated_at
-    end
-    puts "Update medium #{medium.id}"
-    medium.file_url = Addressable::URI.parse(file_url).display_uri.to_s # ASCII-only for ActiveStorage
-    medium.filename = File.basename(URI(medium.file_url).path)
-    medium.mime_type = mime_type
-    medium.created_at = created_at
-    medium.updated_at = updated_at
-    medium.save
+  def download_file_from_file_url
+    uri = URI(file_url)
+    http = Net::HTTP.new(uri.host, uri.port)
+    http.use_ssl = true
+    # IUT Bordeaux Montaigne pb with certificate
+    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
+    request = Net::HTTP::Get.new(uri.request_uri)
+    response = http.request(request)
+    file.attach(io: StringIO.new(response.body), filename: filename, content_type: mime_type)
   end
+  handle_asynchronously :download_file_from_file_url, queue: 'default'
 end
diff --git a/app/models/communication/website/imported/post.rb b/app/models/communication/website/imported/post.rb
index 16a318248..b390c1503 100644
--- a/app/models/communication/website/imported/post.rb
+++ b/app/models/communication/website/imported/post.rb
@@ -97,19 +97,22 @@ class Communication::Website::Imported::Post < ApplicationRecord
 
   # Please refactor me i'm ugly
   def download_first_image_as_featured_image
-    doc = Nokogiri::HTML(post.text.to_s)
-    images = doc.css('img')
+    fragment = Nokogiri::HTML.fragment(post.text.to_s)
+    images = fragment.css('img')
     if images.any?
       begin
-      url = images.first.attr('src')
-      uri = URI(url)
-      filename = File.basename url
-      http = Net::HTTP.new(uri.host, uri.port)
-      http.use_ssl = true
-      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
-      request = Net::HTTP::Get.new(uri.request_uri)
-      response = http.request(request)
-      post.featured_image.attach(io: StringIO.new(response.body), filename: filename, content_type: 'image/jpeg')
+        image = images.first
+        url = image.attr('src')
+        uri = URI(url)
+        filename = File.basename url
+        http = Net::HTTP.new(uri.host, uri.port)
+        http.use_ssl = true
+        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
+        request = Net::HTTP::Get.new(uri.request_uri)
+        response = http.request(request)
+        post.featured_image.attach(io: StringIO.new(response.body), filename: filename, content_type: response['Content-Type'])
+        image.remove
+        post.update(text: fragment.to_html)
       rescue
       end
     end
diff --git a/app/models/communication/website/imported/website.rb b/app/models/communication/website/imported/website.rb
index 6765db2e4..4ddbcc001 100644
--- a/app/models/communication/website/imported/website.rb
+++ b/app/models/communication/website/imported/website.rb
@@ -69,12 +69,14 @@ class Communication::Website::Imported::Website < ApplicationRecord
     end
     # Batch update all changes (1 query only, good for github API limits)
     github = Github.with_site website
-    website.pages.find_each do |page|
-      github.add_to_batch path: page.github_path_generated,
-                          previous_path: page.github_path,
-                          data: page.to_jekyll
+    if github.valid?
+      website.pages.find_each do |page|
+        github.add_to_batch path: page.github_path_generated,
+                            previous_path: page.github_path,
+                            data: page.to_jekyll
+      end
+      github.commit_batch '[Page] Batch update from import'
     end
-    github.commit_batch '[Page] Batch update from import'
     Communication::Website::Page.set_callback(:save, :after, :publish_to_github)
   end
 
@@ -86,11 +88,13 @@ class Communication::Website::Imported::Website < ApplicationRecord
       post.data = data
       post.save
       generated_post = post.post
-      github.add_to_batch path: generated_post.github_path_generated,
-                          previous_path: generated_post.github_path,
-                          data: generated_post.to_jekyll
+      if github.valid?
+        github.add_to_batch path: generated_post.github_path_generated,
+                            previous_path: generated_post.github_path,
+                            data: generated_post.to_jekyll
+      end
     end
-    github.commit_batch '[Post] Batch update from import'
+    github.commit_batch '[Post] Batch update from import' if github.valid?
     Communication::Website::Post.set_callback(:save, :after, :publish_to_github)
   end
 end
diff --git a/app/models/communication/website/medium.rb b/app/models/communication/website/medium.rb
deleted file mode 100644
index b9fd23689..000000000
--- a/app/models/communication/website/medium.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# == Schema Information
-#
-# Table name: communication_website_media
-#
-#  id            :uuid             not null, primary key
-#  file_url      :text
-#  filename      :string
-#  identifier    :string
-#  mime_type     :string
-#  created_at    :datetime         not null
-#  updated_at    :datetime         not null
-#  university_id :uuid             not null
-#  website_id    :uuid             not null
-#
-# Indexes
-#
-#  index_communication_website_media_on_university_id  (university_id)
-#  index_communication_website_media_on_website_id     (website_id)
-#
-# Foreign Keys
-#
-#  fk_rails_...  (university_id => universities.id)
-#  fk_rails_...  (website_id => communication_websites.id)
-#
-class Communication::Website::Medium < ApplicationRecord
-  belongs_to :university
-  belongs_to :website
-  has_one    :imported_medium,
-             class_name: 'Communication::Website::Imported::Medium',
-             foreign_key: :medium_id,
-             dependent: :destroy
-
-  has_one_attached_deletable :file
-
-  after_commit :download_file_from_file_url, on: [:create, :update], if: :saved_change_to_file_url
-
-  protected
-
-  def download_file_from_file_url
-    uri = URI(file_url)
-    http = Net::HTTP.new(uri.host, uri.port)
-    http.use_ssl = true
-    # IUT Bordeaux Montaigne pb with certificate
-    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
-    request = Net::HTTP::Get.new(uri.request_uri)
-    response = http.request(request)
-    tempfile = Tempfile.open("Osuny-CommunicationWebsiteMedium-#{SecureRandom.hex}", Dir.tmpdir)
-    begin
-      tempfile.binmode
-      tempfile.write(response.body)
-      tempfile.flush
-      tempfile.rewind
-      file.attach(io: tempfile, filename: filename, content_type: mime_type)
-      set_featured_images
-    ensure
-      tempfile.close!
-    end
-  end
-  handle_asynchronously :download_file_from_file_url, queue: 'default'
-
-  def set_featured_images
-    posts = Communication::Website::Post.joins(:imported_post)
-                                        .where(communication_website_imported_posts: { featured_medium_id: imported_medium.id })
-    posts.each do |post|
-      post.featured_image.attach(io: URI.open(file.url), filename: filename, content_type: mime_type)
-    end
-  end
-end
diff --git a/app/models/concerns/with_github.rb b/app/models/concerns/with_github.rb
index 7aa18027e..906ad62e5 100644
--- a/app/models/concerns/with_github.rb
+++ b/app/models/concerns/with_github.rb
@@ -28,6 +28,7 @@ module WithGithub
   end
 
   def publish_to_github
+    return unless github.valid?
     if github.publish(path: github_path_generated,
                       previous_path: github_path,
                       commit: github_commit_message,
diff --git a/app/models/research/researcher.rb b/app/models/research/researcher.rb
index 3ff523338..ff7786785 100644
--- a/app/models/research/researcher.rb
+++ b/app/models/research/researcher.rb
@@ -32,6 +32,7 @@ class Research::Researcher < ApplicationRecord
 
   def publish_to_website(website)
     github = Github.new website.access_token, website.repository
+    return unless github.valid?
     github.publish  path: "_authors/#{ id }.md",
                     data: to_jekyll,
                     commit: "[Researcher] Save #{to_s}"
diff --git a/app/services/github.rb b/app/services/github.rb
index dd068ed3f..e47b9b4ec 100644
--- a/app/services/github.rb
+++ b/app/services/github.rb
@@ -10,6 +10,10 @@ class Github
     @repository = repository
   end
 
+  def valid?
+    repository.present? && access_token.present?
+  end
+
   def publish(path: nil,
               previous_path: nil,
               commit: nil,
diff --git a/app/services/wordpress.rb b/app/services/wordpress.rb
index d1f21571d..a34aaf052 100644
--- a/app/services/wordpress.rb
+++ b/app/services/wordpress.rb
@@ -2,6 +2,7 @@ class Wordpress
   attr_reader :domain
 
   def self.clean(html)
+    # Relaxed config : https://github.com/rgrove/sanitize/blob/main/lib/sanitize/config/relaxed.rb
     fragment = Sanitize.fragment(html, Sanitize::Config.merge(Sanitize::Config::RELAXED,
       attributes: Sanitize::Config::RELAXED[:attributes].merge({
         all: Sanitize::Config::RELAXED[:attributes][:all].dup.delete('class'),
diff --git a/app/views/admin/communication/websites/import.html.erb b/app/views/admin/communication/websites/import.html.erb
index 4b8432431..0274d1e7a 100644
--- a/app/views/admin/communication/websites/import.html.erb
+++ b/app/views/admin/communication/websites/import.html.erb
@@ -84,11 +84,11 @@
       <% @imported_media.each do |medium| %>
         <tr>
           <td><%= medium.filename %></td>
-          <td><%= number_to_human_size(medium.medium.file.blob.byte_size) if medium.medium&.file&.attached? %></td>
+          <td><%= number_to_human_size(medium.file.blob.byte_size) if medium&.file&.attached? %></td>
           <td class="text-end">
-            <% if medium.medium&.file&.attached? %>
+            <% if medium&.file&.attached? %>
               <%= link_to t('show'),
-                            url_for(medium.medium.file),
+                            url_for(medium.file),
                             class: button_classes,
                             target: :blank %>
             <% else %>
diff --git a/db/migrate/20211025124617_remove_communication_website_media.rb b/db/migrate/20211025124617_remove_communication_website_media.rb
new file mode 100644
index 000000000..688ee3ce1
--- /dev/null
+++ b/db/migrate/20211025124617_remove_communication_website_media.rb
@@ -0,0 +1,6 @@
+class RemoveCommunicationWebsiteMedia < ActiveRecord::Migration[6.1]
+  def change
+    remove_column :communication_website_imported_media, :medium_id
+    drop_table :communication_website_media
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 963a4246c..1eb10b1a5 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2021_10_25_102046) do
+ActiveRecord::Schema.define(version: 2021_10_25_124617) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "pgcrypto"
@@ -87,9 +87,7 @@ ActiveRecord::Schema.define(version: 2021_10_25_102046) do
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.string "filename"
-    t.uuid "medium_id"
     t.string "mime_type"
-    t.index ["medium_id"], name: "index_communication_website_imported_media_on_medium_id"
     t.index ["university_id"], name: "index_communication_website_imported_media_on_university_id"
     t.index ["website_id"], name: "index_communication_website_imported_media_on_website_id"
   end
@@ -151,19 +149,6 @@ ActiveRecord::Schema.define(version: 2021_10_25_102046) do
     t.index ["website_id"], name: "index_communication_website_imported_websites_on_website_id"
   end
 
-  create_table "communication_website_media", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
-    t.string "identifier"
-    t.string "filename"
-    t.string "mime_type"
-    t.text "file_url"
-    t.uuid "university_id", null: false
-    t.uuid "website_id", null: false
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.index ["university_id"], name: "index_communication_website_media_on_university_id"
-    t.index ["website_id"], name: "index_communication_website_media_on_website_id"
-  end
-
   create_table "communication_website_pages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "communication_website_id", null: false
@@ -387,7 +372,6 @@ ActiveRecord::Schema.define(version: 2021_10_25_102046) do
   add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
   add_foreign_key "administration_qualiopi_indicators", "administration_qualiopi_criterions", column: "criterion_id"
   add_foreign_key "communication_website_imported_media", "communication_website_imported_websites", column: "website_id"
-  add_foreign_key "communication_website_imported_media", "communication_website_media", column: "medium_id"
   add_foreign_key "communication_website_imported_media", "universities"
   add_foreign_key "communication_website_imported_pages", "communication_website_imported_media", column: "featured_medium_id"
   add_foreign_key "communication_website_imported_pages", "communication_website_imported_websites", column: "website_id"
@@ -399,8 +383,6 @@ ActiveRecord::Schema.define(version: 2021_10_25_102046) do
   add_foreign_key "communication_website_imported_posts", "universities"
   add_foreign_key "communication_website_imported_websites", "communication_websites", column: "website_id"
   add_foreign_key "communication_website_imported_websites", "universities"
-  add_foreign_key "communication_website_media", "communication_websites", column: "website_id"
-  add_foreign_key "communication_website_media", "universities"
   add_foreign_key "communication_website_pages", "communication_website_pages", column: "parent_id"
   add_foreign_key "communication_website_pages", "communication_websites"
   add_foreign_key "communication_website_pages", "universities"
diff --git a/test/models/communication/website/imported/medium_test.rb b/test/models/communication/website/imported/medium_test.rb
index e20280d2a..5add977a9 100644
--- a/test/models/communication/website/imported/medium_test.rb
+++ b/test/models/communication/website/imported/medium_test.rb
@@ -10,19 +10,16 @@
 #  mime_type     :string
 #  created_at    :datetime
 #  updated_at    :datetime
-#  medium_id     :uuid
 #  university_id :uuid             not null
 #  website_id    :uuid             not null
 #
 # Indexes
 #
-#  index_communication_website_imported_media_on_medium_id      (medium_id)
 #  index_communication_website_imported_media_on_university_id  (university_id)
 #  index_communication_website_imported_media_on_website_id     (website_id)
 #
 # Foreign Keys
 #
-#  fk_rails_...  (medium_id => communication_website_media.id)
 #  fk_rails_...  (university_id => universities.id)
 #  fk_rails_...  (website_id => communication_website_imported_websites.id)
 #
diff --git a/test/models/communication/website/medium_test.rb b/test/models/communication/website/medium_test.rb
deleted file mode 100644
index 216a43e11..000000000
--- a/test/models/communication/website/medium_test.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# == Schema Information
-#
-# Table name: communication_website_media
-#
-#  id            :uuid             not null, primary key
-#  file_url      :text
-#  filename      :string
-#  identifier    :string
-#  mime_type     :string
-#  created_at    :datetime         not null
-#  updated_at    :datetime         not null
-#  university_id :uuid             not null
-#  website_id    :uuid             not null
-#
-# Indexes
-#
-#  index_communication_website_media_on_university_id  (university_id)
-#  index_communication_website_media_on_website_id     (website_id)
-#
-# Foreign Keys
-#
-#  fk_rails_...  (university_id => universities.id)
-#  fk_rails_...  (website_id => communication_websites.id)
-#
-require "test_helper"
-
-class Communication::Website::MediumTest < ActiveSupport::TestCase
-  # test "the truth" do
-  #   assert true
-  # end
-end
-- 
GitLab