🏡 index : github.com/captn3m0/outliner.git

#!/usr/bin/env ruby
# frozen_string_literal: true

require 'bundler/setup'
require 'outliner'

def validate
  raise 'Missing arguments' if ARGV.size != 2
  raise 'Invalid directory' unless Dir.exist?(ARGV[0])
  raise 'Invalid collection' unless ARGV[1].match(/\w+/)
  raise 'OUTLINE_BASE_URI not set' unless ENV.key?('OUTLINE_BASE_URI')
  raise 'OUTLINE_TOKEN not set' unless ENV.key?('OUTLINE_TOKEN')
end

def create_documents_recursively(directory, collection_id, parent_document_id = nil)
  cwd = Dir.pwd
  Dir.chdir directory
  # Create all documents for this directory
  Dir['*.md'].each do |file|
    params = {
      title: file[0...-3],
      text: file[0...-3] +
            "\n" +
            File.read(file) +
            "\n\n---\nImported at #{Time.now}",
      collectionId: collection_id,
      publish: true
    }

    params[:parentDocumentId] = parent_document_id if parent_document_id
    CLIENT.documents__create(params)
    puts "[-] #{file}"
  end

  # Create child documents for each sub-directory
  Dir.glob('*').select { |f| File.directory? f }.each do |dir|
    puts "[-] #{dir}"
    params = {
      title: dir,
      text: dir + "\nImported at #{Time.now}",
      collectionId: collection_id,
      publish: true,
      parentDocumentId: parent_document_id
    }
    response = CLIENT.documents__create(params)
    create_documents_recursively(dir, collection_id, response['data']['id'])
  end
  Dir.chdir cwd
end

# Run validations
validate

# Setup variables
local_directory = ARGV[0]
remote_collection_name = ARGV[1]

# Create a root collection
CLIENT = Outliner::Client.new ENV['OUTLINE_BASE_URI']
root_collection_id = CLIENT.find_or_create_collection(remote_collection_name)

begin
  create_documents_recursively(local_directory, root_collection_id)
  puts '[S] Import successful'
rescue StandardError? => e
  # If we fail, print an error, and delete the collection
  puts "[E] Import failed with error: #{e.message}"
  CLIENT.collections__delete(id: root_collection_id)
  puts '[E] Deleted collection, please report the issue or retry'
  exit 1
end