From 7b2ecf943d0a2e7b639e1d199eee732a0050ab41 Mon Sep 17 00:00:00 2001 From: Arnaud Levy <contact@arnaudlevy.com> Date: Tue, 31 Aug 2021 19:46:45 +0200 Subject: [PATCH] articles --- app/models/research/journal/article.rb | 9 +++ app/models/research/journal/volume.rb | 23 +------- app/services/github.rb | 58 +++++++++++++++++++ .../research/journal/articles/_form.html.erb | 2 +- .../admin/research/journals/show.html.erb | 17 ++++++ 5 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 app/services/github.rb diff --git a/app/models/research/journal/article.rb b/app/models/research/journal/article.rb index 56d568e4e..9adf754d3 100644 --- a/app/models/research/journal/article.rb +++ b/app/models/research/journal/article.rb @@ -29,7 +29,16 @@ class Research::Journal::Article < ApplicationRecord belongs_to :journal, foreign_key: :research_journal_id belongs_to :volume, foreign_key: :research_journal_volume_id, optional: true + after_save :publish_to_github + def to_s "#{ title }" end + + protected + + def publish_to_github + return if journal.repository.blank? + Github.publish_article self + end end diff --git a/app/models/research/journal/volume.rb b/app/models/research/journal/volume.rb index 38b1f2cdc..39fc7f41a 100644 --- a/app/models/research/journal/volume.rb +++ b/app/models/research/journal/volume.rb @@ -26,7 +26,7 @@ class Research::Journal::Volume < ApplicationRecord belongs_to :journal, foreign_key: :research_journal_id has_many :articles, foreign_key: :research_journal_volume_id - after_save :publish + after_save :publish_to_github def to_s "##{ number } #{ title }" @@ -34,25 +34,8 @@ class Research::Journal::Volume < ApplicationRecord protected - def publish + def publish_to_github return if journal.repository.blank? - data = "---\ntitle: #{ title }\nnumber: #{number}\n---" - directory = "tmp/volumes" - FileUtils.mkdir_p directory - local_file = "#{directory}/#{id}.md" - File.write local_file, data - remote_file = "_volumes/#{id}.md" - client = Octokit::Client.new access_token: journal.access_token - begin - content = client.content journal.repository, path: remote_file - sha = content[:sha] - rescue - sha = nil - end - client.create_contents journal.repository, - remote_file, - "Save volume #{ title }", - file: local_file, - sha: sha + Github.publish_volume self end end diff --git a/app/services/github.rb b/app/services/github.rb new file mode 100644 index 000000000..908094fb8 --- /dev/null +++ b/app/services/github.rb @@ -0,0 +1,58 @@ +class Github + attr_reader :access_token, :repository + + def self.publish_article(article) + with_journal(article.journal).publish_article(article) + end + + def self.publish_volume(volume) + with_journal(volume.journal).publish_volume(volume) + end + + def self.with_journal(journal) + new(journal.access_token, journal.repository) + end + + def initialize(access_token, repository) + @access_token = access_token + @repository = repository + end + + def publish_article(article) + publish local_directory: "tmp/articles", + local_file: "#{article.id}.md", + data: "---\ntitle: #{ article.title }\n\n---\n#{ article.text }", + remote_file: "_articles/#{article.id}.md", + commit_message: "Save article #{ article.title }" + end + + def publish_volume(volume) + publish local_directory: "tmp/volumes", + local_file: "#{volume.id}.md", + data: "---\ntitle: #{ volume.title }\nnumber: #{ volume.number }\n---", + remote_file: "_volumes/#{volume.id}.md", + commit_message: "Save volume #{ volume.title }" + end + + def publish(local_directory:, local_file:, data:, remote_file:, commit_message:) + FileUtils.mkdir_p local_directory + local_path = "#{local_directory}/#{ local_file }" + File.write local_path, data + begin + content = client.content repository, path: remote_file + sha = content[:sha] + rescue + sha = nil + end + client.create_contents repository, + remote_file, + commit_message, + file: local_path, + sha: sha + + end + + def client + @client ||= Octokit::Client.new access_token: access_token + end +end diff --git a/app/views/admin/research/journal/articles/_form.html.erb b/app/views/admin/research/journal/articles/_form.html.erb index 9e61c6117..c78e3e4ed 100644 --- a/app/views/admin/research/journal/articles/_form.html.erb +++ b/app/views/admin/research/journal/articles/_form.html.erb @@ -6,7 +6,7 @@ <%= f.input :published_at, html5: true %> </div> <div class="col-md-8"> - <%= f.input :text, input_html: { rows: 100 } %> + <%= f.input :text, input_html: { rows: 30 } %> </div> </div> <% content_for :buttons do %> diff --git a/app/views/admin/research/journals/show.html.erb b/app/views/admin/research/journals/show.html.erb index 01840bc0c..ab48f259c 100644 --- a/app/views/admin/research/journals/show.html.erb +++ b/app/views/admin/research/journals/show.html.erb @@ -19,6 +19,23 @@ <% end %> </div> +<h2 class="mt-5"><%= Research::Journal::Article.model_name.human(count: 2) %></h2> + +<%= link_to t('create'), + new_admin_research_journal_article_path(journal_id: @journal), + class: button_classes %> + +<%= link_to 'Tous les articles', + admin_research_journal_articles_path(journal_id: @journal) %> + +<div class="row"> + <% @journal.articles.each do |article| %> + <div class="col-md-3 mt-4"> + <%= link_to article, admin_research_journal_article_path(journal_id: @journal, id: article) %> + </div> + <% end %> +</div> + <% content_for :buttons do %> <%= edit_link @journal %> <% end %> -- GitLab