Skip to content

Commit 6e6c229

Browse files
committed
[C] Update and fix failing tests
1 parent 3d7f5a3 commit 6e6c229

20 files changed

+166
-56
lines changed

api/app/controllers/oauth_controller.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ def redirect_resource_query_string
5858
end
5959

6060
def redirect_body
61+
scrubbed_provider_name = Loofah.scrub_html5_fragment(params[:provider], :prune).to_s
62+
6163
<<~HEREDOC
6264
<!DOCTYPE html>
6365
<html>
@@ -68,7 +70,7 @@ def redirect_body
6870
<body>
6971
<div style="margin-top: 100px; text-align: center;">
7072
<h1>Redirecting, Please Wait</h1>
71-
<form id="auth_redirect_form" action="/auth/#{params[:provider]}" method="POST">
73+
<form id="auth_redirect_form" action="/auth/#{scrubbed_provider_name}" method="POST">
7274
<input type="hidden" name="authenticity_token" value="#{session["_csrf_token"]}" />
7375
<input type="submit" id="auth_redirect_submit" value="Click here if you're not automatically redirected" />
7476
</form>

api/app/models/user_group.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ class UserGroup < ApplicationRecord
1414
validates :name, presence: true, uniqueness: true
1515

1616
def entitlement_subjects
17-
entitleables.includes(:entitleable).map(&:entitleable).compact
17+
entitleables.map(&:entitleable).compact
18+
end
19+
20+
def sync_member_entitlements!
21+
UserGroups::SyncMemberEntitlements.new.call(self)
1822
end
1923
end

api/app/models/user_group_entitleable.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ class UserGroupEntitleable < ApplicationRecord
1010
attr_accessor :target_url
1111

1212
before_validation :maybe_derive_entitleable
13+
after_create :sync_member_entitlements!
14+
after_destroy :sync_member_entitlements!
1315

1416
private
1517

@@ -21,4 +23,8 @@ def maybe_derive_entitleable
2123
self.entitleable = nil
2224
Rils.logger.warn("Entitleable not found for GID #{target_url}")
2325
end
26+
27+
def sync_member_entitlements!
28+
user_group.sync_member_entitlements!
29+
end
2430
end

api/app/models/user_group_membership.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ class UserGroupMembership < ApplicationRecord
1010

1111
belongs_to :source, polymorphic: true, optional: true
1212

13+
after_create :sync_entitlements!
14+
1315
def name
1416
"#{user_group.name} membership for #{user.name}"
1517
end
18+
19+
def sync_entitlements!
20+
UserGroupMemberships::SyncEntitlements.new.call(self)
21+
end
1622
end

api/app/operations/identities/sync_managed_entitlements.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ def call(identity, auth_hash)
1818
@auth_hash = auth_hash
1919

2020
to_remove.each do |entitleable|
21-
Entitlement.by_entitling_entity(identity).by_subject(entitleable).destroy_all
21+
Entitlement.by_entitling_entity(identity)
22+
.by_subject(entitleable)
23+
.destroy_all
2224
end
2325

2426
to_add.each do |entitleable|
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# frozen_string_literal: true
2+
3+
module UserGroupMemberships
4+
class SyncEntitlements
5+
include Dry::Monads[:result, :do]
6+
7+
attr_reader :membership
8+
9+
delegate :user, :user_group, to: :membership
10+
11+
# @param [User] user
12+
# @return [Dry::Monads::Result]
13+
def call(membership)
14+
@membership = membership
15+
16+
destroy_excess_entitlements
17+
create_missing_entitlements
18+
19+
return Success()
20+
end
21+
22+
def create_missing_entitlements
23+
subjects = entitlements_to_create.map { _1[:subject_type].constantize.find _1[:subject_id] }
24+
subjects.each do |subject|
25+
Entitlements::Create.run(
26+
subject:,
27+
target: user,
28+
entitling_entity: membership,
29+
scoped_roles: { read_access: true }
30+
)
31+
end
32+
end
33+
34+
def destroy_excess_entitlements
35+
entitlements_to_destroy.map do
36+
Entitlement.by_entitling_entity(membership).where(**_1)
37+
end.reduce do |memo, query|
38+
memo.or(query)
39+
end&.destroy_all
40+
end
41+
42+
def entitlements_to_create
43+
expected_entitlements - existing_entitlements
44+
end
45+
46+
def entitlements_to_destroy
47+
existing_entitlements - expected_entitlements
48+
end
49+
50+
def existing_entitlements
51+
@existing_entitlements ||= Entitlement.where(
52+
target: user,
53+
entitler: membership.to_upsertable_entitler
54+
).map do
55+
{ subject_type: _1.subject_type, subject_id: _1.subject_id }
56+
end
57+
end
58+
59+
def expected_entitlements
60+
@expected_entitlements ||= user_group.entitleables.reload.map do
61+
{ subject_type: _1.entitleable_type, subject_id: _1.entitleable_id }
62+
end
63+
end
64+
end
65+
end

api/app/operations/user_groups/add_member.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
module UserGroups
44
class AddMember
55
include Dry::Monads[:result, :do]
6-
include ManifoldApi::Deps[
7-
upsert_user_group_entitlements: "user_groups.upsert_entitlements",
8-
]
96

107
include UserGroups::ParsesIdentity
118

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
3+
module UserGroups
4+
class SyncMemberEntitlements
5+
include Dry::Monads[:result, :do]
6+
7+
attr_reader :user_group
8+
9+
delegate :user, :memberships, to: :user_group
10+
11+
# @param [UserGroup] user_group
12+
# @return [Dry::Monads::Result]
13+
def call(user_group)
14+
user_group.memberships.each do |membership|
15+
UserGroupMemberships::SyncEntitlements.new.call(membership)
16+
end
17+
18+
Success()
19+
end
20+
end
21+
end

api/app/operations/user_groups/upsert_entitlements.rb

Lines changed: 0 additions & 37 deletions
This file was deleted.

api/app/serializers/v1/concerns/project_serializer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ module ProjectSerializer
3939

4040
when_full do
4141
metadata(metadata: true, properties: true, formatted: true)
42-
typed_attribute :external_identifier, Types::String do |object, params|
42+
typed_attribute :external_identifier, Types::String.optional do |object, params|
4343
object.external_identifier&.identifier
4444
end
4545
typed_attribute :hero_styles, Types::Serializer::Attachment.meta(read_only: true)

0 commit comments

Comments
 (0)