Skip to content
Extraits de code Groupes Projets
post.rb 3,31 ko
Newer Older
Raphael's avatar
Raphael a validé
#   Copyright (c) 2010, Diaspora Inc.  This file is
Raphael's avatar
Raphael a validé
#   licensed under the Affero General Public License version 3 or later.  See
Raphael's avatar
Raphael a validé
#   the COPYRIGHT file.
class Post < ActiveRecord::Base
  require File.join(Rails.root, 'lib/diaspora/web_socket')
Jamie Wilkinson's avatar
Jamie Wilkinson a validé
  include ApplicationHelper
  include Diaspora::Webhooks
Raphael's avatar
Raphael a validé
  include Diaspora::Guid
Raphael's avatar
Raphael a validé
  xml_attr :diaspora_handle
  xml_attr :public
  xml_attr :created_at
ilya's avatar
ilya a validé

Raphael Sofaer's avatar
Raphael Sofaer a validé
  has_many :comments, :order => 'created_at ASC'
  has_many :likes, :conditions => '`likes`.`positive` = 1', :dependent => :delete_all
  has_many :dislikes, :conditions => '`likes`.`positive` = 0', :class_name => 'Like', :dependent => :delete_all

  has_many :aspect_visibilities
  has_many :aspects, :through => :aspect_visibilities

  has_many :post_visibilities
  has_many :contacts, :through => :post_visibilities
zhitomirskiyi's avatar
zhitomirskiyi a validé
  has_many :mentions, :dependent => :destroy
  belongs_to :author, :class_name => 'Person'
maxwell's avatar
maxwell a validé
  cattr_reader :per_page
  @@per_page = 10
    if AspectVisibility.exists?(:post_id => self.id)
      self.post_visibilities.count + 1
    else
      self.post_visibilities.count
    end
  def diaspora_handle= nd
    self.author = Person.where(:diaspora_handle => nd).first
    write_attribute(:diaspora_handle, nd)
  end

  def self.diaspora_initialize params
Raphael's avatar
Raphael a validé
    new_post = self.new params.to_hash
    new_post.author = params[:author]
    new_post.public = params[:public] if params[:public]
    new_post.pending = params[:pending] if params[:pending]
    new_post.diaspora_handle = new_post.author.diaspora_handle
Raphael's avatar
Raphael a validé
    new_post
  def as_json(opts={})
    {
            :author => self.author.as_json,
maxwell's avatar
maxwell a validé
  def subscribers(user)
    user.people_in_aspects(user.aspects_with_post(self.id))
  end

  def receive(user, person)
    #exists locally, but you dont know about it
    #does not exsist locally, and you dont know about it
    #exists_locally?
    #you know about it, and it is mutable
    #you know about it, and it is not mutable

Raphael's avatar
Raphael a validé
    local_post = Post.where(:guid => self.guid).first
    if local_post && local_post.author_id == self.author_id
      known_post = user.raw_visible_posts.where(:guid => self.guid).first
Raphael's avatar
Raphael a validé
      if known_post
        if known_post.mutable?
zhitomirskiyi's avatar
zhitomirskiyi a validé
          known_post.update_attributes(self.attributes)
        else
          Rails.logger.info("event=receive payload_type=#{self.class} update=true status=abort sender=#{self.diaspora_handle} reason=immutable existing_post=#{known_post.id}")
        end
Raphael's avatar
Raphael a validé
      else
danielgrippi's avatar
danielgrippi a validé
        user.contact_for(person).receive_post(local_post)
zhitomirskiyi's avatar
zhitomirskiyi a validé
        user.notify_if_mentioned(local_post)
Raphael's avatar
Raphael a validé
        Rails.logger.info("event=receive payload_type=#{self.class} update=true status=complete sender=#{self.diaspora_handle} existing_post=#{local_post.id}")
        return local_post
Raphael's avatar
Raphael a validé
    elsif !local_post
      self.save
danielgrippi's avatar
danielgrippi a validé
      user.contact_for(person).receive_post(self)
zhitomirskiyi's avatar
zhitomirskiyi a validé
      user.notify_if_mentioned(self)
      Rails.logger.info("event=receive payload_type=#{self.class} update=false status=complete sender=#{self.diaspora_handle}")
    else
      Rails.logger.info("event=receive payload_type=#{self.class} update=true status=abort sender=#{self.diaspora_handle} reason='update not from post owner' existing_post=#{self.id}")
maxwell's avatar
maxwell a validé
    end
  end