Class: Caboose::Site

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/caboose/site.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.id_for_domain(domain) ⇒ Object



148
149
150
151
152
# File 'app/models/caboose/site.rb', line 148

def self.id_for_domain(domain)
  d = Caboose::Domain.where(:domain => domain).first
  return nil if d.nil?
  return d.site_id
end

.sanitize_name(name) ⇒ Object



158
159
160
# File 'app/models/caboose/site.rb', line 158

def self.sanitize_name(name)
  self.name = self.name.downcase.gsub(' ', '_')
end

Instance Method Details

#build_new_siteObject



99
100
101
102
103
104
105
# File 'app/models/caboose/site.rb', line 99

def build_new_site
 # if defined?(SuiteBuilder) == 'constant' && SuiteBuilder.class == Class  
    helper = Caboose::SiteBuilder.new(self.name)
    helper.create_site_blocks(self.id)
 # end
#  self.init_users_and_roles
end

Caching



260
261
262
263
264
265
266
267
268
269
270
# File 'app/models/caboose/site.rb', line 260

def cached_footer_css
  str = ''
  return str if !self.use_caching
  index_page = Caboose::Page.index_page(self.id)
  footer_ids = Caboose::Page.home_page_footer_block_ids(index_page)
  blocks = Caboose::Block.includes(:block_type).where("blocks.parent_id in (?)",footer_ids).where("blocks.cached_css IS NOT NULL").where("block_types.is_dynamic = false").order("blocks.id").all
  blocks.each do |b|
    str << b.cached_css
  end
  return str.blank? ? '' : str.gsub(/<\/style>(\s*)<style>/,'')
end


272
273
274
275
276
277
278
279
280
281
282
283
# File 'app/models/caboose/site.rb', line 272

def cached_footer_js
  str = ''
  return str if !self.use_caching
  index_page = Caboose::Page.index_page(self.id)
  footer_ids = Caboose::Page.home_page_footer_block_ids(index_page)
  blocks = Caboose::Block.includes(:block_type).where("blocks.parent_id in (?)",footer_ids).where("blocks.cached_js IS NOT NULL").where("block_types.is_dynamic = false").order("blocks.id").all
  blocks.each do |b|
    str << b.cached_js
  end
  host = Rails.env.production? ? "https://#{ActionController::Base.asset_host}" : ""
  return str.blank? ? '' : str.gsub('"/assets/',"\"#{host}/assets/")
end

#custom_cssObject



196
197
198
199
200
201
202
# File 'app/models/caboose/site.rb', line 196

def custom_css    
  resp = HTTParty.get('https:' + self.custom_css_url)
  if resp.nil? || resp.code.to_i == 403
    return ""            
  end
  return resp.body    
end

#custom_css=(str) ⇒ Object



213
214
215
216
217
218
219
220
# File 'app/models/caboose/site.rb', line 213

def custom_css=(str)    
  config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
  AWS.config(:access_key_id => config['access_key_id'], :secret_access_key => config['secret_access_key'])
  bucket =  AWS::S3.new.buckets[config['bucket']]                         
  bucket.objects["assets/#{self.name}/css/custom.css"].write(str, :acl => 'public-read', :content_type => 'text/css')                        
  self.date_css_updated = DateTime.now.utc
  self.save
end

#custom_css_urlObject



182
183
184
185
186
# File 'app/models/caboose/site.rb', line 182

def custom_css_url
  url = "//#{Caboose::cdn_domain}/assets/#{self.name}/css/custom.css"
  url << "?#{self.date_css_updated.strftime('%Y%m%d%H%M%S')}" if self.date_css_updated
  return url
end

#custom_jsObject



188
189
190
191
192
193
194
# File 'app/models/caboose/site.rb', line 188

def custom_js
  resp = HTTParty.get('https:' + self.custom_js_url)
  if resp.nil? || resp.code.to_i == 403
    return ""            
  end
  return resp.body    
end

#custom_js=(str) ⇒ Object



204
205
206
207
208
209
210
211
# File 'app/models/caboose/site.rb', line 204

def custom_js=(str)    
  config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
  AWS.config(:access_key_id => config['access_key_id'], :secret_access_key => config['secret_access_key'])
  bucket =  AWS::S3.new.buckets[config['bucket']]                         
  bucket.objects["assets/#{self.name}/js/custom.js"].write(str, :acl => 'public-read', :content_type => 'application/javascript')                        
  self.date_js_updated = DateTime.now.utc
  self.save
end

#custom_js_urlObject



176
177
178
179
180
# File 'app/models/caboose/site.rb', line 176

def custom_js_url
  url = "//#{Caboose::cdn_domain}/assets/#{self.name}/js/custom.js"
  url << "?#{self.date_js_updated.strftime('%Y%m%d%H%M%S')}" if self.date_js_updated
  return url
end

#default_layoutObject



113
114
115
116
# File 'app/models/caboose/site.rb', line 113

def default_layout    
  return Caboose::BlockType.where(:id => self.default_layout_id).first if self.default_layout_id
  return Caboose::BlockType.where(:name => 'layout_basic').first
end

#dev_domainObject



162
163
164
# File 'app/models/caboose/site.rb', line 162

def dev_domain
  Caboose::Domain.where(:site_id => self.id).where("domain LIKE ?","dev.%").first
end


308
309
310
# File 'app/models/caboose/site.rb', line 308

def footer_css_path(digest = self.footer_css_digest)
  return "assets/sites/site_#{self.id}_footer_#{digest}.css"
end


312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
# File 'app/models/caboose/site.rb', line 312

def footer_css_url
  rad = rand(999)
  old = "/api/generate-asset/site_#{self.id}.css?#{rad}"
  return old if self.footer_css_digest.blank?
  if Rails.env.production?
    return "https://#{Caboose::cdn_domain}/#{footer_css_path}"
  else
    path = File.join(Rails.root, 'public', "#{footer_css_path}")
    if File.file?(path)
      return "#{ActionController::Base.asset_host}/#{footer_css_path}"
    else
      return "https://#{Caboose::cdn_domain}/#{footer_css_path}"
    end
  end
end


366
367
368
# File 'app/models/caboose/site.rb', line 366

def footer_js_path(digest = self.footer_js_digest)
  return "assets/sites/site_#{self.id}_footer_#{digest}.js"
end


370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
# File 'app/models/caboose/site.rb', line 370

def footer_js_url
  rad = rand(999)
  old = "/api/generate-asset/site_#{self.id}.js?#{rad}"
  return old if self.footer_js_digest.blank?
  if Rails.env.production?
    return "https://#{Caboose::cdn_domain}/#{footer_js_path}"
  else
    path = File.join(Rails.root, 'public', "#{footer_js_path}")
    if File.file?(path)
      return "#{ActionController::Base.asset_host}/#{footer_js_path}"
    else
      return "https://#{Caboose::cdn_domain}/#{footer_js_path}"
    end
  end
end

#init_users_and_rolesObject



222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# File 'app/models/caboose/site.rb', line 222

def init_users_and_roles
      
  admin_user = Caboose::User.where( :site_id => self.id, :username => 'admin').first    
  admin_user = Caboose::User.create(:site_id => self.id, :username => 'admin', :email => '[email protected]', :password => Digest::SHA1.hexdigest(Caboose::salt + 'caboose')) if admin_user.nil?                          
  admin_role = Caboose::Role.where( :site_id => self.id, :name => 'Admin').first    
  admin_role = Caboose::Role.create(:site_id => self.id, :parent_id => -1, :name => 'Admin') if admin_role.nil?    
  elo_user   = Caboose::User.where( :site_id => self.id, :username => 'elo').first    
  elo_user   = Caboose::User.create(:site_id => self.id, :username => 'elo', :email => '[email protected]') if elo_user.nil?    
  elo_role   = Caboose::Role.where( :site_id => self.id, :name => 'Everyone Logged Out').first
  elo_role   = Caboose::Role.create(:site_id => self.id, :name => 'Everyone Logged Out', :parent_id => -1) if elo_role.nil?    
  eli_user   = Caboose::User.where( :site_id => self.id, :username => 'eli').first    
  eli_user   = Caboose::User.create(:site_id => self.id, :username => 'eli', :email => '[email protected]') if eli_user.nil?    
  eli_role   = Caboose::Role.where( :site_id => self.id, :name => 'Everyone Logged In').first
  eli_role   = Caboose::Role.create(:site_id => self.id, :name => 'Everyone Logged In', :parent_id => elo_role.id) if eli_role.nil?
  
  # Make sure the admin role has the admin "all" permission
  admin_perm = Caboose::Permission.where(:resource => 'all', :action => 'all').first
  rp = Caboose::RolePermission.where(:role_id => admin_role.id, :permission_id => admin_perm.id).first
  rp = Caboose::RolePermission.create(:role_id => admin_role.id, :permission_id => admin_perm.id) if rp.nil?
  
  # Make sure the admin user is a member of the admin role 
  rm = Caboose::RoleMembership.where(:role_id => admin_role.id, :user_id => admin_user.id).first
  rm = Caboose::RoleMembership.create(:role_id => admin_role.id, :user_id => admin_user.id) if rm.nil?
  
  # Make sure the elo user is a member of the elo role
  rm = Caboose::RoleMembership.where( :role_id => elo_role.id, :user_id => elo_user.id).first
  rm = Caboose::RoleMembership.create(:role_id => elo_role.id, :user_id => elo_user.id) if rm.nil?
  
  # Make sure the eli user is a member of the eli role
  rm = Caboose::RoleMembership.where( :role_id => eli_role.id, :user_id => eli_user.id).first
  rm = Caboose::RoleMembership.create(:role_id => eli_role.id, :user_id => eli_user.id) if rm.nil?
      
end

#primary_domainObject



172
173
174
# File 'app/models/caboose/site.rb', line 172

def primary_domain
  Caboose::Domain.where(:site_id => self.id, :primary => true).first
end

#product_defaultObject



136
137
138
139
140
# File 'app/models/caboose/site.rb', line 136

def product_default
  pd = Caboose::ProductDefault.where(:site_id => self.id).first
  pd = Caboose::ProductDefault.create(:site_id => self.id) if pd.nil?
  return pd    
end

#public_domainObject



166
167
168
169
170
# File 'app/models/caboose/site.rb', line 166

def public_domain
  ms = Caboose::Site.where(:is_master => true).first
  md = Caboose::Domain.where(:site_id => ms.id, :primary => true).first if ms
  return md ? "#{self.name}.#{md.domain}" : "caboosecms.com"
end

#refresh_all_page_cachesObject



422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
# File 'app/models/caboose/site.rb', line 422

def refresh_all_page_caches
  if self.use_caching
    home_page = Caboose::Page.index_page(self.id)
    footer = home_page.block.child('footer')
    Caboose::Page.where(:site_id => self.id).order(:id).all.each do |page|
      content = page.block ? page.block.child('content') : nil
      block_ids = content ? Caboose::Block.where("parent_id = ?", content.id).pluck(:id) : []
      page.update_cached_blocks(block_ids)
      page.delay(:queue => 'caching', :priority => 8).update_css_file
      page.delay(:queue => 'caching', :priority => 8).update_js_file
    end
    footer_ids = Caboose::Block.where("parent_id = ?", footer.id).pluck(:id)
    home_page.update_cached_blocks(footer_ids)
    self.delay(:queue => 'caching', :priority => 9).update_footer_css_file
    self.delay(:queue => 'caching', :priority => 9).update_footer_js_file
  end
end


285
286
287
288
289
290
291
292
293
294
# File 'app/models/caboose/site.rb', line 285

def refresh_footer_css
  begin
    rad = rand(999)
    dom = Rails.env.production? ? self.public_domain : self.dev_domain.domain
    uri = URI("http://#{dom}/api/generate-asset/site_#{self.id}.css?#{rad}")
    css = Net::HTTP.get(uri)
  rescue
    Caboose.log("Couldn't generate site CSS")
  end
end


296
297
298
299
300
301
302
303
304
305
# File 'app/models/caboose/site.rb', line 296

def refresh_footer_js
  begin
    rad = rand(999)
    dom = Rails.env.production? ? self.public_domain : self.dev_domain.domain
    uri = URI("http://#{dom}/api/generate-asset/site_#{self.id}.js?#{rad}")
    css = Net::HTTP.get(uri)
  rescue
    Caboose.log("Couldn't generate site JS")
  end
end

#retargeting_configObject



130
131
132
133
134
# File 'app/models/caboose/site.rb', line 130

def retargeting_config
  c = Caboose::RetargetingConfig.where(:site_id => self.id).first
  c = Caboose::RetargetingConfig.create(:site_id => self.id) if c.nil?      
  return c      
end

#smtp_configObject



118
119
120
121
122
# File 'app/models/caboose/site.rb', line 118

def smtp_config
  c = Caboose::SmtpConfig.where(:site_id => self.id).first
  c = Caboose::SmtpConfig.create(:site_id => self.id) if c.nil?
  return c
end

#social_configObject



124
125
126
127
128
# File 'app/models/caboose/site.rb', line 124

def social_config
  s = Caboose::SocialConfig.where(:site_id => self.id).first
  s = Caboose::SocialConfig.create(:site_id => self.id) if s.nil?
  return s
end

#themeObject



79
80
81
# File 'app/models/caboose/site.rb', line 79

def theme
  Caboose::Theme.where(:id => self.theme_id).first
end

#update_cloudinary_faviconObject



91
92
93
94
95
96
97
# File 'app/models/caboose/site.rb', line 91

def update_cloudinary_favicon
  if Caboose::use_cloudinary
    result = Cloudinary::Uploader.upload("https:#{self.favicon.url(:thumb)}" , :public_id => "caboose/favicons/#{self.id}_thumb", :overwrite => true)
    self.cl_favicon_version = result['version'] if result && result['version']
    self.save
  end
end

#update_cloudinary_logoObject



83
84
85
86
87
88
89
# File 'app/models/caboose/site.rb', line 83

def 
  if Caboose::use_cloudinary
    result = Cloudinary::Uploader.upload("https:#{self..url(:large)}" , :public_id => "caboose/site_logos/#{self.id}_large", :overwrite => true)
    self.cl_logo_version = result['version'] if result && result['version']
    self.save
  end
end


328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
# File 'app/models/caboose/site.rb', line 328

def update_footer_css_file
  str = ""
  footer_css_digest = SecureRandom.urlsafe_base64.to_s
  old_digest = self.footer_css_digest
  css = self.refresh_footer_css
  if css && !css.blank?
    begin
      if Rails.env.production?
        config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
        AWS.config(:access_key_id => config['access_key_id'], :secret_access_key => config['secret_access_key'])
        bucket =  AWS::S3.new.buckets[config['bucket']]                         
        bucket.objects[self.footer_css_path(footer_css_digest)].write(css, :acl => 'public-read', :content_type => 'text/css', :cache_control => 'public, max-age=86400')
        if !old_digest.blank? && old_digest != 'empty'
          key = self.footer_css_path(old_digest)
          obj = bucket.objects[key]
          obj.delete
        end
      else
        file_path = File.join(Rails.root, 'public', 'assets', 'sites')
        FileUtils.mkdir_p(file_path) unless File.directory?(file_path)
        File.open(File.join(Rails.root, 'public', self.footer_css_path(footer_css_digest)), 'w') { |f| f.write( css ) } 
        if !old_digest.blank? && old_digest != 'empty'
          path = File.join(Rails.root, 'public', self.footer_css_path(old_digest))
          File.delete(path) if File.file?(path)
        end
      end
      self.update_column('footer_css_digest', footer_css_digest)
    rescue
      self.update_column('footer_css_digest', old_digest)
    end
  else
    self.update_column('footer_css_digest', 'empty')
  end
end


386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
# File 'app/models/caboose/site.rb', line 386

def update_footer_js_file
  str = ""
  footer_js_digest = SecureRandom.urlsafe_base64.to_s
  old_digest = self.footer_js_digest
  js = self.refresh_footer_js
  if js && !js.blank?
    begin
      if Rails.env.production?
        config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
        AWS.config(:access_key_id => config['access_key_id'], :secret_access_key => config['secret_access_key'])
        bucket =  AWS::S3.new.buckets[config['bucket']]                         
        bucket.objects[self.footer_js_path(footer_js_digest)].write(js, :acl => 'public-read', :content_type => 'text/javascript', :cache_control => 'public, max-age=86400')
        if !old_digest.blank? && old_digest != 'empty'
          key = self.footer_js_path(old_digest)
          obj = bucket.objects[key]
          obj.delete
        end
      else
        file_path = File.join(Rails.root, 'public', 'assets', 'sites')
        FileUtils.mkdir_p(file_path) unless File.directory?(file_path)
        File.open(File.join(Rails.root, 'public', self.footer_js_path(footer_js_digest)), 'w') { |f| f.write( js ) } 
        if !old_digest.blank? && old_digest != 'empty'
          path = File.join(Rails.root, 'public', self.footer_js_path(old_digest))
          File.delete(path) if File.file?(path)
        end
      end
      self.update_column('footer_js_digest', footer_js_digest)
    rescue
      self.update_column('footer_js_digest', old_digest)
    end
  else
    self.update_column('footer_js_digest', 'empty')
  end
end

#valid_domainsObject



154
155
156
# File 'app/models/caboose/site.rb', line 154

def valid_domains
  self.domains.map{ |d| d.domain.blank? ? "" : d.domain.gsub(":3000","") }
end

#validate_presence_of_store_configObject



107
108
109
110
111
# File 'app/models/caboose/site.rb', line 107

def validate_presence_of_store_config
  if self.use_store && !Caboose::StoreConfig.where(:site_id => self.id).exists?
    Caboose::StoreConfig.create(:site_id => self.id)
  end
end

#variant_defaultObject



142
143
144
145
146
# File 'app/models/caboose/site.rb', line 142

def variant_default
  vd = Caboose::VariantDefault.where(:site_id => self.id).first
  vd = Caboose::VariantDefault.create(:site_id => self.id) if vd.nil?
  return vd
end