2016-02-03 13:38:41 +00:00
class TopicsController < ApplicationController
include TopicsHelper
2016-02-28 09:48:18 +00:00
before_action :require_user , only : [ :create , :update , :destroy ]
2016-02-03 13:38:41 +00:00
respond_to :html , :js , :json
# GET /topics/autocomplete_topic
def autocomplete_topic
term = params [ :term ]
if term && ! term . empty?
@topics = Topic . where ( 'LOWER("name") like ?' , term . downcase + '%' ) . order ( '"name"' )
#read this next line as 'delete a topic if its private and you're either
#1. logged out or 2. logged in but not the topic creator
@topics . to_a . delete_if { | t | t . permission == " private " &&
2016-02-28 08:53:59 +00:00
( ! authenticated? || ( authenticated? && current_user . id != t . user_id ) ) }
2016-02-03 13:38:41 +00:00
else
@topics = [ ]
end
render json : autocomplete_array_json ( @topics )
end
# GET topics/:id
def show
2016-02-28 08:53:59 +00:00
@topic = Topic . find ( params [ :id ] ) . authorize_to_show ( current_user )
2016-02-03 13:38:41 +00:00
if not @topic
redirect_to root_url , notice : " Access denied. That topic is private. " and return
end
respond_to do | format |
format . html {
2016-02-28 08:53:59 +00:00
@alltopics = ( [ @topic ] + @topic . relatives ) . delete_if { | t | t . permission == " private " && ( ! authenticated? || ( authenticated? && current_user . id != t . user_id ) ) } # should limit to topics visible to user
@allsynapses = @topic . synapses . to_a . delete_if { | s | s . permission == " private " && ( ! authenticated? || ( authenticated? && current_user . id != s . user_id ) ) }
2016-02-03 13:38:41 +00:00
@allcreators = [ ]
@alltopics . each do | t |
if @allcreators . index ( t . user ) == nil
@allcreators . push ( t . user )
end
end
@allsynapses . each do | s |
if @allcreators . index ( s . user ) == nil
@allcreators . push ( s . user )
end
end
respond_with ( @allsynapses , @alltopics , @allcreators , @topic )
}
format . json { render json : @topic }
end
end
# GET topics/:id/network
def network
2016-02-28 08:53:59 +00:00
@topic = Topic . find ( params [ :id ] ) . authorize_to_show ( current_user )
2016-02-03 13:38:41 +00:00
if not @topic
redirect_to root_url , notice : " Access denied. That topic is private. " and return
end
2016-02-28 08:53:59 +00:00
@alltopics = @topic . relatives . to_a . delete_if { | t | t . permission == " private " && ( ! authenticated? || ( authenticated? && current_user . id != t . user_id ) ) }
@allsynapses = @topic . synapses . to_a . delete_if { | s | s . permission == " private " && ( ! authenticated? || ( authenticated? && current_user . id != s . user_id ) ) }
2016-02-03 13:38:41 +00:00
@allcreators = [ ]
@allcreators . push ( @topic . user )
@alltopics . each do | t |
if @allcreators . index ( t . user ) == nil
@allcreators . push ( t . user )
end
end
@allsynapses . each do | s |
if @allcreators . index ( s . user ) == nil
@allcreators . push ( s . user )
end
end
@json = Hash . new ( )
@json [ 'topic' ] = @topic
@json [ 'creators' ] = @allcreators
@json [ 'relatives' ] = @alltopics
@json [ 'synapses' ] = @allsynapses
respond_to do | format |
format . json { render json : @json }
end
end
# GET topics/:id/relative_numbers
def relative_numbers
2016-02-28 08:53:59 +00:00
@topic = Topic . find ( params [ :id ] ) . authorize_to_show ( current_user )
2016-02-03 13:38:41 +00:00
if not @topic
redirect_to root_url , notice : " Access denied. That topic is private. " and return
end
@topicsAlreadyHas = params [ :network ] ? params [ :network ] . split ( ',' ) : [ ]
@alltopics = @topic . relatives . to_a . delete_if { | t |
@topicsAlreadyHas . index ( t . id . to_s ) != nil ||
2016-02-28 08:53:59 +00:00
( t . permission == " private " && ( ! authenticated? || ( authenticated? && current_user . id != t . user_id ) ) )
2016-02-03 13:38:41 +00:00
}
@alltopics . uniq!
@json = Hash . new ( )
@alltopics . each do | t |
if @json [ t . metacode . id ]
@json [ t . metacode . id ] += 1
else
@json [ t . metacode . id ] = 1
end
end
respond_to do | format |
format . json { render json : @json }
end
end
# GET topics/:id/relatives
def relatives
2016-02-28 08:53:59 +00:00
@topic = Topic . find ( params [ :id ] ) . authorize_to_show ( current_user )
2016-02-03 13:38:41 +00:00
if not @topic
redirect_to root_url , notice : " Access denied. That topic is private. " and return
end
@topicsAlreadyHas = params [ :network ] ? params [ :network ] . split ( ',' ) : [ ]
@alltopics = @topic . relatives . to_a . delete_if { | t |
@topicsAlreadyHas . index ( t . id . to_s ) != nil ||
( params [ :metacode ] && t . metacode_id . to_s != params [ :metacode ] ) ||
2016-02-28 08:53:59 +00:00
( t . permission == " private " && ( ! authenticated? || ( authenticated? && current_user . id != t . user_id ) ) )
2016-02-03 13:38:41 +00:00
}
@alltopics . uniq!
@allsynapses = @topic . synapses . to_a . delete_if { | s |
( s . topic1 == @topic && @alltopics . index ( s . topic2 ) == nil ) ||
( s . topic2 == @topic && @alltopics . index ( s . topic1 ) == nil )
}
@creatorsAlreadyHas = params [ :creators ] ? params [ :creators ] . split ( ',' ) : [ ]
@allcreators = [ ]
@alltopics . each do | t |
if @allcreators . index ( t . user ) == nil && @creatorsAlreadyHas . index ( t . user_id . to_s ) == nil
@allcreators . push ( t . user )
end
end
@allsynapses . each do | s |
if @allcreators . index ( s . user ) == nil && @creatorsAlreadyHas . index ( s . user_id . to_s ) == nil
@allcreators . push ( s . user )
end
end
@json = Hash . new ( )
@json [ 'topics' ] = @alltopics
@json [ 'synapses' ] = @allsynapses
@json [ 'creators' ] = @allcreators
respond_to do | format |
format . json { render json : @json }
end
end
# POST /topics
# POST /topics.json
def create
@topic = Topic . new ( topic_params )
respond_to do | format |
if @topic . save
format . json { render json : @topic , status : :created }
else
format . json { render json : @topic . errors , status : :unprocessable_entity }
end
end
end
# PUT /topics/1
# PUT /topics/1.json
def update
@topic = Topic . find ( params [ :id ] )
respond_to do | format |
if @topic . update_attributes ( topic_params )
format . json { head :no_content }
else
format . json { render json : @topic . errors , status : :unprocessable_entity }
end
end
end
# DELETE topics/:id
def destroy
2016-02-28 08:53:59 +00:00
@topic = Topic . find ( params [ :id ] ) . authorize_to_delete ( current_user )
2016-02-03 13:38:41 +00:00
@topic . delete if @topic
respond_to do | format |
format . json { head :no_content }
end
end
private
def topic_params
params . require ( :topic ) . permit ( :id , :name , :desc , :link , :permission , :user_id , :metacode_id )
end
end