libertree-model 0.9.13 → 0.9.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|