libertree-model 0.9.13 → 0.9.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/libertree/model/account.rb +14 -4
- data/lib/libertree/model/chat-message.rb +7 -2
- data/lib/libertree/model/has-searchable-text.rb +6 -4
- data/lib/libertree/model/job.rb +16 -9
- data/lib/libertree/model/member.rb +13 -8
- data/lib/libertree/model/node_subscription.rb +2 -1
- data/lib/libertree/model/notification.rb +8 -2
- data/lib/libertree/model/post.rb +51 -32
- data/lib/libertree/model/profile.rb +5 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5571a9aaefa5aabcc1a15a11bd9eac49a49aed6a16cdcb6ce33cf13706abe66
|
4
|
+
data.tar.gz: bac9a39c327eb71527c7473d655e91349d5275953fb2075567a723eb2f88a2f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 525a5546eb0f68a0d65521c9574926e70aee266a6a7088a3bfa1af1677b321dd42584a60bb1cd612e34542aa13cef407127e5e68ec6e1b33d746ccded4cb806c
|
7
|
+
data.tar.gz: 1b7aa3baeb1430d6805f55b72d3fdab9419c7c9e7e3047ea771837c75436db20b2e8cb527e30c8b63432104617fda86d5ca038f8f2c417298286d22bd78c8ac9
|
@@ -42,8 +42,13 @@ module Libertree
|
|
42
42
|
|
43
43
|
def self.authenticate_db(creds)
|
44
44
|
if creds['password_reset_code'].to_s
|
45
|
-
account = Account.where(
|
46
|
-
|
45
|
+
account = Account.where(
|
46
|
+
Sequel.lit(
|
47
|
+
%{password_reset_code = ? AND NOW() <= password_reset_expiry},
|
48
|
+
creds['password_reset_code'].to_s
|
49
|
+
)
|
50
|
+
).first
|
51
|
+
|
47
52
|
if account
|
48
53
|
return account
|
49
54
|
end
|
@@ -286,7 +291,9 @@ module Libertree
|
|
286
291
|
end
|
287
292
|
|
288
293
|
def invitations_not_accepted
|
289
|
-
Invitation.where(
|
294
|
+
Invitation.where(
|
295
|
+
Sequel.lit("inviter_account_id = ? AND account_id IS NULL", self.id)
|
296
|
+
).order(:id).all
|
290
297
|
end
|
291
298
|
|
292
299
|
def new_invitation
|
@@ -362,7 +369,10 @@ module Libertree
|
|
362
369
|
# @return [Boolean] true iff password reset was successfully set up
|
363
370
|
def self.set_up_password_reset_for(email)
|
364
371
|
# TODO: Don't allow registration of accounts with the same email but different case
|
365
|
-
account = self.where(
|
372
|
+
account = self.where(
|
373
|
+
Sequel.lit('LOWER(email) = ?', email.downcase)
|
374
|
+
).first
|
375
|
+
|
366
376
|
if account
|
367
377
|
account.password_reset_code = SecureRandom.hex(16)
|
368
378
|
account.password_reset_expiry = Time.now + 60 * 60
|
@@ -67,8 +67,13 @@ module Libertree
|
|
67
67
|
def self.mark_seen_between(account, member_id)
|
68
68
|
return if account.nil?
|
69
69
|
|
70
|
-
self.where(
|
71
|
-
|
70
|
+
self.where(
|
71
|
+
Sequel.lit(
|
72
|
+
"from_member_id = ? AND to_member_id = ?",
|
73
|
+
member_id.to_i,
|
74
|
+
account.member.id
|
75
|
+
)
|
76
|
+
).update(seen: true)
|
72
77
|
end
|
73
78
|
end
|
74
79
|
end
|
@@ -9,10 +9,12 @@ module Libertree
|
|
9
9
|
else
|
10
10
|
dict = 'english'
|
11
11
|
end
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
|
13
|
+
self.where(
|
14
|
+
Sequel.lit("(to_tsvector('simple', text) || to_tsvector('english', text)) @@ plainto_tsquery('#{dict}', ?)", q)
|
15
|
+
).reverse_order(:time_created)
|
16
|
+
.limit(limit.to_i)
|
17
|
+
.all
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
data/lib/libertree/model/job.rb
CHANGED
@@ -45,7 +45,12 @@ module Libertree
|
|
45
45
|
|
46
46
|
# @return [Job] nil if no job was reserved
|
47
47
|
def self.reserve(tasks)
|
48
|
-
job = self.where(
|
48
|
+
job = self.where(
|
49
|
+
Sequel.lit("task IN ? AND pid IS NULL AND tries < #{MAX_TRIES} AND time_to_start <= NOW()", tasks)
|
50
|
+
).order(:time_to_start)
|
51
|
+
.limit(1)
|
52
|
+
.first
|
53
|
+
|
49
54
|
return nil if job.nil?
|
50
55
|
|
51
56
|
self.where({ id: job.id, pid: nil }).
|
@@ -72,20 +77,22 @@ module Libertree
|
|
72
77
|
params = args[1..-1]
|
73
78
|
|
74
79
|
self.where(
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
80
|
+
Sequel.lit(
|
81
|
+
query + %{
|
82
|
+
AND time_finished IS NULL
|
83
|
+
AND tries < ?
|
84
|
+
},
|
85
|
+
*params,
|
86
|
+
MAX_TRIES
|
87
|
+
)
|
81
88
|
)
|
82
89
|
end
|
83
90
|
|
84
91
|
def self.unfinished(task=nil)
|
85
92
|
if task
|
86
|
-
self.where("task = ? AND time_finished IS NULL", task).all
|
93
|
+
self.where(Sequel.lit("task = ? AND time_finished IS NULL", task)).all
|
87
94
|
else
|
88
|
-
self.where("time_finished IS NULL").all
|
95
|
+
self.where(Sequel.lit("time_finished IS NULL")).all
|
89
96
|
end
|
90
97
|
end
|
91
98
|
end
|
@@ -80,18 +80,23 @@ module Libertree
|
|
80
80
|
if local
|
81
81
|
self.qualify.
|
82
82
|
join(:accounts, :id=>:account_id).
|
83
|
-
where(:
|
83
|
+
where(Sequel.qualify(:accounts, :username) => username).
|
84
84
|
limit(1).
|
85
85
|
first
|
86
86
|
else
|
87
87
|
# TODO: servers.name_given is no longer used. Remove it after
|
88
88
|
# migrating user rivers/contact lists etc.
|
89
|
-
self.qualify
|
90
|
-
join(:servers, :id=>:server_id)
|
91
|
-
where(:
|
92
|
-
where(
|
93
|
-
|
94
|
-
|
89
|
+
self.qualify
|
90
|
+
.join(:servers, :id=>:server_id)
|
91
|
+
.where(Sequel.qualify(:members, :username) => username)
|
92
|
+
.where(
|
93
|
+
Sequel.or(
|
94
|
+
Sequel.qualify(:servers, :domain) => host,
|
95
|
+
Sequel.qualify(:servers, :name_given) => host
|
96
|
+
)
|
97
|
+
)
|
98
|
+
.limit(1)
|
99
|
+
.first
|
95
100
|
end
|
96
101
|
end
|
97
102
|
|
@@ -100,7 +105,7 @@ module Libertree
|
|
100
105
|
def self.with_display_name(name)
|
101
106
|
self.qualify.
|
102
107
|
join(:profiles, :member_id=>:id).
|
103
|
-
where(:
|
108
|
+
where(Sequel.qualify(:profiles, :name_display) => name).
|
104
109
|
limit(1).
|
105
110
|
first
|
106
111
|
end
|
@@ -7,6 +7,7 @@ module Libertree
|
|
7
7
|
:subscribed ]
|
8
8
|
|
9
9
|
many_to_one :node
|
10
|
+
set_primary_key :id
|
10
11
|
|
11
12
|
def self.for(jid_or_host)
|
12
13
|
return self unless jid_or_host
|
@@ -14,7 +15,7 @@ module Libertree
|
|
14
15
|
if jid_or_host.include?('@')
|
15
16
|
self.where(jid: jid_or_host)
|
16
17
|
else
|
17
|
-
host_pattern = self.where.escape_like(jid_or_host.to_s)
|
18
|
+
host_pattern = self.where(Sequel.lit('true')).escape_like(jid_or_host.to_s)
|
18
19
|
self.where(Sequel.like(:jid, "%@#{host_pattern}"))
|
19
20
|
end
|
20
21
|
end
|
@@ -46,8 +46,14 @@ module Libertree
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def self.mark_seen_for_account_and_message(account, message)
|
49
|
-
self.where(
|
50
|
-
|
49
|
+
self.where(
|
50
|
+
Sequel.lit(
|
51
|
+
"account_id = ? AND data = ?",
|
52
|
+
account.id,
|
53
|
+
%|{"type":"message","message_id":#{message.id}}|
|
54
|
+
)
|
55
|
+
).update(seen: true)
|
56
|
+
|
51
57
|
account.dirty
|
52
58
|
end
|
53
59
|
|
data/lib/libertree/model/post.rb
CHANGED
@@ -96,7 +96,13 @@ module Libertree
|
|
96
96
|
def mark_as_unread_by_all( options = {} )
|
97
97
|
except_accounts = options.fetch(:except, [])
|
98
98
|
if except_accounts.any?
|
99
|
-
DB.dbh[:posts_read].where(
|
99
|
+
DB.dbh[:posts_read].where(
|
100
|
+
Sequel.lit(
|
101
|
+
'post_id = ? AND NOT account_id IN ?',
|
102
|
+
self.id,
|
103
|
+
except_accounts.map(&:id)
|
104
|
+
)
|
105
|
+
).delete
|
100
106
|
else
|
101
107
|
DB.dbh[ "DELETE FROM posts_read WHERE post_id = ?", self.id ].get
|
102
108
|
end
|
@@ -351,47 +357,47 @@ module Libertree
|
|
351
357
|
posts.
|
352
358
|
qualify.
|
353
359
|
left_outer_join(:posts_hidden,
|
354
|
-
:
|
355
|
-
:
|
356
|
-
where(:
|
360
|
+
Sequel.qualify(:posts_hidden, :post_id) => Sequel.qualify(:posts, :id),
|
361
|
+
Sequel.qualify(:posts_hidden, :account_id) => account.id).
|
362
|
+
where(Sequel.qualify(:posts_hidden, :post_id) => nil)
|
357
363
|
end
|
358
364
|
|
359
365
|
def self.read_by(account, posts=self)
|
360
366
|
posts.
|
361
367
|
qualify.
|
362
368
|
join(:posts_read,
|
363
|
-
:
|
364
|
-
:
|
369
|
+
Sequel.qualify(:posts_read, :post_id) => Sequel.qualify(:posts, :id),
|
370
|
+
Sequel.qualify(:posts_read, :account_id) => account.id)
|
365
371
|
end
|
366
372
|
|
367
373
|
def self.unread_by(account, posts=self)
|
368
374
|
posts.
|
369
375
|
qualify.
|
370
376
|
left_outer_join(:posts_read,
|
371
|
-
:
|
372
|
-
:
|
373
|
-
where(:
|
377
|
+
Sequel.qualify(:posts_read, :post_id) => Sequel.qualify(:posts, :id),
|
378
|
+
Sequel.qualify(:posts_read, :account_id) => account.id).
|
379
|
+
where(Sequel.qualify(:posts_read, :post_id) => nil)
|
374
380
|
end
|
375
381
|
|
376
382
|
def self.liked_by(member, posts=self)
|
377
383
|
posts.
|
378
384
|
qualify.
|
379
385
|
join(:post_likes,
|
380
|
-
:
|
381
|
-
:
|
386
|
+
Sequel.qualify(:post_likes, :post_id) => Sequel.qualify(:posts, :id),
|
387
|
+
Sequel.qualify(:post_likes, :member_id) => member.id)
|
382
388
|
end
|
383
389
|
|
384
390
|
def self.without_liked_by(member, posts=self)
|
385
391
|
posts.
|
386
392
|
qualify.
|
387
393
|
join(:post_likes,
|
388
|
-
:
|
389
|
-
:
|
394
|
+
Sequel.qualify(:post_likes, :post_id) => Sequel.qualify(:posts, :id),
|
395
|
+
Sequel.qualify(:post_likes, :member_id) => member.id)
|
390
396
|
end
|
391
397
|
|
392
398
|
def self.commented_on_by(member, posts=self)
|
393
399
|
posts.
|
394
|
-
where(:
|
400
|
+
where(Sequel.qualify(:posts, :id) => Comment.
|
395
401
|
select(:post_id).
|
396
402
|
distinct(:post_id).
|
397
403
|
where(:member_id => member.id))
|
@@ -399,7 +405,7 @@ module Libertree
|
|
399
405
|
|
400
406
|
def self.without_commented_on_by(member, posts=self)
|
401
407
|
posts.
|
402
|
-
exclude(:
|
408
|
+
exclude(Sequel.qualify(:posts, :id) => Comment.
|
403
409
|
select(:post_id).
|
404
410
|
distinct(:post_id).
|
405
411
|
where(:member_id => member.id))
|
@@ -409,17 +415,17 @@ module Libertree
|
|
409
415
|
posts.
|
410
416
|
qualify.
|
411
417
|
join(:post_subscriptions,
|
412
|
-
:
|
413
|
-
:
|
418
|
+
Sequel.qualify(:post_subscriptions, :post_id) => Sequel.qualify(:posts, :id),
|
419
|
+
Sequel.qualify(:post_subscriptions, :account_id) => account.id)
|
414
420
|
end
|
415
421
|
|
416
422
|
def self.without_subscribed_to_by(account, posts=self)
|
417
423
|
posts.
|
418
424
|
qualify.
|
419
425
|
left_outer_join(:post_subscriptions,
|
420
|
-
:
|
421
|
-
:
|
422
|
-
where(:
|
426
|
+
Sequel.qualify(:post_subscriptions, :post_id) => Sequel.qualify(:posts, :id),
|
427
|
+
Sequel.qualify(:post_subscriptions, :account_id) => account.id).
|
428
|
+
where(Sequel.qualify(:post_subscriptions, :post_id) => nil)
|
423
429
|
end
|
424
430
|
|
425
431
|
def self.filter_by_query(parsed_query, account, posts=self)
|
@@ -518,13 +524,19 @@ module Libertree
|
|
518
524
|
|
519
525
|
# filter by simple terms first to avoid having to check so many posts
|
520
526
|
# TODO: prevent empty arguments to to_tsquery
|
521
|
-
posts = posts.where(
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
527
|
+
posts = posts.where(
|
528
|
+
Sequel.lit(
|
529
|
+
%{
|
530
|
+
to_tsvector('simple', text)
|
531
|
+
@@ (to_tsquery('simple', ?)
|
532
|
+
&& to_tsquery('simple', ?)
|
533
|
+
&& to_tsquery('simple', ?))
|
534
|
+
},
|
535
|
+
words[:negations].map{|w| "!#{w}" }.join(' & '),
|
536
|
+
words[:requirements].join(' & '),
|
537
|
+
words[:regular].join(' | ')
|
538
|
+
)
|
539
|
+
)
|
528
540
|
end
|
529
541
|
|
530
542
|
{ 'visibility' => :visibility,
|
@@ -618,14 +630,16 @@ module Libertree
|
|
618
630
|
|
619
631
|
get_comments = lambda do
|
620
632
|
comments = Comment.on_post(post, viewing_account: viewing_account)
|
621
|
-
comment_likes = CommentLike.where(
|
633
|
+
comment_likes = CommentLike.where(
|
634
|
+
Sequel.lit('comment_id IN ?', comments.map(&:id))
|
635
|
+
).reduce({}) { |hash, like|
|
622
636
|
if hash[like.comment_id]
|
623
637
|
hash[like.comment_id] << like
|
624
638
|
else
|
625
639
|
hash[like.comment_id] = [like]
|
626
640
|
end
|
627
641
|
hash
|
628
|
-
|
642
|
+
}
|
629
643
|
|
630
644
|
comments.map do |comment|
|
631
645
|
likes = if comment_likes[comment.id]
|
@@ -699,9 +713,14 @@ module Libertree
|
|
699
713
|
end
|
700
714
|
|
701
715
|
def pools_by_member(member_id)
|
702
|
-
Libertree::Model::Pool.qualify
|
703
|
-
join(
|
704
|
-
|
716
|
+
Libertree::Model::Pool.qualify
|
717
|
+
.join(
|
718
|
+
:pools_posts,
|
719
|
+
Sequel.qualify(:pools_posts, :pool_id) => Sequel.qualify(:pools, :id)
|
720
|
+
).where(
|
721
|
+
Sequel.qualify(:pools_posts, :post_id) => self.id,
|
722
|
+
Sequel.qualify(:pools, :member_id) => member_id
|
723
|
+
)
|
705
724
|
end
|
706
725
|
|
707
726
|
def update_collection_status_for_member(member_id, pool_ids)
|
@@ -18,7 +18,11 @@ module Libertree
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def self.search(query)
|
21
|
-
self.where(
|
21
|
+
self.where(
|
22
|
+
Sequel.lit("(to_tsvector('simple', description) || to_tsvector('english', description)) @@ plainto_tsquery(?)", query)
|
23
|
+
).or(
|
24
|
+
Sequel.lit("name_display ILIKE '%' || ? || '%'", query)
|
25
|
+
)
|
22
26
|
end
|
23
27
|
end
|
24
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libertree-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pistos
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-07-
|
12
|
+
date: 2020-07-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ruby-oembed
|
@@ -57,16 +57,16 @@ dependencies:
|
|
57
57
|
name: sequel
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
62
|
+
version: 5.34.0
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - "
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: 5.34.0
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: bcrypt-ruby
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|