Migrate database and models for study-group-based authorization
This commit is contained in:

committed by
Sebastian Serth

parent
ec4c6207f0
commit
04ed45ea73
11
db/migrate/20220906142041_add_study_group_authorization.rb
Normal file
11
db/migrate/20220906142041_add_study_group_authorization.rb
Normal file
@ -0,0 +1,11 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AddStudyGroupAuthorization < ActiveRecord::Migration[6.1]
|
||||
def change
|
||||
add_column :external_users, :platform_admin, :boolean, default: false, nil: false
|
||||
add_column :internal_users, :platform_admin, :boolean, default: false, nil: false
|
||||
add_column :study_group_memberships, :role, :integer, limit: 1, null: false, default: 0, comment: 'Used as enum in Rails'
|
||||
add_reference :subscriptions, :study_group, index: true, null: true, foreign_key: true
|
||||
add_reference :authentication_tokens, :study_group, index: true, null: true, foreign_key: true
|
||||
end
|
||||
end
|
@ -0,0 +1,39 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class MigratePermissionsToStudyGroup < ActiveRecord::Migration[6.1]
|
||||
# rubocop:disable Rails/SkipsModelValidations
|
||||
def up
|
||||
create_default_groups
|
||||
migrate_internal_users
|
||||
migrate_external_users
|
||||
end
|
||||
|
||||
def create_default_groups
|
||||
Consumer.find_each do |consumer|
|
||||
StudyGroup.find_or_create_by!(consumer: consumer, external_id: nil) do |new_group|
|
||||
new_group.name = "Default Study Group for #{consumer.name}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def migrate_internal_users
|
||||
# Internal users don't necessarily have a study group yet, which is needed for the teacher role
|
||||
InternalUser.find_each do |user|
|
||||
user.update_columns(platform_admin: true) if user.role == 'admin'
|
||||
|
||||
study_group = StudyGroup.find_by!(consumer: user.consumer, external_id: nil)
|
||||
|
||||
# All platform admins will "just" be a teacher in the study group
|
||||
new_role = %w[admin teacher].include?(user.role) ? :teacher : :learner
|
||||
membership = StudyGroupMembership.find_or_create_by!(study_group: study_group, user: user)
|
||||
membership.update_columns(role: new_role)
|
||||
end
|
||||
end
|
||||
|
||||
def migrate_external_users
|
||||
# All external users are (or will be) in a study group once launched through LTI
|
||||
# and therefore don't need a new StudyGroupMembership
|
||||
ExternalUser.where(role: 'admin').update(platform_admin: true)
|
||||
end
|
||||
# rubocop:enable Rails/SkipsModelValidations
|
||||
end
|
8
db/migrate/20220906142603_remove_role_from_users.rb
Normal file
8
db/migrate/20220906142603_remove_role_from_users.rb
Normal file
@ -0,0 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class RemoveRoleFromUsers < ActiveRecord::Migration[6.1]
|
||||
def change
|
||||
remove_column :external_users, :role
|
||||
remove_column :internal_users, :role
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user