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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/builds/audiences-ujs.js +204 -1318
  3. data/app/controllers/audiences/contexts_controller.rb +4 -15
  4. data/app/controllers/audiences/scim_proxy_controller.rb +9 -11
  5. data/app/models/audiences/context.rb +41 -4
  6. data/app/models/audiences/context_extra_user.rb +8 -0
  7. data/app/models/audiences/criterion.rb +42 -8
  8. data/app/models/audiences/criterion_group.rb +8 -0
  9. data/app/models/audiences/external_user.rb +92 -14
  10. data/app/models/audiences/group.rb +27 -0
  11. data/app/models/audiences/group_membership.rb +14 -0
  12. data/db/migrate/20250520181229_create_audiences_groups.rb +17 -0
  13. data/db/migrate/20250521173148_add_scim_id_to_audiences_external_users.rb +8 -0
  14. data/db/migrate/20250521182852_create_audiences_group_memberships.rb +12 -0
  15. data/db/migrate/20250527203948_populate_external_users_scim_id.rb +15 -0
  16. data/db/migrate/20250528130640_add_display_name_to_audiences_external_users.rb +8 -0
  17. data/db/migrate/20250618184332_add_active_flag_to_external_users_and_groups.rb +8 -0
  18. data/db/migrate/20250620005528_create_audiences_criterion_groups.rb +12 -0
  19. data/db/migrate/20250620005800_rename_audiences_criterion_groups_to_groups_json.rb +7 -0
  20. data/db/migrate/20250623131202_move_group_criterion_to_criterion_groups.rb +27 -0
  21. data/db/migrate/20250624171247_create_audiences_context_extra_users.rb +12 -0
  22. data/db/migrate/20250624171706_rename_audiences_context_extra_users_to_extra_users_json.rb +7 -0
  23. data/db/migrate/20250701173946_move_extra_users_to_context_extra_users.rb +21 -0
  24. data/docs/CHANGELOG.md +17 -0
  25. data/docs/README.md +0 -11
  26. data/lib/audiences/configuration.rb +71 -45
  27. data/lib/audiences/editor_helper.rb +4 -1
  28. data/lib/audiences/engine.rb +19 -1
  29. data/lib/audiences/model.rb +9 -8
  30. data/lib/audiences/notifications.rb +4 -2
  31. data/lib/audiences/scim/field_mapping.rb +49 -0
  32. data/lib/audiences/scim/observer_base.rb +8 -0
  33. data/lib/audiences/scim/patch_groups_observer.rb +51 -0
  34. data/lib/audiences/scim/patch_op.rb +42 -0
  35. data/lib/audiences/scim/patch_users_observer.rb +38 -0
  36. data/lib/audiences/scim/scim_data.rb +31 -0
  37. data/lib/audiences/scim/upsert_groups_observer.rb +40 -0
  38. data/lib/audiences/scim/upsert_users_observer.rb +48 -0
  39. data/lib/audiences/scim.rb +9 -15
  40. data/lib/audiences/version.rb +1 -1
  41. data/lib/audiences.rb +5 -5
  42. metadata +40 -9
  43. data/app/jobs/audiences/application_job.rb +0 -6
  44. data/app/models/audiences/context_users.rb +0 -32
  45. data/app/models/audiences/criterion_users.rb +0 -28
  46. data/lib/audiences/railtie.rb +0 -12
  47. data/lib/audiences/scim/client.rb +0 -29
  48. data/lib/audiences/scim/resource.rb +0 -48
  49. 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: 1.6.1
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-04-22 00:00:00.000000000 Z
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/context_users.rb
57
+ - app/models/audiences/context_extra_user.rb
45
58
  - app/models/audiences/criterion.rb
46
- - app/models/audiences/criterion_users.rb
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/client.rb
72
- - lib/audiences/scim/resource.rb
73
- - lib/audiences/scim/resources_query.rb
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,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Audiences
4
- class ApplicationJob < ActiveJob::Base
5
- end
6
- end
@@ -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
@@ -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