2013-02-05 14:16:51 -05:00
# A class we can use to serialize the site data
require_dependency 'score_calculator'
require_dependency 'trust_level'
class Site
include ActiveModel :: Serialization
2013-05-13 18:04:03 +10:00
def initialize ( guardian )
@guardian = guardian
end
2013-02-05 14:16:51 -05:00
def site_setting
SiteSetting
end
def notification_types
2013-03-01 15:07:44 +03:00
Notification . types
2013-02-05 14:16:51 -05:00
end
def trust_levels
TrustLevel . all
end
2013-02-07 16:45:24 +01:00
2014-09-26 14:48:34 -04:00
def user_fields
UserField . all
end
2013-02-05 14:16:51 -05:00
def categories
2013-07-16 15:44:07 +10:00
@categories || = begin
categories = Category
. secured ( @guardian )
2015-09-28 16:49:39 +10:00
. joins ( 'LEFT JOIN topics t on t.id = categories.topic_id' )
2015-09-28 16:43:38 +10:00
. select ( 'categories.*, t.slug topic_slug' )
2013-11-06 16:56:49 -05:00
. order ( :position )
2015-02-20 17:30:31 +11:00
categories = categories . to_a
2013-07-16 15:44:07 +10:00
2015-09-23 13:13:34 +10:00
with_children = Set . new
categories . each do | c |
if c . parent_category_id
with_children << c . parent_category_id
end
end
2015-09-28 16:43:38 +10:00
allowed_topic_create_ids =
@guardian . anonymous? ? [ ] : Category . topic_create_allowed ( @guardian ) . pluck ( :id )
allowed_topic_create = Set . new ( allowed_topic_create_ids )
2013-07-16 15:44:07 +10:00
2014-02-24 14:52:21 -05:00
by_id = { }
2014-04-17 11:17:39 +02:00
2014-06-18 11:21:53 +10:00
category_user = { }
unless @guardian . anonymous?
category_user = Hash [ * CategoryUser . where ( user : @guardian . user ) . pluck ( :category_id , :notification_level ) . flatten ]
end
2015-12-20 17:47:02 +11:00
regular = CategoryUser . notification_levels [ :regular ]
2014-06-18 11:21:53 +10:00
categories . each do | category |
2015-12-20 17:47:02 +11:00
category . notification_level = category_user [ category . id ] || regular
2013-07-16 15:44:07 +10:00
category . permission = CategoryGroup . permission_types [ :full ] if allowed_topic_create . include? ( category . id )
2015-09-23 13:13:34 +10:00
category . has_children = with_children . include? ( category . id )
2014-02-24 14:52:21 -05:00
by_id [ category . id ] = category
2013-07-16 15:44:07 +10:00
end
2014-02-24 14:52:21 -05:00
2015-09-02 23:46:04 +02:00
categories . reject! { | c | c . parent_category_id && ! by_id [ c . parent_category_id ] }
2013-07-16 15:44:07 +10:00
categories
end
2013-02-07 16:45:24 +01:00
end
2013-02-05 14:16:51 -05:00
2015-09-03 19:18:46 +02:00
def suppressed_from_homepage_category_ids
categories . select { | c | c . suppress_from_homepage == true } . map ( & :id )
end
2013-02-05 14:16:51 -05:00
def archetypes
2013-02-28 21:54:12 +03:00
Archetype . list . reject { | t | t . id == Archetype . private_message }
2013-02-05 14:16:51 -05:00
end
2014-02-24 14:24:18 -05:00
def self . json_for ( guardian )
2013-10-15 09:50:30 +11:00
if guardian . anonymous? && SiteSetting . login_required
2014-01-20 14:41:11 +01:00
return {
periods : TopTopic . periods . map ( & :to_s ) ,
filters : Discourse . filters . map ( & :to_s ) ,
2015-08-17 21:44:08 +02:00
user_fields : UserField . all . map do | userfield |
UserFieldSerializer . new ( userfield , root : false , scope : guardian )
end
2014-01-20 14:41:11 +01:00
} . to_json
2013-10-15 09:50:30 +11:00
end
2015-09-28 16:44:03 +10:00
seq = nil
if guardian . anonymous?
seq = MessageBus . last_id ( '/site_json' )
cached_json , cached_seq , cached_version = $redis . mget ( 'site_json' , 'site_json_seq' , 'site_json_version' )
if cached_json && seq == cached_seq . to_i && Discourse . git_version == cached_version
return cached_json
end
end
2013-05-13 18:04:03 +10:00
site = Site . new ( guardian )
2015-09-28 16:44:03 +10:00
json = MultiJson . dump ( SiteSerializer . new ( site , root : false , scope : guardian ) )
if guardian . anonymous?
$redis . multi do
$redis . setex 'site_json' , 1800 , json
$redis . set 'site_json_seq' , seq
$redis . set 'site_json_version' , Discourse . git_version
end
end
json
end
def self . clear_anon_cache!
# publishing forces the sequence up
# the cache is validated based on the sequence
MessageBus . publish ( '/site_json' , '' )
2013-02-05 14:16:51 -05:00
end
end