131 lines
2.9 KiB
Ruby
131 lines
2.9 KiB
Ruby
class Person
|
|
include MongoMapper::Document
|
|
include ROXML
|
|
|
|
xml_accessor :_id
|
|
xml_accessor :email
|
|
xml_accessor :url
|
|
xml_accessor :profile, :as => Profile
|
|
|
|
|
|
key :email, String, :unique => true
|
|
key :url, String
|
|
|
|
key :serialized_key, String
|
|
|
|
|
|
key :owner_id, ObjectId
|
|
key :user_refs, Integer, :default => 0
|
|
|
|
belongs_to :owner, :class_name => 'User'
|
|
one :profile, :class_name => 'Profile'
|
|
|
|
many :posts, :class_name => 'Post', :foreign_key => :person_id
|
|
many :albums, :class_name => 'Album', :foreign_key => :person_id
|
|
|
|
|
|
timestamps!
|
|
|
|
before_validation :clean_url
|
|
|
|
validates_presence_of :email, :url, :profile, :serialized_key
|
|
validates_format_of :url, :with =>
|
|
/^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix
|
|
|
|
|
|
after_destroy :remove_all_traces
|
|
|
|
def real_name
|
|
"#{profile.first_name.to_s} #{profile.last_name.to_s}"
|
|
end
|
|
|
|
def encryption_key
|
|
OpenSSL::PKey::RSA.new( serialized_key )
|
|
end
|
|
|
|
def encryption_key= new_key
|
|
raise TypeError unless new_key.class == OpenSSL::PKey::RSA
|
|
serialized_key = new_key.export
|
|
end
|
|
def export_key
|
|
encryption_key.public_key.export
|
|
end
|
|
|
|
|
|
######## Posting ########
|
|
def post(class_name, options = {})
|
|
options[:person] = self
|
|
model_class = class_name.to_s.camelize.constantize
|
|
post = model_class.instantiate(options)
|
|
if owns?(post)
|
|
post.notify_people
|
|
end
|
|
post
|
|
end
|
|
|
|
######## Commenting ########
|
|
def comment(text, options = {})
|
|
raise "must comment on something!" unless options[:on]
|
|
c = Comment.new(:person_id => self.id, :text => text, :post => options[:on])
|
|
if c.save
|
|
send_comment c
|
|
true
|
|
else
|
|
Rails.logger.warn "this failed to save: #{c.inspect}"
|
|
end
|
|
false
|
|
end
|
|
|
|
def send_comment c
|
|
if self.owner.nil?
|
|
if c.post.person.owner.nil?
|
|
#puts "The commenter is not here, and neither is the poster"
|
|
elsif c.post.person.owner
|
|
#puts "The commenter is not here, and the poster is"
|
|
c.push_downstream
|
|
end
|
|
else
|
|
if owns? c.post
|
|
#puts "The commenter is here, and is the poster"
|
|
c.push_downstream
|
|
else
|
|
#puts "The commenter is here, and is not the poster"
|
|
c.push_upstream
|
|
end
|
|
end
|
|
|
|
end
|
|
##profile
|
|
def update_profile(params)
|
|
if self.update_attributes(params)
|
|
self.profile.notify_people!
|
|
true
|
|
else
|
|
false
|
|
end
|
|
end
|
|
|
|
def owns?(post)
|
|
self.id == post.person.id
|
|
end
|
|
|
|
def receive_url
|
|
"#{self.url}receive/users/#{self.id}/"
|
|
end
|
|
|
|
protected
|
|
def clean_url
|
|
self.url ||= "http://localhost:3000/" if self.class == User
|
|
if self.url
|
|
self.url = 'http://' + self.url unless self.url.match('http://' || 'https://')
|
|
self.url = self.url + '/' if self.url[-1,1] != '/'
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def remove_all_traces
|
|
self.posts.delete_all
|
|
end
|
|
|
|
end
|