audiences 1.6.1 → 2.0.0
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/app/assets/builds/audiences-ujs.js +204 -1318
- data/app/controllers/audiences/contexts_controller.rb +4 -15
- data/app/controllers/audiences/scim_proxy_controller.rb +9 -11
- data/app/models/audiences/context.rb +41 -4
- data/app/models/audiences/context_extra_user.rb +8 -0
- data/app/models/audiences/criterion.rb +42 -8
- data/app/models/audiences/criterion_group.rb +8 -0
- data/app/models/audiences/external_user.rb +92 -14
- data/app/models/audiences/group.rb +27 -0
- data/app/models/audiences/group_membership.rb +14 -0
- data/db/migrate/20250520181229_create_audiences_groups.rb +17 -0
- data/db/migrate/20250521173148_add_scim_id_to_audiences_external_users.rb +8 -0
- data/db/migrate/20250521182852_create_audiences_group_memberships.rb +12 -0
- data/db/migrate/20250527203948_populate_external_users_scim_id.rb +15 -0
- data/db/migrate/20250528130640_add_display_name_to_audiences_external_users.rb +8 -0
- data/db/migrate/20250618184332_add_active_flag_to_external_users_and_groups.rb +8 -0
- data/db/migrate/20250620005528_create_audiences_criterion_groups.rb +12 -0
- data/db/migrate/20250620005800_rename_audiences_criterion_groups_to_groups_json.rb +7 -0
- data/db/migrate/20250623131202_move_group_criterion_to_criterion_groups.rb +27 -0
- data/db/migrate/20250624171247_create_audiences_context_extra_users.rb +12 -0
- data/db/migrate/20250624171706_rename_audiences_context_extra_users_to_extra_users_json.rb +7 -0
- data/db/migrate/20250701173946_move_extra_users_to_context_extra_users.rb +21 -0
- data/docs/CHANGELOG.md +17 -0
- data/docs/README.md +0 -11
- data/lib/audiences/configuration.rb +71 -45
- data/lib/audiences/editor_helper.rb +4 -1
- data/lib/audiences/engine.rb +19 -1
- data/lib/audiences/model.rb +9 -8
- data/lib/audiences/notifications.rb +4 -2
- data/lib/audiences/scim/field_mapping.rb +49 -0
- data/lib/audiences/scim/observer_base.rb +8 -0
- data/lib/audiences/scim/patch_groups_observer.rb +51 -0
- data/lib/audiences/scim/patch_op.rb +42 -0
- data/lib/audiences/scim/patch_users_observer.rb +38 -0
- data/lib/audiences/scim/scim_data.rb +31 -0
- data/lib/audiences/scim/upsert_groups_observer.rb +40 -0
- data/lib/audiences/scim/upsert_users_observer.rb +48 -0
- data/lib/audiences/scim.rb +9 -15
- data/lib/audiences/version.rb +1 -1
- data/lib/audiences.rb +5 -5
- metadata +40 -9
- data/app/jobs/audiences/application_job.rb +0 -6
- data/app/models/audiences/context_users.rb +0 -32
- data/app/models/audiences/criterion_users.rb +0 -28
- data/lib/audiences/railtie.rb +0 -12
- data/lib/audiences/scim/client.rb +0 -29
- data/lib/audiences/scim/resource.rb +0 -48
- data/lib/audiences/scim/resources_query.rb +0 -66
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: audiences
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carlos Palhares
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aether_observatory
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rails
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -37,14 +51,15 @@ files:
|
|
37
51
|
- app/controllers/audiences/application_controller.rb
|
38
52
|
- app/controllers/audiences/contexts_controller.rb
|
39
53
|
- app/controllers/audiences/scim_proxy_controller.rb
|
40
|
-
- app/jobs/audiences/application_job.rb
|
41
54
|
- app/models/audiences/application_record.rb
|
42
55
|
- app/models/audiences/context.rb
|
43
56
|
- app/models/audiences/context/locating.rb
|
44
|
-
- app/models/audiences/
|
57
|
+
- app/models/audiences/context_extra_user.rb
|
45
58
|
- app/models/audiences/criterion.rb
|
46
|
-
- app/models/audiences/
|
59
|
+
- app/models/audiences/criterion_group.rb
|
47
60
|
- app/models/audiences/external_user.rb
|
61
|
+
- app/models/audiences/group.rb
|
62
|
+
- app/models/audiences/group_membership.rb
|
48
63
|
- app/models/audiences/membership.rb
|
49
64
|
- app/models/audiences/users_search.rb
|
50
65
|
- app/models/concerns/audiences/membership_group.rb
|
@@ -58,6 +73,18 @@ files:
|
|
58
73
|
- db/migrate/20231130172718_create_audiences_memberships.rb
|
59
74
|
- db/migrate/20231205140046_remove_serialized_users_from_criterion.rb
|
60
75
|
- db/migrate/20240722025634_add_relation_to_context.rb
|
76
|
+
- db/migrate/20250520181229_create_audiences_groups.rb
|
77
|
+
- db/migrate/20250521173148_add_scim_id_to_audiences_external_users.rb
|
78
|
+
- db/migrate/20250521182852_create_audiences_group_memberships.rb
|
79
|
+
- db/migrate/20250527203948_populate_external_users_scim_id.rb
|
80
|
+
- db/migrate/20250528130640_add_display_name_to_audiences_external_users.rb
|
81
|
+
- db/migrate/20250618184332_add_active_flag_to_external_users_and_groups.rb
|
82
|
+
- db/migrate/20250620005528_create_audiences_criterion_groups.rb
|
83
|
+
- db/migrate/20250620005800_rename_audiences_criterion_groups_to_groups_json.rb
|
84
|
+
- db/migrate/20250623131202_move_group_criterion_to_criterion_groups.rb
|
85
|
+
- db/migrate/20250624171247_create_audiences_context_extra_users.rb
|
86
|
+
- db/migrate/20250624171706_rename_audiences_context_extra_users_to_extra_users_json.rb
|
87
|
+
- db/migrate/20250701173946_move_extra_users_to_context_extra_users.rb
|
61
88
|
- docs/CHANGELOG.md
|
62
89
|
- docs/README.md
|
63
90
|
- lib/audiences.rb
|
@@ -66,11 +93,15 @@ files:
|
|
66
93
|
- lib/audiences/engine.rb
|
67
94
|
- lib/audiences/model.rb
|
68
95
|
- lib/audiences/notifications.rb
|
69
|
-
- lib/audiences/railtie.rb
|
70
96
|
- lib/audiences/scim.rb
|
71
|
-
- lib/audiences/scim/
|
72
|
-
- lib/audiences/scim/
|
73
|
-
- lib/audiences/scim/
|
97
|
+
- lib/audiences/scim/field_mapping.rb
|
98
|
+
- lib/audiences/scim/observer_base.rb
|
99
|
+
- lib/audiences/scim/patch_groups_observer.rb
|
100
|
+
- lib/audiences/scim/patch_op.rb
|
101
|
+
- lib/audiences/scim/patch_users_observer.rb
|
102
|
+
- lib/audiences/scim/scim_data.rb
|
103
|
+
- lib/audiences/scim/upsert_groups_observer.rb
|
104
|
+
- lib/audiences/scim/upsert_users_observer.rb
|
74
105
|
- lib/audiences/version.rb
|
75
106
|
- lib/tasks/audiences_tasks.rake
|
76
107
|
homepage: https://github.com/powerhome/audiences
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Audiences
|
4
|
-
# @private
|
5
|
-
class ContextUsers
|
6
|
-
include Enumerable
|
7
|
-
|
8
|
-
def initialize(context)
|
9
|
-
@context = context
|
10
|
-
end
|
11
|
-
|
12
|
-
def each(...)
|
13
|
-
if @context.match_all
|
14
|
-
all_users.each(...)
|
15
|
-
else
|
16
|
-
matching_users.each(...)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def all_users
|
23
|
-
users = Scim.resource(:Users).all
|
24
|
-
ExternalUser.wrap(users)
|
25
|
-
end
|
26
|
-
|
27
|
-
def matching_users
|
28
|
-
extras = ExternalUser.wrap(@context.extra_users)
|
29
|
-
[*extras, *@context.criteria.flat_map(&:users)].uniq
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Audiences
|
4
|
-
# @private
|
5
|
-
class CriterionUsers
|
6
|
-
include Enumerable
|
7
|
-
|
8
|
-
def initialize(groups)
|
9
|
-
@groups = groups
|
10
|
-
end
|
11
|
-
|
12
|
-
def each(...)
|
13
|
-
@groups.values
|
14
|
-
.reject(&:empty?)
|
15
|
-
.map { |groups| groups_users(groups.pluck("id")) }
|
16
|
-
.reduce(&:&)
|
17
|
-
&.each(...)
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def groups_users(group_ids)
|
23
|
-
filter = group_ids.map { "groups.value eq #{_1}" }.join(" OR ")
|
24
|
-
users = Audiences::Scim.resource(:Users).all(filter: filter)
|
25
|
-
ExternalUser.wrap(users)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/lib/audiences/railtie.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Audiences
|
4
|
-
class Railtie < Rails::Railtie
|
5
|
-
initializer "audiences.editor_helper" do
|
6
|
-
ActiveSupport.on_load(:action_view) do
|
7
|
-
require "audiences/editor_helper"
|
8
|
-
include Audiences::EditorHelper
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "net/http"
|
4
|
-
require "json"
|
5
|
-
require "uri"
|
6
|
-
|
7
|
-
module Audiences
|
8
|
-
module Scim
|
9
|
-
class Client
|
10
|
-
def initialize(uri:, headers: {})
|
11
|
-
@uri = uri
|
12
|
-
@headers = headers
|
13
|
-
end
|
14
|
-
|
15
|
-
def perform_request(method:, path:, query: {})
|
16
|
-
uri = URI.join(@uri, path.to_s)
|
17
|
-
uri.query = URI.encode_www_form(query)
|
18
|
-
request = ::Net::HTTP.const_get(method).new(uri, @headers)
|
19
|
-
|
20
|
-
http = ::Net::HTTP.new(uri.host, uri.port)
|
21
|
-
http.use_ssl = uri.scheme == "https"
|
22
|
-
|
23
|
-
response = http.request(request)
|
24
|
-
|
25
|
-
JSON.parse(response.body)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Audiences
|
4
|
-
module Scim
|
5
|
-
class Resource
|
6
|
-
attr_accessor :options, :type, :attributes, :filter
|
7
|
-
|
8
|
-
def initialize(type:, attributes: [], filter: nil, **options)
|
9
|
-
@type = type
|
10
|
-
@options = options
|
11
|
-
@attributes = ["id", "externalId", "displayName", *attributes]
|
12
|
-
@filter = filter
|
13
|
-
end
|
14
|
-
|
15
|
-
def query(**options)
|
16
|
-
options_filter = options.delete(:filter)
|
17
|
-
ResourcesQuery.new(Scim.client, resource: self,
|
18
|
-
attributes: scim_attributes,
|
19
|
-
filter: merged_filter(options_filter),
|
20
|
-
**@options, **options)
|
21
|
-
end
|
22
|
-
|
23
|
-
def all(...)
|
24
|
-
query(...).all
|
25
|
-
end
|
26
|
-
|
27
|
-
def scim_attributes
|
28
|
-
@attributes.reduce([]) do |attrs, attr|
|
29
|
-
case attr
|
30
|
-
when Hash
|
31
|
-
attrs + attr.map do |key, nested_attrs|
|
32
|
-
nested_attrs.map { "#{key}.#{_1}" }
|
33
|
-
end
|
34
|
-
else
|
35
|
-
attrs + [attr]
|
36
|
-
end
|
37
|
-
end.join(",")
|
38
|
-
end
|
39
|
-
|
40
|
-
def merged_filter(filter)
|
41
|
-
return @filter unless filter
|
42
|
-
return filter unless @filter
|
43
|
-
|
44
|
-
"(#{@filter}) and (#{filter})"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "net/http"
|
4
|
-
require "json"
|
5
|
-
require "uri"
|
6
|
-
|
7
|
-
module Audiences
|
8
|
-
module Scim
|
9
|
-
class ResourcesQuery
|
10
|
-
include Enumerable
|
11
|
-
|
12
|
-
attr_reader :options, :resource
|
13
|
-
|
14
|
-
def initialize(client, resource:, **options)
|
15
|
-
@client = client
|
16
|
-
@resource = resource
|
17
|
-
@options = options
|
18
|
-
end
|
19
|
-
|
20
|
-
def all
|
21
|
-
to_enum(:each, all: true)
|
22
|
-
end
|
23
|
-
|
24
|
-
def each(all: false, &block)
|
25
|
-
resources.each(&block)
|
26
|
-
next_page&.each(all: true, &block) if all
|
27
|
-
end
|
28
|
-
|
29
|
-
def resources
|
30
|
-
@resources ||= response.fetch("Resources", [])
|
31
|
-
end
|
32
|
-
|
33
|
-
def next_page?
|
34
|
-
start_index + per_page <= total_results
|
35
|
-
end
|
36
|
-
|
37
|
-
def start_index
|
38
|
-
response.fetch("startIndex", 1)
|
39
|
-
end
|
40
|
-
|
41
|
-
def per_page
|
42
|
-
response["itemsPerPage"].to_i
|
43
|
-
end
|
44
|
-
|
45
|
-
def total_results
|
46
|
-
response["totalResults"].to_i
|
47
|
-
end
|
48
|
-
|
49
|
-
def next_index
|
50
|
-
start_index + per_page
|
51
|
-
end
|
52
|
-
|
53
|
-
def next_page
|
54
|
-
return unless next_page?
|
55
|
-
|
56
|
-
ResourcesQuery.new(@client, resource: @resource, **@options, startIndex: next_index)
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def response
|
62
|
-
@response ||= @client.perform_request(path: @resource.type, method: :Get, query: @options)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|