# frozen_string_literal: true require "csv" require File.expand_path(File.dirname(__FILE__) + "/base.rb") # Edit the constants and initialize method for your import data. class ImportScripts::JsonGeneric < ImportScripts::Base JSON_FILE_PATH = ENV["JSON_FILE"] BATCH_SIZE = 1000 def initialize super @imported_json = load_json end def execute puts "", "Importing from JSON file..." import_users import_discussions puts "", "Done" end def load_json JSON.parse(File.read(JSON_FILE_PATH)) end def username_for(name) result = name.downcase.gsub(/[^a-z0-9\-\_]/, "") result = Digest::SHA1.hexdigest(name)[0...10] if result.blank? result end def import_users puts "", "Importing users" users = [] @imported_json["topics"].each { |t| t["posts"].each { |p| users << p["author"].scrub } } users.uniq! create_users(users) do |u| { id: username_for(u), username: username_for(u), name: u, email: "#{username_for(u)}@example.com", created_at: Time.now, } end end def import_discussions puts "", "Importing discussions" topics = 0 posts = 0 @imported_json["topics"].each do |t| first_post = t["posts"][0] next unless first_post topic = { id: t["id"], user_id: user_id_from_imported_user_id(username_for(first_post["author"])) || -1, raw: first_post["body"], created_at: Time.zone.parse(first_post["date"]), cook_method: Post.cook_methods[:raw_html], title: t["title"], category: ENV["CATEGORY_ID"], custom_fields: { import_id: "pid:#{first_post["id"]}", }, } topic[:pinned_at] = Time.zone.parse(first_post["date"]) if t["pinned"] topics += 1 parent_post = create_post(topic, topic[:id]) t["posts"][1..-1].each do |p| create_post( { id: p["id"], topic_id: parent_post.topic_id, user_id: user_id_from_imported_user_id(username_for(p["author"])) || -1, raw: p["body"], created_at: Time.zone.parse(p["date"]), cook_method: Post.cook_methods[:raw_html], custom_fields: { import_id: "pid:#{p["id"]}", }, }, p["id"], ) posts += 1 end end puts "", "Imported #{topics} topics with #{topics + posts} posts." end end ImportScripts::JsonGeneric.new.perform if __FILE__ == $0