diff --git a/README.md b/README.md index be358fc5f..9579bca21 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ within our community. ❤️ - [What is Forem?](#what-is-forem) - [Table of Contents](#table-of-contents) -- [Community](#community) +- [Community](#community) - [Contributing](#contributing) - [Getting Started](#getting-started) - [Prerequisites](#prerequisites) diff --git a/app/controllers/admin/data_update_scripts_controller.rb b/app/controllers/admin/data_update_scripts_controller.rb index 712fe0e94..1db1ce3f4 100644 --- a/app/controllers/admin/data_update_scripts_controller.rb +++ b/app/controllers/admin/data_update_scripts_controller.rb @@ -16,5 +16,11 @@ module Admin def force_run DataUpdateWorker.perform_async(params[:id]) end + + private + + def authorize_admin + authorize DataUpdateScript, :access?, policy_class: InternalPolicy + end end end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index 7c0d00a96..125fbe93b 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -37,6 +37,10 @@ module AdminHelper PROFILE_ADMIN = { name: "config: profile setup", controller: "profile_fields" }.freeze + TECH_MENU_ITEMS = [ + { name: "data_update_scripts", controller: "data_update_scripts" }, + ].sort_by { |menu_item| menu_item[:name] } + def admin_menu_items return MENU_ITEMS unless FeatureFlag.enabled?(:profile_admin) diff --git a/app/lib/constants/role.rb b/app/lib/constants/role.rb index 60a694e7c..7c71a04be 100644 --- a/app/lib/constants/role.rb +++ b/app/lib/constants/role.rb @@ -9,6 +9,7 @@ module Constants SPECIAL_ROLES = ["Admin", "Super Admin", + "Tech Admin", "Resource Admin: Article", "Resource Admin: Comment", "Resource Admin: BufferUpdate", @@ -20,6 +21,7 @@ module Constants "Resource Admin: HtmlVariant", "Resource Admin: DisplayAd", "Resource Admin: ListingCategory", - "Resource Admin: Tag"].freeze + "Resource Admin: Tag", + "Resource Admin: DataUpdateScript"].freeze end end diff --git a/app/models/data_update_script.rb b/app/models/data_update_script.rb index 7e16c67dd..9959f152c 100644 --- a/app/models/data_update_script.rb +++ b/app/models/data_update_script.rb @@ -2,6 +2,7 @@ class DataUpdateScript < ApplicationRecord DIRECTORY = Rails.root.join("lib/data_update_scripts").freeze NAMESPACE = "DataUpdateScripts".freeze STATUSES = { enqueued: 0, working: 1, succeeded: 2, failed: 3 }.freeze + resourcify enum status: STATUSES diff --git a/app/services/moderator/manage_activity_and_roles.rb b/app/services/moderator/manage_activity_and_roles.rb index 4dfc61692..8bd3a53c6 100644 --- a/app/services/moderator/manage_activity_and_roles.rb +++ b/app/services/moderator/manage_activity_and_roles.rb @@ -78,6 +78,14 @@ module Moderator check_super_admin remove_negative_roles user.add_role :super_admin + when "Tech Admin" + check_super_admin + remove_negative_roles + user.add_role :tech_admin + # DataUpdateScripts falls under the admin namespace + # and hence requires a single_resource_admin role to view + # this technical admin resource + user.add_role(:single_resource_admin, DataUpdateScript) when /^(Resource Admin: )/ check_super_admin remove_negative_roles diff --git a/app/views/admin/admin_portals/index.html.erb b/app/views/admin/admin_portals/index.html.erb index 7d2be8338..9e4da7778 100644 --- a/app/views/admin/admin_portals/index.html.erb +++ b/app/views/admin/admin_portals/index.html.erb @@ -21,4 +21,20 @@ <% end %> + +
+
+
Tech Resources
+ <% AdminHelper::TECH_MENU_ITEMS.each do |tech_menu_item| %> + + <% end %> +
+
+ diff --git a/app/views/admin/shared/_navbar.html.erb b/app/views/admin/shared/_navbar.html.erb index 398d87d04..71893b96f 100644 --- a/app/views/admin/shared/_navbar.html.erb +++ b/app/views/admin/shared/_navbar.html.erb @@ -1,4 +1,4 @@ -<% admin_menu_items.each do |menu_item| %> +<% menu_items.each do |menu_item| %> " href="/admin/<%= menu_item[:controller] %>"> <%= menu_item[:name].to_s.titleize %> diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb index 0323f3f38..60c75b6fb 100644 --- a/app/views/layouts/admin.html.erb +++ b/app/views/layouts/admin.html.erb @@ -56,11 +56,13 @@
"> <% unless controller_name == "admin_portals" %> -
- -
+
+ +
<% end %>
<% flash.each do |type, message| %> diff --git a/config/routes.rb b/config/routes.rb index 60a79e2ec..f0b9858d3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -49,9 +49,6 @@ Rails.application.routes.draw do { rack_protection: { except: %i[authenticity_token form_token json_csrf remote_token http_origin session_hijacking] } }) mount flipper_ui, at: "feature_flags" - - resources :data_update_scripts, only: %i[index show] - post "/data_update_scripts/:id/force_run", to: "data_update_scripts#force_run" end namespace :users do @@ -66,6 +63,11 @@ Rails.application.routes.draw do destroy], path: "listings/categories" resources :comments, only: [:index] + resources :data_update_scripts, only: %i[index show] do + member do + post :force_run + end + end resources :events, only: %i[index create update new edit] resources :feedback_messages, only: %i[index show] resources :invitations, only: %i[index new create destroy] diff --git a/lib/data_update_scripts/20210203104631_add_single_resource_admin_role_to_users_with_tech_admin.rb b/lib/data_update_scripts/20210203104631_add_single_resource_admin_role_to_users_with_tech_admin.rb new file mode 100644 index 000000000..f3b915ed9 --- /dev/null +++ b/lib/data_update_scripts/20210203104631_add_single_resource_admin_role_to_users_with_tech_admin.rb @@ -0,0 +1,10 @@ +module DataUpdateScripts + class AddSingleResourceAdminRoleToUsersWithTechAdmin + def run + users_with_tech_admin_role = Role.find_by(name: "tech_admin").users + users_with_tech_admin_role.find_each do |user| + user.add_role(:single_resource_admin, DataUpdateScript) + end + end + end +end diff --git a/spec/lib/data_update_scripts/add_single_resource_admin_role_to_users_with_tech_admin_spec.rb b/spec/lib/data_update_scripts/add_single_resource_admin_role_to_users_with_tech_admin_spec.rb new file mode 100644 index 000000000..99510d4de --- /dev/null +++ b/spec/lib/data_update_scripts/add_single_resource_admin_role_to_users_with_tech_admin_spec.rb @@ -0,0 +1,28 @@ +require "rails_helper" +require Rails.root.join( + "lib/data_update_scripts/20210203104631_add_single_resource_admin_role_to_users_with_tech_admin.rb", +) + +describe DataUpdateScripts::AddSingleResourceAdminRoleToUsersWithTechAdmin do + let!(:tech_admin1) { create(:user, :tech_admin) } + let!(:tech_admin2) { create(:user, :tech_admin) } + let!(:admin) { create(:user, :admin) } + + it "adds single_resource_admin roles to users with tech_admin roles" do + described_class.new.run + + expect(tech_admin1.reload.roles.pluck(:name)).to include("single_resource_admin") + expect(tech_admin2.reload.roles.pluck(:name)).to include("single_resource_admin") + end + + it "sets the correct resource type for the single_resource_admin role" do + described_class.new.run + expect(tech_admin2.reload.roles.pluck(:resource_type)).to include("DataUpdateScript") + end + + it "does not add single_resource_admin roles alongside other roles" do + described_class.new.run + expect(admin.reload.roles.pluck(:name)).not_to include("single_resource_admin") + end + +end diff --git a/spec/services/moderator/manage_activity_and_roles_spec.rb b/spec/services/moderator/manage_activity_and_roles_spec.rb index 2a710d3aa..131c22fa4 100644 --- a/spec/services/moderator/manage_activity_and_roles_spec.rb +++ b/spec/services/moderator/manage_activity_and_roles_spec.rb @@ -34,6 +34,16 @@ RSpec.describe Moderator::ManageActivityAndRoles, type: :service do expect(user.has_role?(:admin)).to be true end + it "updates user to tech admin" do + described_class.handle_user_roles( + admin: admin, + user: user, + user_params: { note_for_current_role: "Upgrading to tech admin", user_status: "Tech Admin" }, + ) + expect(user.has_role?(:tech_admin)).to be true + expect(user.has_role?(:single_resource_admin, DataUpdateScript)).to be true + end + it "updates user to single resource admin" do described_class.handle_user_roles( admin: admin,