Skip to content
Extraits de code Groupes Projets
user.rb 5,48 ko
Newer Older
  • Learn to ignore specific revisions
  • class User
      include MongoMapper::Document
    
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable
    
    maxwell's avatar
    maxwell a validé
             
    
    maxwell's avatar
    maxwell a validé
      key :pending_request_ids, Array
    
    
      one :person, :class_name => 'Person', :foreign_key => :owner_id
    
      many :friends, :in => :friend_ids, :class_name => 'Person'
    
    maxwell's avatar
    maxwell a validé
      many :pending_requests, :in => :pending_request_ids, :class_name => 'Request'
    
      many :groups, :class_name => 'Group'
    
    
    Raphael's avatar
    Raphael a validé
      before_validation_on_create :assign_key
    
      ######## Making things work ########
    
    
      def method_missing(method, *args)
        self.person.send(method, *args)
      end
    
    
      def real_name
        "#{person.profile.first_name.to_s} #{person.profile.last_name.to_s}"
    
      ######### Groups ######################
    
      def group( opts = {} )
        opts[:user] = self
        Group.create(opts)
      end
    
      ######### Friend Requesting ###########
    
      def send_friend_request_to(friend_url, group_id)
    
    maxwell's avatar
    maxwell a validé
        unless self.friends.detect{ |x| x.receive_url == friend_url}
    
          request = Request.instantiate(:to => friend_url, :from => self.person, :into => group_id)
          if request.save
            self.pending_requests << request
    
    maxwell's avatar
    maxwell a validé
            self.save
    
    
            group = self.groups.first(:id => group_id)
    
            group.requests << request
            group.save
            
            request.push_to_url friend_url
    
          request
    
    maxwell's avatar
    maxwell a validé
      end 
    
    
      def accept_friend_request(friend_request_id, group_id)
    
        request = Request.where(:id => friend_request_id).first
    
    maxwell's avatar
    maxwell a validé
        n = pending_requests.delete(request)
    
        group = self.groups.first(:id => group_id)
        group.people << request.person
        group.save
    
        request.reverse self
    
    
        request.push_to_url(request.callback_url)
    
      def ignore_friend_request(friend_request_id)
    
    maxwell's avatar
    maxwell a validé
        request = Request.first(:id => friend_request_id)
    
        person = request.person
    
        person.user_refs -= 1
    
    maxwell's avatar
    maxwell a validé
        pending_requests.delete(request)
        save
    
        (person.user_refs > 0 || person.owner.nil? == false) ?  person.save : person.destroy
    
        Rails.logger.info("receiving friend request #{friend_request.to_json}")
    
        if request_from_me?(friend_request)
    
          group = self.groups.first(:id => friend_request.group_id)
          activate_friend(friend_request.person, group)
    
          Rails.logger.info("#{self.real_name}'s friend request has been accepted")
    
          friend_request.person.user_refs += 1
    
    maxwell's avatar
    maxwell a validé
          pending_requests << friend_request
    
          Rails.logger.info("#{self.real_name} has received a friend request")
    
    maxwell's avatar
    maxwell a validé
      def unfriend(friend_id)
    
        bad_friend = Person.first(:_id => friend_id)
    
          Retraction.for(self).push_to_url(bad_friend.receive_url) 
    
    ilya's avatar
    ilya a validé
          bad_friend.user_refs -= 1
    
    
          (bad_friend.user_refs > 0 || bad_friend.owner.nil? == false) ?  bad_friend.save : bad_friend.destroy
    
    maxwell's avatar
    maxwell a validé
        end
    
    ilya's avatar
    ilya a validé
        self.save
      end
    
      def unfriended_by friend_id
        bad_friend = Person.first(:_id => friend_id)
    
        self.friend_ids.delete( friend_id )
        bad_friend.user_refs -= 1
    
        (bad_friend.user_refs > 0 || bad_friend.owner.nil? == false) ?  bad_friend.save : bad_friend.destroy
        self.save
    
      def send_request(rel_hash, group)
    
    maxwell's avatar
    maxwell a validé
        if rel_hash[:friend]
    
          self.send_friend_request_to(rel_hash[:friend], group)
    
        else
          raise "you can't do anything to that url"
        end
      end
    
      def activate_friend(person, group)
        group.people << person
    
        friends << person
    
        group.save
    
      end
    
      def request_from_me?(request)
        pending_requests.detect{|req| (req.callback_url == person.receive_url) && (req.destination_url == person.receive_url)}
    
      ###### Receiving #######
      def receive xml
    
        object = Diaspora::Parser.from_xml(xml)
    
        Rails.logger.debug("Receiving object:\n#{object.inspect}")
    
        if object.is_a? Retraction
    
          (object.type == 'Person' )? (unfriended_by object.post_id) : (object.perform self.id)
    
        elsif object.is_a? Request
    
          person = Diaspora::Parser.get_or_create_person_object_from_xml( xml )
    
          person.serialized_key ||= object.exported_key
          object.person = person
          object.person.save
    
          old_request =  Request.first(:id => object.id)
          object.group_id = old_request.group_id if old_request
    
          object.save
    
          receive_friend_request(object)
        elsif object.is_a? Profile
    
          person = Diaspora::Parser.owner_id_from_xml xml
    
          person.profile = object
          person.save  
    
        elsif object.verify_creator_signature == true 
    
          Rails.logger.debug("Saving object with success: #{object.save}")
    
    Raphael's avatar
    Raphael a validé
          object.socket_to_uid( id) if object.respond_to? :socket_to_uid
    
      def self.instantiate( opts = {} )
    
        opts[:person][:email] = opts[:email]
    
        opts[:person][:serialized_key] = generate_key
    
        User.create( opts)
    
    
      def terse_url
        terse= self.url.gsub(/https?:\/\//, '')
        terse.gsub!(/www\./, '')
        terse = terse.chop! if terse[-1, 1] == '/'
        terse
      end
    
     
      def do_bad_things
        self.password_confirmation = self.password
      end
      
    
        self.person.serialized_key ||= generate_key.export
    
        OpenSSL::PKey::RSA::generate 1024 
    
    ilya's avatar
    ilya a validé
      end
    
    
      def self.generate_key
        OpenSSL::PKey::RSA::generate 1024 
      end