metamaps--metamaps/app/models/topic.rb
2014-07-07 21:02:43 -04:00

275 lines
8.9 KiB
Ruby

class Topic < ActiveRecord::Base
include TopicsHelper
belongs_to :user
has_many :synapses1, :class_name => 'Synapse', :foreign_key => 'node1_id'
has_many :synapses2, :class_name => 'Synapse', :foreign_key => 'node2_id'
has_many :topics1, :through => :synapses2, :source => :topic1
has_many :topics2, :through => :synapses1, :source => :topic2
has_many :mappings
has_many :maps, :through => :mappings
# This method associates the attribute ":image" with a file attachment
has_attached_file :image
#, styles: {
# thumb: '100x100>',
# square: '200x200#',
# medium: '300x300>'
#}
# Validate the attached image is image/jpg, image/png, etc
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
# This method associates the attribute ":image" with a file attachment
has_attached_file :audio
# Validate the attached audio is audio/wav, audio/mp3, etc
validates_attachment_content_type :audio, :content_type => /\Aaudio\/.*\Z/
def synapses
synapses1 + synapses2
end
def relatives
topics1 + topics2
end
belongs_to :metacode
# sends push updates through redis to websockets for realtime updates
def message action, origin_user_id
return if self.permission == "private" and action == "create"
#get array of all maps topic appears in
@maps = self.maps
#sends update to all maps that topic appears in who have realtime on
@maps.each do |map|
msg = { origin: origin_user_id,
mapid: map.id,
resource: 'Topic',
action: action,
id: self.id,
obj: self.selfonmap_as_json(map.id).html_safe }
$redis.publish 'maps', msg.to_json
end
end
def topic_autocomplete_method
"Get: #{self.name}"
end
def mk_permission
if self.permission == "commons"
"co"
elsif self.permission == "public"
"pu"
elsif self.permission == "private"
"pr"
end
end
# has no viewable synapses helper function
def has_viewable_synapses(current)
result = false
self.synapses.each do |synapse|
if synapse.authorize_to_view(current)
result = true
end
end
return result
end
###### JSON ######
def self_as_json
Jbuilder.encode do |json|
@inmaps = Array.new
@mapsString = ""
self.maps.each_with_index do |map, index|
@inmaps.push(map.id)
@mapsString += map.name
@mapsString += (index+1) == self.maps.count ? "" : ", "
end
@topicdata = Hash.new
@topicdata['$desc'] = self.desc
@topicdata['$link'] = self.link
@topicdata['$metacode'] = self.metacode.name
@topicdata['$inmaps'] = @inmaps
@topicdata['$inmapsString'] = @mapsString
@topicdata['$synapseCount'] = self.synapses.count
@topicdata['$userid'] = self.user.id
@topicdata['$username'] = self.user.name
@topicdata['$permission'] = self.permission
@topicdata['$date'] = self.created_at.strftime("%m/%d/%Y")
json.data @topicdata
json.id self.id
json.name self.name
end
end
def selfonmap_as_json(mapid)
Jbuilder.encode do |json|
@inmaps = Array.new
@mapsString = ""
self.maps.each_with_index do |map, index|
@inmaps.push(map.id)
@mapsString += map.name
@mapsString += (index+1) == self.maps.count ? "" : ", "
end
@topicdata = Hash.new
@topicdata['$desc'] = self.desc
@topicdata['$link'] = self.link
@topicdata['$metacode'] = self.metacode.name
@topicdata['$inmaps'] = @inmaps
@topicdata['$inmapsString'] = @mapsString
@topicdata['$synapseCount'] = self.synapses.count
@topicdata['$userid'] = self.user.id
@topicdata['$username'] = self.user.name
@mapping = Mapping.find_by_topic_id_and_map_id(self.id,mapid)
@topicdata['$xloc'] = @mapping.xloc
@topicdata['$yloc'] = @mapping.yloc
@topicdata['$mappingid'] = @mapping.id
@topicdata['$permission'] = self.permission
@topicdata['$date'] = self.created_at.strftime("%m/%d/%Y")
json.data @topicdata
json.id self.id
json.name self.name
end
end
#build a json object of everything connected to a specified node
def network_as_json(current)
Jbuilder.encode do |json|
@topics = network(self,nil,1)
if @topics.count > 1
json.array!(@topics.delete_if{|topic| (not topic.authorize_to_view(current)) || (not topic.has_viewable_synapses(current))}) do |topic|
json.adjacencies topic.synapses1.delete_if{|synapse| (not @topics.include?(synapse.topic2)) || (not synapse.authorize_to_view(current)) || (not synapse.topic2.authorize_to_view(current)) } do |json, synapse|
json.nodeTo synapse.node2_id
json.nodeFrom synapse.node1_id
@synapsedata = Hash.new
@synapsedata['$alpha'] = 0.4
@synapsedata['$desc'] = synapse.desc
@synapsedata['$showDesc'] = false
@synapsedata['$category'] = synapse.category
@synapsedata['$id'] = synapse.id
@synapsedata['$userid'] = synapse.user.id
@synapsedata['$username'] = synapse.user.name
@synapsedata['$direction'] = [synapse.node1_id.to_s(), synapse.node2_id.to_s()]
@synapsedata['$permission'] = synapse.permission
json.data @synapsedata
end
@inmaps = Array.new
@mapsString = ""
topic.maps.each_with_index do |map, index|
@inmaps.push(map.id)
@mapsString += map.name
@mapsString += (index+1) == topic.maps.count ? "" : ", "
end
@topicdata = Hash.new
@topicdata['$desc'] = topic.desc
@topicdata['$link'] = topic.link
@topicdata['$metacode'] = topic.metacode.name
@topicdata['$inmaps'] = @inmaps
@topicdata['$inmapsString'] = @mapsString
@topicdata['$synapseCount'] = topic.synapses.count
@topicdata['$userid'] = topic.user.id
@topicdata['$username'] = topic.user.name
@topicdata['$permission'] = topic.permission
@topicdata['$date'] = topic.created_at.strftime("%m/%d/%Y")
json.data @topicdata
json.id topic.id
json.name topic.name
end
elsif @topics.count == 1
json.array!(@topics) do |topic|
@inmaps = Array.new
@mapsString = ""
topic.maps.each_with_index do |map, index|
@inmaps.push(map.id)
@mapsString += map.name
@mapsString += (index+1) == topic.maps.count ? "" : ", "
end
@topicdata = Hash.new
@topicdata['$desc'] = topic.desc
@topicdata['$link'] = topic.link
@topicdata['$metacode'] = topic.metacode.name
@topicdata['$inmaps'] = @inmaps
@topicdata['$inmapsString'] = @mapsString
@topicdata['$synapseCount'] = topic.synapses.count
@topicdata['$userid'] = topic.user.id
@topicdata['$username'] = topic.user.name
@topicdata['$permission'] = topic.permission
@topicdata['$date'] = topic.created_at.strftime("%m/%d/%Y")
json.data @topicdata
json.id topic.id
json.name topic.name
end
end
end
end
##### PERMISSIONS ######
scope :visibleToUser, lambda { |current, user|
if user != nil
if user != current
Topic.find_all_by_user_id_and_permission(user.id, "commons") | Topic.find_all_by_user_id_and_permission(user.id, "public")
elsif user == current
Topic.find_all_by_user_id_and_permission(user.id, "commons") | Topic.find_all_by_user_id_and_permission(user.id, "public") | current.topics.where(:permission => "private")
end
elsif (current != nil && user == nil)
Topic.find_all_by_permission("commons") | Topic.find_all_by_permission("public") | current.topics.where(:permission => "private")
elsif (current == nil)
Topic.find_all_by_permission("commons") | Topic.find_all_by_permission("public")
end
}
# returns false if user not allowed to 'show' Topic, Synapse, or Map
def authorize_to_show(user)
if (self.permission == "private" && self.user != user)
return false
end
return self
end
# returns false if user not allowed to 'edit' Topic, Synapse, or Map
def authorize_to_edit(user)
if (self.permission == "private" && self.user != user)
return false
elsif (self.permission == "public" && self.user != user)
return false
end
return self
end
# returns Boolean if user allowed to view Topic, Synapse, or Map
def authorize_to_view(user)
if (self.permission == "private" && self.user != user)
return false
end
return true
end
# returns Boolean based on whether user has permissions to edit or not
def authorize_linkto_edit(user)
if (self.user == user)
return true
elsif (self.permission == "commons")
return true
end
return false
end
end