inkwell 1.2.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/app/models/inkwell/community_user.rb +15 -0
- data/app/models/inkwell/following.rb +8 -0
- data/db/migrate/20130212130888_refactor_followings_relation.rb +27 -0
- data/db/migrate/20130212130898_refactor_user_community_relation.rb +72 -0
- data/db/migrate/20130212130908_refactor_invites_bans_mutes.rb +48 -0
- data/lib/acts_as_inkwell_community/base.rb +185 -180
- data/lib/acts_as_inkwell_user/base.rb +72 -30
- data/lib/common/base.rb +21 -0
- data/lib/inkwell/version.rb +1 -1
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20130227154519_refactor_followings_relation.inkwell.rb +28 -0
- data/test/dummy/db/migrate/20130228115224_refactor_user_community_relation.inkwell.rb +73 -0
- data/test/dummy/db/migrate/20130312084529_refactor_invites_bans_mutes.inkwell.rb +49 -0
- data/test/dummy/db/schema.rb +33 -12
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +1986 -0
- data/test/dummy/log/test.log +0 -0
- data/test/dummy/spec/functional/community_spec.rb +513 -196
- data/test/dummy/spec/functional/following_spec.rb +55 -7
- data/test/dummy_without_community/db/development.sqlite3 +0 -0
- data/test/dummy_without_community/db/migrate/20130313083915_refactor_followings_relation.inkwell.rb +28 -0
- data/test/dummy_without_community/db/migrate/20130313083916_refactor_user_community_relation.inkwell.rb +73 -0
- data/test/dummy_without_community/db/migrate/20130313083917_refactor_invites_bans_mutes.inkwell.rb +49 -0
- data/test/dummy_without_community/db/schema.rb +12 -5
- data/test/dummy_without_community/db/test.sqlite3 +0 -0
- data/test/dummy_without_community/log/development.log +78 -0
- data/test/dummy_without_community/log/test.log +12652 -0
- data/test/dummy_without_community/spec/functional/following_spec.rb +20 -7
- metadata +31 -14
@@ -0,0 +1,15 @@
|
|
1
|
+
module Inkwell
|
2
|
+
if ::Inkwell::Engine::config.respond_to?('community_table')
|
3
|
+
class CommunityUser < ActiveRecord::Base
|
4
|
+
attr_accessible "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id", "#{::Inkwell::Engine::config.community_table.to_s.singularize}_id",
|
5
|
+
:is_writer, :is_admin, :admin_level, :muted, :user_access, :active, :banned, :asked_invitation
|
6
|
+
belongs_to ::Inkwell::Engine::config.community_table.to_s.singularize.to_sym
|
7
|
+
belongs_to ::Inkwell::Engine::config.user_table.to_s.singularize.to_sym
|
8
|
+
belongs_to :admins, :foreign_key => "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
9
|
+
belongs_to :writers, :foreign_key => "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
10
|
+
belongs_to :muted_users, :foreign_key => "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
11
|
+
belongs_to :banned_users, :foreign_key => "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
12
|
+
belongs_to :asked_invitation_users, :foreign_key => "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class RefactorFollowingsRelation < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :inkwell_followings do |t|
|
4
|
+
t.integer :follower_id
|
5
|
+
t.integer :followed_id
|
6
|
+
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
add_column ::Inkwell::Engine::config.user_table, :follower_count, :integer, :default => 0
|
10
|
+
add_column ::Inkwell::Engine::config.user_table, :following_count, :integer, :default => 0
|
11
|
+
|
12
|
+
user_class = Object.const_get ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize
|
13
|
+
user_class.all.each do |user|
|
14
|
+
followings_ids = ActiveSupport::JSON.decode user.followings_ids
|
15
|
+
followers_ids = ActiveSupport::JSON.decode user.followers_ids
|
16
|
+
user.following_count = followings_ids.size
|
17
|
+
user.follower_count = followers_ids.size
|
18
|
+
user.save
|
19
|
+
followings_ids.each do |followed_id|
|
20
|
+
::Inkwell::Following.create :follower_id => user.id, :followed_id => followed_id
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
remove_column ::Inkwell::Engine::config.user_table, :followers_ids
|
25
|
+
remove_column ::Inkwell::Engine::config.user_table, :followings_ids
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
class RefactorUserCommunityRelation < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
if ::Inkwell::Engine::config.respond_to?('community_table')
|
4
|
+
user_id = "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
5
|
+
community_id = "#{::Inkwell::Engine::config.community_table.to_s.singularize}_id"
|
6
|
+
|
7
|
+
create_table :inkwell_community_users do |t|
|
8
|
+
t.integer user_id
|
9
|
+
t.integer community_id
|
10
|
+
t.string :user_access, :default => "r"
|
11
|
+
t.boolean :is_admin, :default => false
|
12
|
+
t.integer :admin_level
|
13
|
+
t.boolean :muted, :default => false
|
14
|
+
|
15
|
+
t.timestamps
|
16
|
+
end
|
17
|
+
|
18
|
+
add_column ::Inkwell::Engine::config.community_table, :user_count, :integer, :default => 0
|
19
|
+
add_column ::Inkwell::Engine::config.community_table, :writer_count, :integer, :default => 0
|
20
|
+
add_column ::Inkwell::Engine::config.community_table, :admin_count, :integer, :default => 0
|
21
|
+
add_column ::Inkwell::Engine::config.community_table, :muted_count, :integer, :default => 0
|
22
|
+
add_column ::Inkwell::Engine::config.user_table, :community_count, :integer, :default => 0
|
23
|
+
|
24
|
+
community_class = Object.const_get ::Inkwell::Engine::config.community_table.to_s.singularize.capitalize
|
25
|
+
|
26
|
+
community_class.all.each do |community|
|
27
|
+
users_ids = ActiveSupport::JSON.decode community.users_ids
|
28
|
+
community.user_count = users_ids.size
|
29
|
+
|
30
|
+
users_ids.each do |uid|
|
31
|
+
::Inkwell::CommunityUser.create user_id => uid, community_id => community.id
|
32
|
+
end
|
33
|
+
|
34
|
+
writers_ids = ActiveSupport::JSON.decode community.writers_ids
|
35
|
+
community.writer_count = writers_ids.size
|
36
|
+
|
37
|
+
writers_ids.each do |uid|
|
38
|
+
::Inkwell::CommunityUser.where(user_id => uid, community_id => community.id).update_all(:user_access => "w")
|
39
|
+
end
|
40
|
+
|
41
|
+
admins_info = ActiveSupport::JSON.decode community.admins_info
|
42
|
+
community.admin_count = admins_info.size
|
43
|
+
|
44
|
+
admins_info.each do |rec|
|
45
|
+
::Inkwell::CommunityUser.where(user_id => rec['admin_id'], community_id => community.id).update_all(:is_admin => true, :admin_level => rec['admin_level'])
|
46
|
+
end
|
47
|
+
|
48
|
+
muted_ids = ActiveSupport::JSON.decode community.muted_ids
|
49
|
+
community.muted_count = muted_ids.size
|
50
|
+
|
51
|
+
muted_ids.each do |uid|
|
52
|
+
::Inkwell::CommunityUser.where(user_id => uid, community_id => community.id).update_all(:muted => true)
|
53
|
+
end
|
54
|
+
|
55
|
+
community.save
|
56
|
+
end
|
57
|
+
|
58
|
+
user_class = Object.const_get ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize
|
59
|
+
user_class.all.each do |user|
|
60
|
+
communities_info = ActiveSupport::JSON.decode user.communities_info
|
61
|
+
user.community_count = communities_info.size
|
62
|
+
user.save
|
63
|
+
end
|
64
|
+
|
65
|
+
remove_column ::Inkwell::Engine::config.community_table, :users_ids
|
66
|
+
remove_column ::Inkwell::Engine::config.community_table, :writers_ids
|
67
|
+
remove_column ::Inkwell::Engine::config.community_table, :admins_info
|
68
|
+
remove_column ::Inkwell::Engine::config.community_table, :muted_ids
|
69
|
+
remove_column ::Inkwell::Engine::config.user_table, :communities_info
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class RefactorInvitesBansMutes < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
if ::Inkwell::Engine::config.respond_to?('community_table')
|
4
|
+
user_id = "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
5
|
+
community_id = "#{::Inkwell::Engine::config.community_table.to_s.singularize}_id"
|
6
|
+
|
7
|
+
add_column ::Inkwell::Engine::config.community_table, :banned_count, :integer, :default => 0
|
8
|
+
add_column ::Inkwell::Engine::config.community_table, :invitation_count, :integer, :default => 0
|
9
|
+
|
10
|
+
change_column ::Inkwell::Engine::config.community_table, :user_count, :integer, :default => 1
|
11
|
+
change_column ::Inkwell::Engine::config.community_table, :admin_count, :integer, :default => 1
|
12
|
+
change_column ::Inkwell::Engine::config.community_table, :writer_count, :integer, :default => 1
|
13
|
+
|
14
|
+
add_column :inkwell_community_users, :active, :boolean, :default => false
|
15
|
+
add_column :inkwell_community_users, :banned, :boolean, :default => false
|
16
|
+
add_column :inkwell_community_users, :asked_invitation, :boolean, :default => false
|
17
|
+
|
18
|
+
community_class = Object.const_get ::Inkwell::Engine::config.community_table.to_s.singularize.capitalize
|
19
|
+
|
20
|
+
community_class.all.each do |community|
|
21
|
+
banned_ids = ActiveSupport::JSON.decode community.banned_ids
|
22
|
+
community.banned_count = banned_ids.size
|
23
|
+
banned_ids.each do |uid|
|
24
|
+
relations = ::Inkwell::CommunityUser.where community_id => community.id, user_id => uid
|
25
|
+
if relations.empty?
|
26
|
+
::Inkwell::CommunityUser.create community_id => community.id, user_id => uid, :active => false, :banned => true
|
27
|
+
else
|
28
|
+
relation = relations.first
|
29
|
+
relation.active = false
|
30
|
+
relation.banned = true
|
31
|
+
relation.save
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
invitations_uids = ActiveSupport::JSON.decode community.invitations_uids
|
36
|
+
community.invitation_count = invitations_uids.size
|
37
|
+
invitations_uids.each do |uid|
|
38
|
+
::Inkwell::CommunityUser.create community_id => community.id, user_id => uid, :active => false, :asked_invitation => true
|
39
|
+
end
|
40
|
+
|
41
|
+
community.save
|
42
|
+
end
|
43
|
+
|
44
|
+
remove_column ::Inkwell::Engine::config.community_table, :banned_ids
|
45
|
+
remove_column ::Inkwell::Engine::config.community_table, :invitations_uids
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -12,9 +12,18 @@ module Inkwell
|
|
12
12
|
def acts_as_inkwell_community
|
13
13
|
validates :owner_id, :presence => true
|
14
14
|
|
15
|
+
if ::Inkwell::Engine::config.respond_to?('community_table')
|
16
|
+
has_many :communities_users, :class_name => 'Inkwell::CommunityUser'
|
17
|
+
has_many :users, :through => :communities_users, :class_name => ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize, :conditions => {"inkwell_community_users.active" => true}
|
18
|
+
has_many :admins, :through => :communities_users, :class_name => ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize, :conditions => {"inkwell_community_users.is_admin" => true, "inkwell_community_users.active" => true}
|
19
|
+
has_many :writers, :through => :communities_users, :class_name => ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize, :conditions => {"inkwell_community_users.user_access" => ::Inkwell::Constants::CommunityAccessLevels::WRITE, "inkwell_community_users.active" => true}
|
20
|
+
has_many :muted_users, :through => :communities_users, :class_name => ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize, :conditions => {"inkwell_community_users.muted" => true, "inkwell_community_users.active" => true}
|
21
|
+
has_many :banned_users, :through => :communities_users, :class_name => ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize, :conditions => {"inkwell_community_users.banned" => true}
|
22
|
+
has_many :asked_invitation_users, :through => :communities_users, :class_name => ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize, :conditions => {"inkwell_community_users.asked_invitation" => true}
|
23
|
+
end
|
24
|
+
|
15
25
|
after_create :processing_a_community
|
16
26
|
before_destroy :destroy_community_processing
|
17
|
-
|
18
27
|
include ::Inkwell::ActsAsInkwellCommunity::InstanceMethods
|
19
28
|
end
|
20
29
|
end
|
@@ -27,26 +36,29 @@ module Inkwell
|
|
27
36
|
def add_user(options = {})
|
28
37
|
options.symbolize_keys!
|
29
38
|
user = options[:user]
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
39
|
+
check_user user
|
40
|
+
|
41
|
+
relation = ::Inkwell::CommunityUser.where(user_id_attr => user.id, community_id_attr => self.id).first
|
42
|
+
|
43
|
+
if relation
|
44
|
+
raise "this user is already in this community" if relation.active
|
45
|
+
raise "this user is banned" if relation.banned
|
46
|
+
|
47
|
+
relation.asked_invitation = false if relation.asked_invitation
|
48
|
+
relation.user_access = self.default_user_access
|
49
|
+
relation.active = true
|
50
|
+
relation.save
|
51
|
+
else
|
52
|
+
relation = ::Inkwell::CommunityUser.create user_id_attr => user.id, community_id_attr => self.id, :user_access => self.default_user_access, :active => true
|
40
53
|
end
|
41
|
-
self.save
|
42
54
|
|
43
|
-
|
44
|
-
|
45
|
-
|
55
|
+
|
56
|
+
self.user_count += 1
|
57
|
+
self.writer_count += 1 if relation.user_access == CommunityAccessLevels::WRITE
|
58
|
+
self.save
|
59
|
+
user.community_count += 1
|
46
60
|
user.save
|
47
61
|
|
48
|
-
post_class = Object.const_get ::Inkwell::Engine::config.post_table.to_s.singularize.capitalize
|
49
|
-
user_id_attr = "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
50
62
|
::Inkwell::BlogItem.where(:owner_id => self.id, :owner_type => OwnerTypes::COMMUNITY).order("created_at DESC").limit(10).each do |blog_item|
|
51
63
|
next if post_class.find(blog_item.item_id).send(user_id_attr) == user.id
|
52
64
|
|
@@ -76,25 +88,23 @@ module Inkwell
|
|
76
88
|
raise "admin has no permissions to delete this user from community" if (self.admin_level_of(user) <= self.admin_level_of(admin)) && (user != admin)
|
77
89
|
end
|
78
90
|
|
79
|
-
|
80
|
-
users_ids.delete user.id
|
81
|
-
self.users_ids = ActiveSupport::JSON.encode users_ids
|
82
|
-
|
83
|
-
writers_ids = ActiveSupport::JSON.decode self.writers_ids
|
84
|
-
writers_ids.delete user.id
|
85
|
-
self.writers_ids = ActiveSupport::JSON.encode writers_ids
|
86
|
-
|
87
|
-
admins_info = ActiveSupport::JSON.decode self.admins_info
|
88
|
-
admins_info.delete_if{|item| item['admin_id'] == user.id}
|
89
|
-
self.admins_info = ActiveSupport::JSON.encode admins_info
|
91
|
+
relation = ::Inkwell::CommunityUser.where(user_id_attr => user.id, community_id_attr => self.id).first
|
90
92
|
|
93
|
+
self.user_count -= 1
|
94
|
+
self.writer_count -= 1 if relation.user_access == CommunityAccessLevels::WRITE
|
95
|
+
self.admin_count -= 1 if relation.is_admin
|
96
|
+
self.muted_count -= 1 if relation.muted
|
91
97
|
self.save
|
92
|
-
|
93
|
-
communities_info = ActiveSupport::JSON.decode user.communities_info
|
94
|
-
communities_info.delete_if {|item| item[HashParams::COMMUNITY_ID] == self.id}
|
95
|
-
user.communities_info = ActiveSupport::JSON.encode communities_info
|
98
|
+
user.community_count -= 1
|
96
99
|
user.save
|
97
100
|
|
101
|
+
if relation.muted
|
102
|
+
relation.active = false
|
103
|
+
relation.save
|
104
|
+
else
|
105
|
+
relation.destroy
|
106
|
+
end
|
107
|
+
|
98
108
|
timeline_items = ::Inkwell::TimelineItem.where(:owner_id => user.id, :owner_type => OwnerTypes::USER).where "from_source like '%{\"community_id\":#{self.id}%'"
|
99
109
|
timeline_items.delete_all :has_many_sources => false
|
100
110
|
timeline_items.each do |item|
|
@@ -108,14 +118,12 @@ module Inkwell
|
|
108
118
|
|
109
119
|
def include_writer?(user)
|
110
120
|
check_user user
|
111
|
-
|
112
|
-
writers_ids.include? user.id
|
121
|
+
::Inkwell::CommunityUser.exists? user_id_attr => user.id, community_id_attr => self.id, :user_access => CommunityAccessLevels::WRITE, :active => true
|
113
122
|
end
|
114
123
|
|
115
124
|
def include_user?(user)
|
116
125
|
check_user user
|
117
|
-
|
118
|
-
(communities_info.index{|item| item[HashParams::COMMUNITY_ID] == self.id}) ? true : false
|
126
|
+
::Inkwell::CommunityUser.exists? user_id_attr => user.id, community_id_attr => self.id, :active => true
|
119
127
|
end
|
120
128
|
|
121
129
|
def mute_user(options = {})
|
@@ -126,16 +134,19 @@ module Inkwell
|
|
126
134
|
raise "admin should be passed in params" unless admin
|
127
135
|
check_user user
|
128
136
|
check_user admin
|
137
|
+
|
138
|
+
relation = ::Inkwell::CommunityUser.where(user_id_attr => user.id, community_id_attr => self.id).first
|
139
|
+
|
129
140
|
raise "admin is not admin" unless self.include_admin? admin
|
130
|
-
raise "user should be a member of this community" unless
|
131
|
-
raise "this user is already muted" if
|
141
|
+
raise "user should be a member of this community" unless relation
|
142
|
+
raise "this user is already muted" if relation.muted
|
132
143
|
raise "it is impossible to mute yourself" if user == admin
|
133
|
-
raise "admin has no permissions to mute this user" if (
|
144
|
+
raise "admin has no permissions to mute this user" if (relation.is_admin) && (admin_level_of(admin) >= relation.admin_level)
|
134
145
|
|
146
|
+
relation.muted = true
|
147
|
+
relation.save
|
135
148
|
|
136
|
-
|
137
|
-
muted_ids << user.id
|
138
|
-
self.muted_ids = ActiveSupport::JSON.encode muted_ids
|
149
|
+
self.muted_count += 1
|
139
150
|
self.save
|
140
151
|
end
|
141
152
|
|
@@ -147,21 +158,24 @@ module Inkwell
|
|
147
158
|
raise "admin should be passed in params" unless admin
|
148
159
|
check_user user
|
149
160
|
check_user admin
|
161
|
+
|
162
|
+
relation = ::Inkwell::CommunityUser.where(user_id_attr => user.id, community_id_attr => self.id).first
|
163
|
+
|
150
164
|
raise "admin is not admin" unless self.include_admin? admin
|
151
|
-
raise "user should be a member of this community" unless
|
152
|
-
raise "this user is not muted" unless
|
153
|
-
raise "admin has no permissions to unmute this user" if (
|
165
|
+
raise "user should be a member of this community" unless relation
|
166
|
+
raise "this user is not muted" unless relation.muted
|
167
|
+
raise "admin has no permissions to unmute this user" if (relation.is_admin) && (admin_level_of(admin) >= relation.admin_level)
|
168
|
+
|
169
|
+
relation.muted = false
|
170
|
+
relation.save
|
154
171
|
|
155
|
-
|
156
|
-
muted_ids.delete user.id
|
157
|
-
self.muted_ids = ActiveSupport::JSON.encode muted_ids
|
172
|
+
self.muted_count -= 1
|
158
173
|
self.save
|
159
174
|
end
|
160
175
|
|
161
176
|
def include_muted_user?(user)
|
162
177
|
check_user user
|
163
|
-
|
164
|
-
muted_ids.include? user.id
|
178
|
+
::Inkwell::CommunityUser.exists? user_id_attr => user.id, community_id_attr => self.id, :muted => true, :active => true
|
165
179
|
end
|
166
180
|
|
167
181
|
def ban_user(options = {})
|
@@ -173,22 +187,23 @@ module Inkwell
|
|
173
187
|
check_user user
|
174
188
|
check_user admin
|
175
189
|
raise "admin is not admin" unless self.include_admin? admin
|
176
|
-
if self.
|
177
|
-
|
190
|
+
raise "admin has no permissions to ban this user" if (self.include_admin? user) && (admin_level_of(admin) >= admin_level_of(user))
|
191
|
+
|
192
|
+
relation = ::Inkwell::CommunityUser.where(user_id_attr => user.id, community_id_attr => self.id).first
|
193
|
+
raise "user should be a member of community or send invitation request to it" unless relation
|
194
|
+
raise "this user is already banned" if relation.banned
|
195
|
+
relation.banned = true
|
196
|
+
relation.active = false
|
197
|
+
if relation.asked_invitation
|
198
|
+
relation.asked_invitation = false
|
199
|
+
self.invitation_count -= 1
|
178
200
|
else
|
179
|
-
|
201
|
+
self.user_count -= 1
|
180
202
|
end
|
181
|
-
|
182
|
-
raise "admin has no permissions to ban this user" if (self.include_admin? user) && (admin_level_of(admin) >= admin_level_of(user))
|
203
|
+
relation.save
|
183
204
|
|
184
|
-
|
185
|
-
banned_ids << user.id
|
186
|
-
self.banned_ids = ActiveSupport::JSON.encode banned_ids
|
205
|
+
self.banned_count += 1
|
187
206
|
self.save
|
188
|
-
unless self.public
|
189
|
-
self.reject_invitation_request :admin => admin, :user => user if self.include_invitation_request? user
|
190
|
-
end
|
191
|
-
self.remove_user :admin => admin, :user => user
|
192
207
|
end
|
193
208
|
|
194
209
|
def unban_user(options = {})
|
@@ -200,18 +215,20 @@ module Inkwell
|
|
200
215
|
check_user user
|
201
216
|
check_user admin
|
202
217
|
raise "admin is not admin" unless self.include_admin? admin
|
203
|
-
raise "this user is not banned" unless self.include_banned_user? user
|
204
218
|
|
205
|
-
|
206
|
-
|
207
|
-
|
219
|
+
relation = ::Inkwell::CommunityUser.where(user_id_attr => user.id, community_id_attr => self.id).first
|
220
|
+
raise "this user is not banned" unless relation || relation.banned
|
221
|
+
|
222
|
+
relation.banned = false
|
223
|
+
relation.active = true unless relation.asked_invitation
|
224
|
+
relation.save
|
225
|
+
|
226
|
+
self.banned_count -= 1
|
208
227
|
self.save
|
209
228
|
end
|
210
229
|
|
211
230
|
def include_banned_user?(user)
|
212
|
-
|
213
|
-
banned_ids = ActiveSupport::JSON.decode self.banned_ids
|
214
|
-
banned_ids.include? user.id
|
231
|
+
::Inkwell::CommunityUser.exists? :community_id => self.id, :user_id => user.id, :banned => true
|
215
232
|
end
|
216
233
|
|
217
234
|
def add_admin(options = {})
|
@@ -222,23 +239,27 @@ module Inkwell
|
|
222
239
|
raise "admin should be passed in params" unless admin
|
223
240
|
check_user user
|
224
241
|
check_user admin
|
225
|
-
raise "user is already admin" if self.include_admin? user
|
226
|
-
raise "admin is not admin" unless self.include_admin? admin
|
227
|
-
raise "user should be a member of this community" unless self.include_user? user
|
228
242
|
|
229
|
-
|
243
|
+
relation = ::Inkwell::CommunityUser.where(user_id_attr => user.id, community_id_attr => self.id).first
|
230
244
|
|
231
|
-
unless
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
end
|
245
|
+
raise "user should be in the community" unless relation
|
246
|
+
raise "user is already admin" if relation.is_admin
|
247
|
+
raise "admin is not admin" unless self.include_admin? admin
|
248
|
+
raise "user should be a member of this community" unless relation
|
236
249
|
|
237
|
-
|
250
|
+
if relation.muted
|
251
|
+
relation.muted = false
|
252
|
+
self.muted_count -= 1
|
253
|
+
end
|
254
|
+
unless relation.user_access == CommunityAccessLevels::WRITE
|
255
|
+
relation.user_access = CommunityAccessLevels::WRITE
|
256
|
+
self.writer_count += 1
|
257
|
+
end
|
258
|
+
relation.admin_level = admin_level_of(admin) + 1
|
259
|
+
relation.is_admin = true
|
260
|
+
relation.save
|
238
261
|
|
239
|
-
|
240
|
-
admins_info << Hash['admin_id' => user.id, 'admin_level' => admin_level_granted_for_user]
|
241
|
-
self.admins_info = ActiveSupport::JSON.encode admins_info
|
262
|
+
self.admin_count += 1
|
242
263
|
self.save
|
243
264
|
end
|
244
265
|
|
@@ -253,24 +274,22 @@ module Inkwell
|
|
253
274
|
raise "admin has no permissions to delete this user from admins" if (admin_level_of(admin) >= admin_level_of(user)) && (user != admin)
|
254
275
|
raise "community owner can not be removed from admins" if admin_level_of(user) == 0
|
255
276
|
|
256
|
-
|
257
|
-
|
258
|
-
self.
|
277
|
+
::Inkwell::CommunityUser.where(user_id_attr => user.id, community_id_attr => self.id).update_all :is_admin => false, :admin_level => nil
|
278
|
+
|
279
|
+
self.admin_count -= 1
|
259
280
|
self.save
|
260
281
|
end
|
261
282
|
|
262
283
|
def admin_level_of(admin)
|
263
|
-
|
264
|
-
|
265
|
-
raise "admin is not admin" unless
|
266
|
-
|
284
|
+
relation = ::Inkwell::CommunityUser.where(user_id_attr => admin.id, community_id_attr => self.id).first
|
285
|
+
raise "this user is not community member" unless relation
|
286
|
+
raise "admin is not admin" unless relation.is_admin
|
287
|
+
relation.admin_level
|
267
288
|
end
|
268
289
|
|
269
290
|
def include_admin?(user)
|
270
291
|
check_user user
|
271
|
-
|
272
|
-
admin_positions = ActiveSupport::JSON.decode self.admins_info
|
273
|
-
(admin_positions.index{|item| item['admin_id'] == user.id}) ? true : false
|
292
|
+
::Inkwell::CommunityUser.exists? user_id_attr => user.id, community_id_attr => self.id, :is_admin => true, :active => true
|
274
293
|
end
|
275
294
|
|
276
295
|
def add_post(options = {})
|
@@ -302,9 +321,9 @@ module Inkwell
|
|
302
321
|
item.save
|
303
322
|
end
|
304
323
|
|
305
|
-
self.users_row.each do |
|
306
|
-
next if users_with_existing_items.include?
|
307
|
-
::Inkwell::TimelineItem.create :item_id => post.id, :owner_id =>
|
324
|
+
self.users_row.each do |uid|
|
325
|
+
next if users_with_existing_items.include? uid
|
326
|
+
::Inkwell::TimelineItem.create :item_id => post.id, :owner_id => uid, :owner_type => OwnerTypes::USER, :item_type => ItemTypes::POST,
|
308
327
|
:from_source => ActiveSupport::JSON.encode([Hash['community_id' => self.id]])
|
309
328
|
end
|
310
329
|
end
|
@@ -380,30 +399,47 @@ module Inkwell
|
|
380
399
|
end
|
381
400
|
|
382
401
|
def users_row
|
383
|
-
|
402
|
+
relations = ::Inkwell::CommunityUser.where community_id_attr => self.id
|
403
|
+
result = []
|
404
|
+
relations.each do |rel|
|
405
|
+
result << rel.send(user_id_attr)
|
406
|
+
end
|
407
|
+
result
|
384
408
|
end
|
385
409
|
|
386
410
|
def writers_row
|
387
|
-
|
411
|
+
relations = ::Inkwell::CommunityUser.where community_id_attr => self.id, :user_access => CommunityAccessLevels::WRITE
|
412
|
+
result = []
|
413
|
+
relations.each do |rel|
|
414
|
+
result << rel.send(user_id_attr)
|
415
|
+
end
|
416
|
+
result
|
388
417
|
end
|
389
418
|
|
390
419
|
def admins_row
|
391
|
-
|
420
|
+
relations = ::Inkwell::CommunityUser.where community_id_attr => self.id, :is_admin => true
|
392
421
|
result = []
|
393
|
-
|
394
|
-
result <<
|
422
|
+
relations.each do |rel|
|
423
|
+
result << rel.send(user_id_attr)
|
395
424
|
end
|
396
425
|
result
|
397
426
|
end
|
398
427
|
|
399
428
|
def create_invitation_request(user)
|
400
|
-
|
401
|
-
|
429
|
+
check_user user
|
430
|
+
|
431
|
+
relation = ::Inkwell::CommunityUser.where(community_id_attr => self.id, user_id_attr => user.id).first
|
432
|
+
if relation
|
433
|
+
raise "invitation request was already created" if relation.asked_invitation
|
434
|
+
raise "it is impossible to create request. user is banned in this community" if relation.banned
|
435
|
+
raise "user is already community member" if relation.active
|
436
|
+
raise "there is relation for user who is not member of community and he is not banned and not asked invitation to it"
|
437
|
+
end
|
402
438
|
raise "it is impossible to create request for public community" if self.public
|
403
439
|
|
404
|
-
|
405
|
-
|
406
|
-
self.
|
440
|
+
::Inkwell::CommunityUser.create community_id_attr => self.id, user_id_attr => user.id, :asked_invitation => true, :active => false
|
441
|
+
|
442
|
+
self.invitation_count += 1
|
407
443
|
self.save
|
408
444
|
end
|
409
445
|
|
@@ -414,12 +450,15 @@ module Inkwell
|
|
414
450
|
check_user user
|
415
451
|
check_user admin
|
416
452
|
raise "admin is not admin in this community" unless self.include_admin? admin
|
417
|
-
|
418
|
-
|
453
|
+
|
454
|
+
relation = ::Inkwell::CommunityUser.where(community_id_attr => self.id, user_id_attr => user.id).first
|
455
|
+
raise "this user is already in this community" if relation.active
|
456
|
+
raise "there is no invitation request for this user" unless relation.asked_invitation
|
419
457
|
|
420
458
|
self.add_user :user => user
|
421
459
|
|
422
|
-
|
460
|
+
self.invitation_count -= 1
|
461
|
+
self.save
|
423
462
|
end
|
424
463
|
|
425
464
|
def reject_invitation_request(options = {})
|
@@ -428,16 +467,29 @@ module Inkwell
|
|
428
467
|
admin = options[:admin]
|
429
468
|
check_user user
|
430
469
|
check_user admin
|
431
|
-
|
470
|
+
|
471
|
+
relation = ::Inkwell::CommunityUser.where(community_id_attr => self.id, user_id_attr => user.id).first
|
472
|
+
raise "there is no invitation request for this user" unless relation || relation.asked_invitation
|
432
473
|
raise "admin is not admin in this community" unless self.include_admin? admin
|
433
474
|
|
434
|
-
|
475
|
+
relation.destroy
|
476
|
+
|
477
|
+
self.invitation_count -= 1
|
478
|
+
self.save
|
435
479
|
end
|
436
480
|
|
437
481
|
def include_invitation_request?(user)
|
438
482
|
raise "invitations work only for private community. this community is public." if self.public
|
439
|
-
|
440
|
-
|
483
|
+
::Inkwell::CommunityUser.exists? community_id_attr => self.id, user_id_attr => user.id, :asked_invitation => true
|
484
|
+
end
|
485
|
+
|
486
|
+
def invitations_row
|
487
|
+
relations = ::Inkwell::CommunityUser.where community_id_attr => self.id, :asked_invitation => true
|
488
|
+
result = []
|
489
|
+
relations.each do |relation|
|
490
|
+
result << relation.send(user_id_attr)
|
491
|
+
end
|
492
|
+
result
|
441
493
|
end
|
442
494
|
|
443
495
|
def change_default_access_to_write
|
@@ -456,98 +508,51 @@ module Inkwell
|
|
456
508
|
|
457
509
|
def set_write_access(uids)
|
458
510
|
raise "array with users ids should be passed" unless uids.class == Array
|
459
|
-
|
460
|
-
|
461
|
-
unless matching_ids.size == uids.size
|
462
|
-
mismatched_ids = uids - matching_ids
|
463
|
-
raise "there is no users with ids #{mismatched_ids} in the community"
|
464
|
-
end
|
465
|
-
|
466
|
-
current_writers_ids = ActiveSupport::JSON.decode self.writers_ids
|
467
|
-
already_added_ids = current_writers_ids & uids
|
468
|
-
uids -= already_added_ids
|
511
|
+
relations = ::Inkwell::CommunityUser.where user_id_attr => uids, community_id_attr => self.id, :user_access => CommunityAccessLevels::READ, :is_admin => false
|
512
|
+
raise "there is different count of passed uids (#{uids.size}) and found users (#{relations.size}) in this community" unless relations.size == uids.size
|
469
513
|
|
470
|
-
|
471
|
-
self.writers_ids = ActiveSupport::JSON.encode current_writers_ids
|
514
|
+
self.writer_count += relations.size
|
472
515
|
self.save
|
473
516
|
|
474
|
-
|
475
|
-
users = user_class.find uids
|
476
|
-
users.each do |user|
|
477
|
-
raise "user with id #{uid} does not exist" unless user
|
478
|
-
communities_info = ActiveSupport::JSON.decode user.communities_info
|
479
|
-
index = communities_info.index { |rec| rec[HashParams::COMMUNITY_ID] == self.id }
|
480
|
-
communities_info[index][HashParams::ACCESS_LEVEL] = CommunityAccessLevels::WRITE
|
481
|
-
user.communities_info = ActiveSupport::JSON.encode communities_info
|
482
|
-
user.save
|
483
|
-
end
|
517
|
+
relations.update_all :user_access => CommunityAccessLevels::WRITE
|
484
518
|
end
|
485
519
|
|
486
520
|
def set_read_access(uids)
|
487
521
|
raise "array with users ids should be passed" unless uids.class == Array
|
488
|
-
|
489
|
-
|
490
|
-
unless matching_ids.size == uids.size
|
491
|
-
mismatched_ids = uids - matching_ids
|
492
|
-
raise "there is no users with ids #{mismatched_ids} in the community"
|
493
|
-
end
|
522
|
+
relations = ::Inkwell::CommunityUser.where user_id_attr => uids, community_id_attr => self.id, :user_access => CommunityAccessLevels::WRITE, :is_admin => false
|
523
|
+
raise "there is different count of passed uids (#{uids.size}) and found users (#{relations.size}) in this community" unless relations.size == uids.size
|
494
524
|
|
495
|
-
|
496
|
-
raise "there is impossible to change access level to read for admins with ids #{matching_ids} in the community" unless matching_ids.empty?
|
497
|
-
|
498
|
-
current_writers_ids = ActiveSupport::JSON.decode self.writers_ids
|
499
|
-
current_writers_ids -= uids
|
500
|
-
self.writers_ids = ActiveSupport::JSON.encode current_writers_ids
|
525
|
+
self.writer_count -= relations.size
|
501
526
|
self.save
|
502
527
|
|
503
|
-
|
504
|
-
users = user_class.find uids
|
505
|
-
users.each do |user|
|
506
|
-
raise "user with id #{uid} does not exist" unless user
|
507
|
-
communities_info = ActiveSupport::JSON.decode user.communities_info
|
508
|
-
index = communities_info.index { |rec| rec[HashParams::COMMUNITY_ID] == self.id }
|
509
|
-
communities_info[index][HashParams::ACCESS_LEVEL] = CommunityAccessLevels::READ
|
510
|
-
user.communities_info = ActiveSupport::JSON.encode communities_info
|
511
|
-
user.save
|
512
|
-
end
|
528
|
+
relations.update_all :user_access => CommunityAccessLevels::READ
|
513
529
|
end
|
514
530
|
|
515
|
-
|
516
|
-
|
517
|
-
def remove_invitation_request(user)
|
518
|
-
invitations_uids = ActiveSupport::JSON.decode self.invitations_uids
|
519
|
-
invitations_uids.delete user.id
|
520
|
-
self.invitations_uids = ActiveSupport::JSON.encode invitations_uids
|
521
|
-
self.save
|
531
|
+
def reader_count
|
532
|
+
self.user_count - self.writer_count
|
522
533
|
end
|
523
534
|
|
535
|
+
private
|
536
|
+
|
524
537
|
def processing_a_community
|
525
|
-
user_class = Object.const_get ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize
|
526
538
|
owner = user_class.find self.owner_id
|
527
|
-
|
528
|
-
communities_info = ActiveSupport::JSON.decode owner.communities_info
|
529
|
-
communities_info << Hash[HashParams::COMMUNITY_ID => self.id, HashParams::ACCESS_LEVEL => self.default_user_access]
|
530
|
-
owner.communities_info = ActiveSupport::JSON.encode communities_info
|
539
|
+
owner.community_count += 1
|
531
540
|
owner.save
|
532
541
|
|
533
|
-
|
534
|
-
|
535
|
-
self.users_ids = ActiveSupport::JSON.encode [owner.id]
|
536
|
-
self.writers_ids = ActiveSupport::JSON.encode [owner.id]
|
537
|
-
self.save
|
542
|
+
::Inkwell::CommunityUser.create user_id_attr => self.owner_id, community_id_attr => self.id, :is_admin => true, :admin_level => 0,
|
543
|
+
:user_access => CommunityAccessLevels::WRITE, :active => true
|
538
544
|
end
|
539
545
|
|
540
546
|
def destroy_community_processing
|
541
|
-
|
542
|
-
users_ids
|
543
|
-
|
544
|
-
user
|
545
|
-
communities_info = ActiveSupport::JSON.decode user.communities_info
|
546
|
-
communities_info.delete_if {|item| item[HashParams::COMMUNITY_ID] == self.id}
|
547
|
-
user.communities_info = ActiveSupport::JSON.encode communities_info
|
547
|
+
users_ids = self.users_row
|
548
|
+
users_ids.each do |uid|
|
549
|
+
user = user_class.find uid
|
550
|
+
user.community_count -= 1
|
548
551
|
user.save
|
549
552
|
end
|
550
553
|
|
554
|
+
::Inkwell::CommunityUser.delete_all community_id_attr => self.id
|
555
|
+
|
551
556
|
timeline_items = ::Inkwell::TimelineItem.where "from_source like '%{\"community_id\":#{self.id}%'"
|
552
557
|
timeline_items.delete_all :has_many_sources => false
|
553
558
|
timeline_items.each do |item|
|