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

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

require 'bundler/setup'
require 'outliner'
require 'tempfile'

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

# Run validations
validate

# Setup variables
local_directory = ARGV[0]
CLIENT = Outliner::Client.new ENV['OUTLINE_BASE_URI']

# Download the complete zip
response = CLIENT.collections__export_all(format: "outline-markdown")

raise 'Failed to trigger export_all action' if not response['success']

file_operation_id = response['data']['fileOperation']['id']
fop_info_response = nil
i = 0
loop do
  i += 1
  raise 'Timed out waiting for the file export operation to complete' if i > 20
  sleep(2*i)
  fop_info_response = CLIENT.fileOperations__info(id: file_operation_id)
  raise 'Failed to query export file operation info' if not fop_info_response['ok']
  break if fop_info_response['data']['state'] == 'complete'
end

begin
  fop_redirect_response = CLIENT.fileOperations__redirect({id: file_operation_id}, {no_follow: true})
rescue HTTParty::RedirectionTooDeep => e
  response = HTTParty.get e.response.header['location']
  file = Tempfile.new('download.zip')
  File.open(file.path, 'w') { |f| f.write(response.body) }
  `unzip -o "#{file.path}" -d "#{local_directory}"`
  file.unlink
end