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