Module: Amistad::MongoFriendModel

Defined in:
lib/amistad/mongo_friend_model.rb

Instance Method Summary collapse

Instance Method Details

#approve(user) ⇒ Object

approve a friendship invitation. If the operation succeeds, the method returns true, else false



12
13
14
15
16
17
18
19
# File 'lib/amistad/mongo_friend_model.rb', line 12

def approve(user)
  return false unless pending_inverse_friend_ids.include?(user.id) && user.pending_friend_ids.include?(self.id)
  pending_inverse_friend_ids.delete(user.id)
  user.pending_friend_ids.delete(self.id)
  inverse_friend_ids << user.id
  user.friend_ids << self.id
  self.save && user.save
end

#block(user) ⇒ Object

blocks a friendship



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/amistad/mongo_friend_model.rb', line 91

def block(user)
  if inverse_friend_ids.include?(user.id)
    inverse_friend_ids.delete(user.id)
    user.friend_ids.delete(self.id)
    blocked_inverse_friend_ids << user.id
  elsif pending_inverse_friend_ids.include?(user.id)
    pending_inverse_friend_ids.delete(user.id)
    user.pending_friend_ids.delete(self.id)
    blocked_pending_inverse_friend_ids << user.id
  elsif friend_ids.include?(user.id)
    friend_ids.delete(user.id)
    user.inverse_friend_ids.delete(user.id)
    blocked_friend_ids << user.id
  else
    return false
  end

  self.save
end

#blockedObject

returns the list of blocked friends



135
136
137
138
# File 'lib/amistad/mongo_friend_model.rb', line 135

def blocked
  blocked_ids = blocked_friend_ids + blocked_inverse_friend_ids + blocked_pending_inverse_friend_ids
  self.class.find(blocked_ids)
end

#blocked?(user) ⇒ Boolean

checks if a user is blocked

Returns:

  • (Boolean)


146
147
148
# File 'lib/amistad/mongo_friend_model.rb', line 146

def blocked?(user)
  (blocked_friend_ids + blocked_inverse_friend_ids + blocked_pending_inverse_friend_ids).include?(user.id) or user.blocked_pending_inverse_friend_ids.include?(self.id)
end

#common_friends_with(user) ⇒ Object

return the list of the ones among its friends which are also friend with the given use



52
53
54
# File 'lib/amistad/mongo_friend_model.rb', line 52

def common_friends_with(user)
  self.friends & user.friends
end

#connected_with?(user) ⇒ Boolean

checks if a current user is connected to given user

Returns:

  • (Boolean)


63
64
65
# File 'lib/amistad/mongo_friend_model.rb', line 63

def connected_with?(user)
  friendshiped_with?(user)
end

#delete_all_friendshipsObject

deletes all the friendships



156
157
158
159
160
161
162
163
164
165
166
# File 'lib/amistad/mongo_friend_model.rb', line 156

def delete_all_friendships
  friend_ids.clear
  inverse_friend_ids.clear
  pending_friend_ids.clear
  pending_inverse_friend_ids.clear
  blocked_friend_ids.clear
  blocked_inverse_friend_ids.clear
  blocked_pending_friend_ids.clear
  blocked_pending_inverse_friend_ids.clear
  self.save
end

#friend_with?(user) ⇒ Boolean

checks if a user is a friend

Returns:

  • (Boolean)


57
58
59
60
# File 'lib/amistad/mongo_friend_model.rb', line 57

def friend_with?(user)
  return false if user == self
  (friend_ids + inverse_friend_ids).include?(user.id)
end

#friendsObject

returns the list of approved friends



22
23
24
# File 'lib/amistad/mongo_friend_model.rb', line 22

def friends
  self.invited + self.invited_by
end

#friendshiped_with?(user) ⇒ Boolean

check if any friendship exists with another user

Returns:

  • (Boolean)


151
152
153
# File 'lib/amistad/mongo_friend_model.rb', line 151

def friendshiped_with?(user)
  (friend_ids + inverse_friend_ids + pending_friend_ids + pending_inverse_friend_ids + blocked_friend_ids).include?(user.id)
end

#invite(user) ⇒ Object

suggest a user to become a friend. If the operation succeeds, the method returns true, else false



4
5
6
7
8
9
# File 'lib/amistad/mongo_friend_model.rb', line 4

def invite(user)
  return false if friendshiped_with?(user) or user == self or blocked?(user)
  pending_friend_ids << user.id
  user.pending_inverse_friend_ids << self.id
  self.save && user.save
end

#invitedObject

return the list of invited friends



32
33
34
# File 'lib/amistad/mongo_friend_model.rb', line 32

def invited
  self.class.find(friend_ids)
end

#invited?(user) ⇒ Boolean

checks if a current user invited given user

Returns:

  • (Boolean)


73
74
75
# File 'lib/amistad/mongo_friend_model.rb', line 73

def invited?(user)
  self.friend_ids.include?(user.id) or self.pending_friend_ids.include?(user.id)
end

#invited_byObject

return the list of friends who invited



37
38
39
# File 'lib/amistad/mongo_friend_model.rb', line 37

def invited_by
  self.class.find(inverse_friend_ids)
end

#invited_by?(user) ⇒ Boolean

checks if a current user received invitation from given user

Returns:

  • (Boolean)


68
69
70
# File 'lib/amistad/mongo_friend_model.rb', line 68

def invited_by?(user)
  user.friend_ids.include?(self.id) or user.pending_friend_ids.include?(self.id)
end

#pending_invitedObject

return the list of pending invited friends



42
43
44
# File 'lib/amistad/mongo_friend_model.rb', line 42

def pending_invited
  self.class.find(pending_friend_ids)
end

#pending_invited_byObject

return the list of pending friends who invited



47
48
49
# File 'lib/amistad/mongo_friend_model.rb', line 47

def pending_invited_by
  self.class.find(pending_inverse_friend_ids)
end

#remove_friendship(user) ⇒ Object

deletes a friendship



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/amistad/mongo_friend_model.rb', line 78

def remove_friendship(user)
  friend_ids.delete(user.id)
  user.inverse_friend_ids.delete(self.id)
  inverse_friend_ids.delete(user.id)
  user.friend_ids.delete(self.id)
  pending_friend_ids.delete(user.id)
  user.pending_inverse_friend_ids.delete(self.id)
  pending_inverse_friend_ids.delete(user.id)
  user.pending_friend_ids.delete(self.id)
  self.save && user.save
end

#total_blockedObject

total # of blockades and blockedes_by without association loading



141
142
143
# File 'lib/amistad/mongo_friend_model.rb', line 141

def total_blocked
  (blocked_friend_ids + blocked_inverse_friend_ids + blocked_pending_inverse_friend_ids).count
end

#total_friendsObject

total # of invited and invited_by without association loading



27
28
29
# File 'lib/amistad/mongo_friend_model.rb', line 27

def total_friends
  (friend_ids + inverse_friend_ids).count
end

#unblock(user) ⇒ Object

unblocks a friendship



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/amistad/mongo_friend_model.rb', line 112

def unblock(user)
  if blocked_inverse_friend_ids.include?(user.id)
    blocked_inverse_friend_ids.delete(user.id)
    user.blocked_friend_ids.delete(self.id)
    inverse_friend_ids << user.id
    user.friend_ids << self.id
  elsif blocked_pending_inverse_friend_ids.include?(user.id)
    blocked_pending_inverse_friend_ids.delete(user.id)
    pending_inverse_friend_ids << user.id
    user.pending_friend_ids << self.id
  elsif blocked_friend_ids.include?(user.id)
    blocked_friend_ids.delete(user.id)
    user.blocked_inverse_friend_ids.delete(self.id)
    friend_ids << user.id
    user.inverse_friend_ids << self.id
  else
    return false
  end

  self.save && user.save
end