Created
December 21, 2017 14:30
-
-
Save jonathandixon/232961b49fe14598d93a76de5f791caf to your computer and use it in GitHub Desktop.
Hyrax: Assigning Sipity::EntitySpecificResponsibiilty
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Bison | |
module Workflow | |
class AssignEntityWorkflowPermissions | |
def self.call(target:, **) | |
entity = PowerConverter.convert(target, to: :sipity_entity) | |
users = User.where(email: target.edit_users) | |
user_agents = find_or_create_user_agents(users) | |
group_agents = find_or_create_group_agents(target.edit_groups.select { |g| g =~ /curator$/ }) | |
# Remove permission for agents that no longer have access. | |
remove_agents = existing_entity_level_agents(entity) - user_agents - group_agents | |
Sipity::EntitySpecificResponsibility.where(entity: entity, agent: remove_agents).destroy_all | |
# Assign "deposting" and "self_depositing" roles to users with edit access. | |
associate_workflow_role_at_entity_level( | |
agents: user_agents, | |
role: find_or_create_workflow_role('depositing', entity.workflow), | |
entity: entity | |
) | |
associate_workflow_role_at_entity_level( | |
agents: find_or_create_user_agents(users.select { |u| !u.student? }), | |
role: find_or_create_workflow_role('self_depositing', entity.workflow), | |
entity: entity | |
) | |
# Assign "curating" role to curator groups with edit access. | |
associate_workflow_role_at_entity_level( | |
agents: group_agents, | |
role: find_or_create_workflow_role('curating', entity.workflow), | |
entity: entity | |
) | |
end | |
private_class_method def self.associate_workflow_role_at_entity_level(agents:, role:, entity:) | |
agents.each do |agent| | |
Sipity::EntitySpecificResponsibility.find_or_create_by!(workflow_role: role, entity: entity, agent: agent) | |
end | |
end | |
private_class_method def self.existing_entity_level_agents(entity) | |
Sipity::EntitySpecificResponsibility.where(entity: entity).all.map(&:agent) | |
end | |
# Find or create a Sipity::WorkflowRole object. | |
# @param role A workflow role String. | |
# @param workflow A Sipity::Workflow object. | |
private_class_method def self.find_or_create_workflow_role(role, workflow) | |
# This should be thread-safe since all Sipity::WorkflowRole are created | |
# when the workflow is initialized. | |
Sipity::WorkflowRole.find_or_create_by!( | |
role: PowerConverter.convert_to_sipity_role(role), | |
workflow: workflow | |
) | |
end | |
# Find or create a Sipity::Agent object for a group/role. | |
# @param groups A list of Strings (group names) | |
private_class_method def self.find_or_create_group_agents(groups) | |
# This should probably be done in a thread safe way, but for now | |
# we just assume the Sipity::Agent for the group/role already exists. | |
groups.map { |g| PowerConverter.convert_to_sipity_agent(Hyrax::Group.new(g)) } | |
end | |
# Find or create a Sipity::Agent object for a user. | |
# @param users A list of ::User objects. | |
private_class_method def self.find_or_create_user_agents(users) | |
# Thread-safe way to find or create a Sipity::Agent for the users. | |
users.map(&:to_sipity_agent) | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment