/ lib / caramelize / input_wiki / redmine_wiki.rb
redmine_wiki.rb
  1  # frozen_string_literal: true
  2  
  3  require "caramelize/filters/swap_wiki_links"
  4  require "caramelize/filters/remove_table_tab_line_endings"
  5  
  6  module Caramelize
  7    module InputWiki
  8      class RedmineWiki < Wiki
  9        include DatabaseConnector
 10  
 11        def initialize(options = {})
 12          super
 13          @options[:markup] = :textile
 14          @options[:filters] << ::Caramelize::SwapWikiLinks
 15          @options[:filters] << ::Caramelize::RemoveTableTabLineEndings
 16          @options[:create_namespace_overview] = true
 17        end
 18  
 19        # after calling this action, I expect the titles and revisions to be filled
 20        def read_pages
 21          add_projects_as_namespaces
 22  
 23          pages.each do |row_page|
 24            build_page(row_page)
 25          end
 26          titles.uniq!
 27          revisions.sort_by!(&:time)
 28  
 29          revisions
 30        end
 31  
 32        def read_authors
 33          database.query(authors_query).each do |row|
 34            authors[row["id"]] = {id: row["id"],
 35                                   name: row["login"],
 36                                   email: row["mail"]}
 37          end
 38          authors
 39        end
 40  
 41        private
 42  
 43        def build_page(row_page)
 44          results_contents = database.query(single_page_query(row_page["id"]))
 45  
 46          wiki = wikis.find { |row| row["id"] == row_page["wiki_id"] }
 47  
 48          project_identifier = ""
 49  
 50          if wiki
 51            project = projects.find { |row| row["id"] == wiki["project_id"] }
 52            project_identifier = "#{project["identifier"]}/"
 53          end
 54  
 55          title = project_identifier + row_page["title"]
 56          titles << title
 57  
 58          results_contents.each do |row_content|
 59            page = Page.new(build_properties(title, row_content))
 60            revisions << page
 61          end
 62        end
 63  
 64        def add_projects_as_namespaces
 65          projects.each do |row_project|
 66            namespace = {identifier: row_project["identifier"],
 67                         name: row_project["name"]}
 68            namespaces << namespace
 69          end
 70        end
 71  
 72        def authors_query
 73          "SELECT id, login, mail FROM users;"
 74        end
 75  
 76        def single_page_query(page_id)
 77          "SELECT * FROM wiki_content_versions WHERE page_id='#{page_id}' ORDER BY updated_on;"
 78        end
 79  
 80        def projects_query
 81          "SELECT id, identifier, name FROM projects;"
 82        end
 83  
 84        def pages_query
 85          "SELECT id, title, wiki_id FROM wiki_pages;"
 86        end
 87  
 88        def wikis_query
 89          "SELECT id, project_id FROM wikis;"
 90        end
 91  
 92        def pages
 93          @pages ||= database.query(pages_query)
 94        end
 95  
 96        def projects
 97          @projects ||= database.query(projects_query)
 98        end
 99  
100        def wikis
101          @wikis ||= database.query(wikis_query)
102        end
103  
104        def build_properties(title, row_content)
105          author = authors.fetch(row_content["author_id"], nil)
106          {
107            id: row_content["id"],
108            title:,
109            body: row_content["data"],
110            markup: :textile,
111            latest: false,
112            time: row_content["updated_on"],
113            message: row_content["comments"],
114            author:
115          }
116        end
117      end
118    end
119  end