Guest User

Untitled

a guest
May 21st, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.47 KB | None | 0 0
  1. class Message < ActiveRecord::Base
  2.  
  3. belongs_to :message_content
  4. belongs_to :parent, :class_name => "Message", :foreign_key => "parent_id"
  5. belongs_to :user
  6.  
  7. has_one :offsetting, :class_name => "Message", :foreign_key => "offsetting_id"
  8. belongs_to :offsetting, :class_name => "Message", :foreign_key => "offsetting_id"
  9.  
  10. has_one :defensive, :class_name => "Message", :foreign_key => "defensive_id"
  11. belongs_to :defensive, :class_name => "Message", :foreign_key => "defensive_id"
  12.  
  13. validates_presence_of :user, :folder, :message_content
  14.  
  15. attr_accessor :is_offsetting
  16.  
  17. after_create :create_messages
  18.  
  19. named_scope :folder, lambda{|folder|
  20. folder = INBOX if folder.blank?
  21. {:conditions => {:folder => folder}}
  22. }
  23. named_scope :unread, :conditions => {:read => false}
  24. named_scope :read, :conditions => {:read => true}
  25.  
  26. INBOX = 0
  27. SENT = 1
  28.  
  29. def user_title
  30. if self.folder == INBOX
  31. self.message_content.from
  32. else
  33. self.message_content.to
  34. end
  35. end
  36.  
  37. def self.get_message(user=nil, folder=0)
  38. msgs = Message.find(:all, :conditions => ["user_id=? and folder=?", user.id, folder], :select => "DISTINCT ON(thread) *")
  39. d_msgs = msgs.dup
  40. d_msgs.each { |m|
  41. if m.threads.size == 1 && m.message_content.from == user && folder == Message::INBOX
  42. msgs.delete(m)
  43. elsif m.threads.size > 1 && m.message_content.from == user && folder == Message::INBOX
  44. reply = false
  45. m.threads.each do |mt|
  46. reply = true if (mt != m) && (mt.message_content.from == m.message_content.to)
  47. end
  48. msgs.delete(m) unless reply
  49. elsif m.threads.size == 1 && m.message_content.to == user && folder == Message::SENT
  50. msgs.delete(m)
  51. end
  52. }
  53. msgs
  54. end
  55.  
  56. def self.delete_thread(m_id)
  57. msg = Message.find(m_id)
  58. threads = msg.threads
  59. threads.each do |th|
  60. mc = th.message_content
  61. th.destroy
  62. if mc.messages.size == 0
  63. mc.destroy
  64. end
  65. end
  66. end
  67.  
  68.  
  69. def defensive
  70. Message.find(:first, :conditions => ["user_id=? and folder=? and message_content_id=?", self.user_id, (self.folder == INBOX ? SENT : INBOX), self.message_content_id])
  71. end
  72.  
  73. def reverse_folder
  74. self.folder == INBOX ? SENT : INBOX
  75. end
  76.  
  77. def threads
  78. Message.find(:all, :conditions => { :user_id => self.user_id, :folder => self.folder, :thread => self.thread })
  79. end
  80.  
  81. def offsetting
  82. user = (self.message_content.to == self.user) ? self.message_content.from : self.message_content.to
  83. Message.find(:first, :conditions => { :user_id => user.id, :message_content_id => self.message_content.id, :folder => self.reverse_folder, :thread => self.thread })
  84. end
  85.  
  86. def previous
  87. max_thread = Message.maximum("thread")
  88. p_thread = self.thread + 1
  89. while(p_thread <= max_thread)
  90. p_msg = Message.find(:first, :conditions => { :user_id => self.user_id, :thread => p_thread, :folder => self.folder})
  91. return p_msg if p_msg
  92. p_thread = p_thread + 1
  93. end
  94. return nil
  95. end
  96.  
  97. def next
  98. p_thread = self.thread - 1
  99. while(p_thread > 0)
  100. p_msg = Message.find(:first, :conditions => { :user_id => self.user_id, :thread => p_thread, :folder => self.folder})
  101. return p_msg if p_msg
  102. p_thread = p_thread - 1
  103. end
  104. return nil
  105. end
  106.  
  107. def self.max_thread
  108. max_thread = Message.maximum("thread")
  109. max_thread ? max_thread + 1 : 1
  110. end
  111.  
  112. private
  113.  
  114. def create_messages
  115. self.read = true
  116. unless self.is_offsetting
  117. p = {}
  118. p[:folder] = INBOX
  119. p[:is_offsetting] = true
  120. p[:message_content] = self.message_content
  121. p[:user] = (self.user == self.message_content.to ? self.message_content.from : self.message_content.to)
  122.  
  123. if self.thread
  124. thread = self.thread
  125. else
  126. self.thread = Message.max_thread
  127. thread = self.thread
  128. self.save
  129. end
  130. p[:thread] = thread
  131.  
  132. clone_msg = self.clone
  133. clone_msg.folder = self.reverse_folder
  134. clone_msg.is_offsetting = true
  135. clone_msg.save
  136.  
  137. offsetting = Message.create(p)
  138. clone_offsetting = offsetting.clone
  139. clone_offsetting.folder = offsetting.reverse_folder
  140. clone_offsetting.is_offsetting = true
  141. clone_offsetting.read = true
  142. clone_offsetting.save
  143. end
  144. end
  145.  
  146. end
Add Comment
Please, Sign In to add comment