metamaps--metamaps/app/services/map_export_service.rb

113 lines
2.9 KiB
Ruby
Raw Permalink Normal View History

2016-09-24 03:00:46 +00:00
# frozen_string_literal: true
2017-11-06 16:15:18 +00:00
2016-09-24 04:27:34 +00:00
class MapExportService
attr_reader :user, :map, :base_url
def initialize(user, map, opts = {})
2016-09-24 04:27:34 +00:00
@user = user
@map = map
@base_url = opts[:base_url] || 'https://metamaps.cc'
2016-09-24 04:27:34 +00:00
end
2016-03-26 03:31:55 +00:00
def json
# marshal_dump turns OpenStruct into a Hash
{
topics: exportable_topics.map(&:marshal_dump),
synapses: exportable_synapses.map(&:marshal_dump)
2016-03-26 03:31:55 +00:00
}
end
def csv(options = {})
CSV.generate(options) do |csv|
to_spreadsheet.each do |line|
csv << line
end
end
end
def rdf
output = ''
output += "PREFIX d: <#{base_url}/maps/#{map.id}>\n"
output += "PREFIX mm: <#{base_url}/owl/map.owl.ttl>\n"
output += "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
output += "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n"
output += "\n"
map.contributors.each do |mapper|
output += mapper.as_rdf(base_url: base_url)
end
map.topics.each do |topic|
output += topic.as_rdf
end
map.synapses.each do |synapse|
output += synapse.as_rdf
end
output
end
2016-03-26 03:31:55 +00:00
private
def topic_headings
2017-11-06 16:15:18 +00:00
%i(id name metacode x y description link user permission)
2016-03-26 03:31:55 +00:00
end
2016-03-26 03:31:55 +00:00
def synapse_headings
2017-11-06 16:15:18 +00:00
%i(topic1 topic2 category description user permission)
2016-03-26 03:31:55 +00:00
end
def exportable_topics
visible_topics ||= Pundit.policy_scope!(user, map.topics)
2017-11-06 16:15:18 +00:00
topic_mappings = Mapping.includes(mappable: %i(metacode user))
.where(mappable: visible_topics, map: map)
2016-03-26 03:31:55 +00:00
topic_mappings.map do |mapping|
topic = mapping.mappable
next nil if topic.nil?
2016-03-26 03:31:55 +00:00
OpenStruct.new(
id: topic.id,
name: topic.name,
metacode: topic.metacode.name,
x: mapping.xloc,
y: mapping.yloc,
description: topic.desc,
link: topic.link,
user: topic.user.name,
permission: topic.permission
)
end.compact
2016-03-26 03:31:55 +00:00
end
def exportable_synapses
visible_synapses = Pundit.policy_scope!(user, map.synapses)
2016-03-26 03:31:55 +00:00
visible_synapses.map do |synapse|
next nil if synapse.nil?
2016-03-26 03:31:55 +00:00
OpenStruct.new(
topic1: synapse.topic1_id,
topic2: synapse.topic2_id,
2016-03-26 03:31:55 +00:00
category: synapse.category,
description: synapse.desc,
user: synapse.user.name,
permission: synapse.permission
)
end.compact
2016-03-26 03:31:55 +00:00
end
def to_spreadsheet
spreadsheet = []
spreadsheet << ['Topics']
spreadsheet << topic_headings.map(&:capitalize)
2016-03-26 03:31:55 +00:00
exportable_topics.each do |topics|
# convert exportable_topics into an array of arrays
spreadsheet << topic_headings.map { |h| topics.send(h) }
2016-03-26 03:31:55 +00:00
end
spreadsheet << []
spreadsheet << ['Synapses']
spreadsheet << synapse_headings.map(&:capitalize)
2016-03-26 03:31:55 +00:00
exportable_synapses.each do |synapse|
# convert exportable_synapses into an array of arrays
spreadsheet << synapse_headings.map { |h| synapse.send(h) }
2016-03-26 03:31:55 +00:00
end
spreadsheet
end
end