openstax_accounts 8.1.1 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/openstax/accounts/dev/accounts_controller.rb +1 -2
  3. data/app/controllers/openstax/accounts/sessions_controller.rb +1 -2
  4. data/app/handlers/openstax/accounts/sessions_callback.rb +2 -4
  5. data/app/models/openstax/accounts/account.rb +1 -19
  6. data/app/models/openstax/accounts/anonymous_account.rb +1 -2
  7. data/app/routines/openstax/accounts/find_or_create_account.rb +7 -8
  8. data/app/routines/openstax/accounts/find_or_create_from_sso.rb +2 -8
  9. data/app/routines/openstax/accounts/sync_accounts.rb +1 -6
  10. data/app/views/openstax/accounts/dev/accounts/_search_results.html.erb +3 -3
  11. data/config/routes.rb +1 -3
  12. data/db/migrate/14_drop_openstax_uid_and_username_uniqueness.rb +9 -0
  13. data/db/migrate/15_drop_accounts_groups.rb +42 -0
  14. data/lib/omniauth/strategies/openstax.rb +1 -1
  15. data/lib/openstax/accounts/api.rb +0 -149
  16. data/lib/openstax/accounts/current_user_manager.rb +1 -5
  17. data/lib/openstax/accounts/engine.rb +1 -1
  18. data/lib/openstax/accounts/version.rb +1 -1
  19. data/lib/tasks/sync.rake +0 -8
  20. metadata +5 -22
  21. data/app/models/openstax/accounts/application_group.rb +0 -7
  22. data/app/models/openstax/accounts/group.rb +0 -169
  23. data/app/models/openstax/accounts/group_member.rb +0 -37
  24. data/app/models/openstax/accounts/group_nesting.rb +0 -55
  25. data/app/models/openstax/accounts/group_owner.rb +0 -37
  26. data/app/representers/openstax/accounts/api/v1/application_group_representer.rb +0 -48
  27. data/app/representers/openstax/accounts/api/v1/application_groups_representer.rb +0 -20
  28. data/app/representers/openstax/accounts/api/v1/group_nesting_representer.rb +0 -31
  29. data/app/representers/openstax/accounts/api/v1/group_representer.rb +0 -71
  30. data/app/representers/openstax/accounts/api/v1/group_user_representer.rb +0 -34
  31. data/app/routines/openstax/accounts/create_group.rb +0 -26
  32. data/app/routines/openstax/accounts/sync_groups.rb +0 -67
  33. data/app/routines/openstax/accounts/update_group_caches.rb +0 -27
  34. data/lib/openstax/accounts/has_many_through_groups/active_record/base.rb +0 -51
  35. data/spec/factories/openstax_accounts_group.rb +0 -7
  36. data/spec/factories/openstax_accounts_group_member.rb +0 -6
  37. data/spec/factories/openstax_accounts_group_nesting.rb +0 -6
  38. data/spec/factories/openstax_accounts_group_owner.rb +0 -6
@@ -1,48 +0,0 @@
1
- module OpenStax
2
- module Accounts
3
- module Api
4
- module V1
5
- class ApplicationGroupRepresenter < Roar::Decorator
6
-
7
- # This representer is used to communicate with Accounts
8
- # and so must allow read/write on all properties
9
- # Do not use it in create/update APIs!
10
-
11
- include Roar::JSON
12
-
13
- property :id,
14
- type: Integer,
15
- schema_info: {
16
- description: "A unique ID number for the record that associates this group with this application",
17
- required: true
18
- }
19
-
20
- property :application_id,
21
- type: Integer,
22
- schema_info: {
23
- description: "The associated application's unique ID number",
24
- required: true
25
- }
26
-
27
- property :group,
28
- instance: ->(*) do
29
- OpenStax::Accounts::Group.new.tap{ |group| group.syncing = true }
30
- end,
31
- decorator: GroupRepresenter,
32
- schema_info: {
33
- description: "The associated group",
34
- required: true
35
- }
36
-
37
- property :unread_updates,
38
- type: Integer,
39
- schema_info: {
40
- description: "The number of updates applied to the associated group unread by the associated application",
41
- required: true
42
- }
43
-
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,20 +0,0 @@
1
- module OpenStax
2
- module Accounts
3
- module Api
4
- module V1
5
- class ApplicationGroupsRepresenter < Roar::Decorator
6
-
7
- # This representer is used to communicate with Accounts
8
- # and so must allow read/write on all properties
9
- # Do not use it in create/update APIs!
10
-
11
- include Representable::JSON::Collection
12
-
13
- items class: OpenStax::Accounts::ApplicationGroup,
14
- decorator: ApplicationGroupRepresenter
15
-
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,31 +0,0 @@
1
- module OpenStax
2
- module Accounts
3
- module Api
4
- module V1
5
- class GroupNestingRepresenter < Roar::Decorator
6
-
7
- # This representer is used to communicate with Accounts
8
- # and so must allow read/write on all properties
9
- # Do not use it in create/update APIs!
10
-
11
- include Roar::JSON
12
-
13
- property :container_group_id,
14
- type: Integer,
15
- schema_info: {
16
- description: "The unique ID number of the associated containing group",
17
- required: true
18
- }
19
-
20
- property :member_group_id,
21
- type: Integer,
22
- schema_info: {
23
- description: "The unique ID number of the associated contained group",
24
- required: true
25
- }
26
-
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,71 +0,0 @@
1
- module OpenStax
2
- module Accounts
3
- module Api
4
- module V1
5
- class GroupRepresenter < Roar::Decorator
6
-
7
- # This representer is used to communicate with Accounts
8
- # and so must allow read/write on all properties
9
- # Do not use it in create/update APIs!
10
-
11
- include Roar::JSON
12
-
13
- property :openstax_uid,
14
- as: :id,
15
- type: Integer,
16
- schema_info: {
17
- description: "The group's unique ID number",
18
- required: true
19
- }
20
-
21
- property :name,
22
- type: String,
23
- schema_info: {
24
- description: "The group's name"
25
- }
26
-
27
- property :is_public,
28
- schema_info: {
29
- type: "boolean",
30
- description: "The group's visibility setting"
31
- }
32
-
33
- collection :group_owners,
34
- as: :owners,
35
- class: GroupOwner,
36
- decorator: GroupUserRepresenter,
37
- schema_info: { description: "The owners of this group" }
38
-
39
- collection :group_members,
40
- as: :members,
41
- class: GroupMember,
42
- decorator: GroupUserRepresenter,
43
- schema_info: { description: "The direct members of this group" }
44
-
45
- collection :member_group_nestings,
46
- as: :nestings,
47
- class: GroupNesting,
48
- decorator: GroupNestingRepresenter,
49
- schema_info: { description: "The groups directly nested within this group" }
50
-
51
- property :cached_supertree_group_ids,
52
- as: :supertree_group_ids,
53
- type: Array,
54
- schema_info: {
55
- items: "integer",
56
- description: "The ID's of all groups that should be updated if this group is changed; For caching purposes"
57
- }
58
-
59
- property :cached_subtree_group_ids,
60
- as: :subtree_group_ids,
61
- type: Array,
62
- schema_info: {
63
- items: "integer",
64
- description: "The ID's of all groups nested in this group's subtree, including this one; For caching purposes"
65
- }
66
-
67
- end
68
- end
69
- end
70
- end
71
- end
@@ -1,34 +0,0 @@
1
- module OpenStax
2
- module Accounts
3
- module Api
4
- module V1
5
- class GroupUserRepresenter < Roar::Decorator
6
-
7
- # This representer is used to communicate with Accounts
8
- # and so must allow read/write on all properties
9
- # Do not use it in create/update APIs!
10
-
11
- include Roar::JSON
12
-
13
- property :group_id,
14
- type: Integer,
15
- schema_info: {
16
- required: true,
17
- description: "The associated group's unique ID number"
18
- }
19
-
20
- nested :user do
21
- property :user_id,
22
- as: :id,
23
- type: Integer,
24
- schema_info: {
25
- required: true,
26
- description: "The associated user's unique ID number"
27
- }
28
- end
29
-
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,26 +0,0 @@
1
- module OpenStax
2
- module Accounts
3
- class CreateGroup
4
-
5
- lev_routine express_output: :group
6
-
7
- protected
8
-
9
- def exec(owner:, name: nil, is_public: false)
10
- group = OpenStax::Accounts::Group.new(name: name, is_public: is_public)
11
- group.requestor = owner
12
-
13
- if OpenStax::Accounts.configuration.enable_stubbing? || !owner.has_authenticated?
14
- group.openstax_uid = -SecureRandom.hex(4).to_i(16)/2
15
- group.add_owner(owner)
16
- end
17
-
18
- group.save
19
-
20
- transfer_errors_from(group, {type: :verbatim}, true)
21
- outputs.group = group
22
- end
23
-
24
- end
25
- end
26
- end
@@ -1,67 +0,0 @@
1
- # Routine for getting group updates from the Accounts server
2
- #
3
- # Should be scheduled to run regularly
4
-
5
- module OpenStax
6
- module Accounts
7
-
8
- class SyncGroups
9
-
10
- SYNC_ATTRIBUTES = ['name', 'is_public', 'group_members',
11
- 'group_owners', 'member_group_nestings',
12
- 'cached_supertree_group_ids', 'cached_subtree_group_ids']
13
-
14
- lev_routine transaction: :no_transaction
15
-
16
- protected
17
-
18
- def exec(options={})
19
-
20
- return if OpenStax::Accounts.configuration.enable_stubbing?
21
-
22
- response = OpenStax::Accounts::Api.get_application_group_updates
23
-
24
- app_groups = []
25
- app_groups_rep = OpenStax::Accounts::Api::V1::ApplicationGroupsRepresenter.new(app_groups)
26
- app_groups_rep.from_json(response.body)
27
-
28
- return if app_groups.empty?
29
-
30
- updated_app_groups = []
31
- updated_groups = app_groups.each_with_object({}) do |app_group, hash|
32
- openstax_uid = app_group.group.openstax_uid
33
- group = OpenStax::Accounts::Group.where(
34
- openstax_uid: openstax_uid
35
- ).first || app_group.group
36
- group.syncing = true
37
-
38
- next unless group.persisted? || group.save
39
-
40
- hash[openstax_uid] = group
41
- end
42
-
43
- app_groups.each do |app_group|
44
- openstax_uid = app_group.group.openstax_uid
45
- group = updated_groups[openstax_uid]
46
-
47
- next if group.nil?
48
-
49
- if group != app_group.group
50
- SYNC_ATTRIBUTES.each do |attribute|
51
- group.send("#{attribute}=", app_group.group.send(attribute))
52
- end
53
- end
54
-
55
- next unless group.save
56
-
57
- updated_app_groups << { group_id: openstax_uid, read_updates: app_group.unread_updates }
58
- end
59
-
60
- OpenStax::Accounts::Api.mark_group_updates_as_read(updated_app_groups)
61
-
62
- end
63
-
64
- end
65
-
66
- end
67
- end
@@ -1,27 +0,0 @@
1
- # Routine for updating group caches when a group_nesting is created or destroyed
2
- #
3
- # Caller provides the group_nesting object
4
-
5
- module OpenStax
6
- module Accounts
7
-
8
- class UpdateGroupCaches
9
-
10
- # This transaction needs :repeatable_read to prevent missed updates
11
- lev_routine transaction: :repeatable_read
12
-
13
- protected
14
-
15
- def exec(group_nesting)
16
- subtree_group_ids = group_nesting.member_group.subtree_group_ids
17
- supertree_group_ids = group_nesting.container_group.supertree_group_ids
18
- tree_group_ids = (subtree_group_ids + supertree_group_ids).uniq
19
-
20
- Group.where(id: subtree_group_ids).update_all(cached_supertree_group_ids: nil)
21
- Group.where(id: supertree_group_ids).update_all(cached_subtree_group_ids: nil)
22
- end
23
-
24
- end
25
-
26
- end
27
- end
@@ -1,51 +0,0 @@
1
- module OpenStax
2
- module Accounts
3
- module HasManyThroughGroups
4
- module ActiveRecord
5
- module Base
6
- def self.included(base)
7
- base.extend(ClassMethods)
8
- end
9
-
10
- module ClassMethods
11
- def has_many_through_groups(groups_name, name, options = {})
12
- options = {class_name: name.to_s.classify}.merge(options)
13
- association_name = "direct_#{name.to_s}".to_sym
14
-
15
- OpenStax::Accounts::Group.class_exec do
16
- has_many association_name, options
17
-
18
- define_method(name) do
19
- OpenStax::Accounts::Group.includes(association_name)
20
- .where(openstax_uid: supertree_group_ids)
21
- .map { |g| g.send(association_name).to_a }.flatten.uniq
22
- end
23
- end
24
-
25
- class_exec do
26
- has_many association_name, options if options[:as]
27
-
28
- define_method(name) do
29
- direct_records = respond_to?(association_name) ? \
30
- send(association_name).to_a : []
31
- indirect_records = OpenStax::Accounts::Group
32
- .includes(association_name).where(
33
- openstax_uid: send(groups_name).map do |g|
34
- g.supertree_group_ids
35
- end.flatten.uniq
36
- )
37
- .map { |g| g.send(association_name).to_a }
38
- (direct_records + indirect_records).flatten.uniq
39
- end
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
48
-
49
- ::ActiveRecord::Base.send(
50
- :include, OpenStax::Accounts::HasManyThroughGroups::ActiveRecord::Base
51
- )
@@ -1,7 +0,0 @@
1
- FactoryBot.define do
2
- factory :openstax_accounts_group, class: OpenStax::Accounts::Group do
3
- openstax_uid { -SecureRandom.hex(4).to_i(16)/2 }
4
- name { "MyGroup" }
5
- is_public { false }
6
- end
7
- end
@@ -1,6 +0,0 @@
1
- FactoryBot.define do
2
- factory :openstax_accounts_group_member, class: OpenStax::Accounts::GroupMember do
3
- association :group, factory: :openstax_accounts_group
4
- association :user, factory: :openstax_accounts_account
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- FactoryBot.define do
2
- factory :openstax_accounts_group_nesting, class: OpenStax::Accounts::GroupNesting do
3
- association :container_group, factory: :openstax_accounts_group
4
- association :member_group, factory: :openstax_accounts_group
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- FactoryBot.define do
2
- factory :openstax_accounts_group_owner, class: OpenStax::Accounts::GroupOwner do
3
- association :group, factory: :openstax_accounts_group
4
- association :user, factory: :openstax_accounts_account
5
- end
6
- end