identity-vault/app/lib/shortcodes.rb
2025-12-29 10:26:02 -05:00

106 lines
4.3 KiB
Ruby

# frozen_string_literal: true
module Shortcodes
class Shortcode < Data.define(:code, :label, :controller, :action, :icon, :role, :path_override)
include Rails.application.routes.url_helpers
def path
return path_override if path_override
return "/" if controller.nil?
url_for(controller: controller, action: action, only_path: true)
end
end
class << self
def all(user = nil)
shortcuts = []
# Home
shortcuts << Shortcode.new(code: "HOME", label: "Home", controller: "backend/static_pages", action: "index", icon: "", role: :general, path_override: nil)
# Most used: identities
shortcuts << Shortcode.new(code: "IDNT", label: "Identities", controller: "backend/identities", action: "index", icon: "", role: :general, path_override: nil)
# MDV primary tasks
if user&.manual_document_verifier? || user&.super_admin?
shortcuts << Shortcode.new(code: "PEND", label: "Pending verifications", controller: "backend/verifications", action: "pending", icon: "", role: :mdv, path_override: nil)
shortcuts << Shortcode.new(code: "VERF", label: "All verifications", controller: "backend/verifications", action: "index", icon: "", role: :mdv, path_override: nil)
end
# Common
shortcuts << Shortcode.new(code: "LOGS", label: "Audit logs", controller: "backend/audit_logs", action: "index", icon: "", role: :general, path_override: nil)
# Program manager
if user&.program_manager? || user&.super_admin?
shortcuts << Shortcode.new(code: "APPS", label: "OAuth2 apps", controller: "backend/programs", action: "index", icon: "", role: :program_manager, path_override: nil)
end
# Super admin (less frequent)
if user&.super_admin?
shortcuts += [
Shortcode.new(code: "USRS", label: "Backend users", controller: "backend/users", action: "index", icon: "", role: :super_admin, path_override: nil),
Shortcode.new(code: "JOBS", label: "Job queue", controller: "good_job/jobs", action: "index", icon: "", role: :super_admin, path_override: "/backend/good_job"),
Shortcode.new(code: "FLIP", label: "Feature flags", controller: "flipper/features", action: "index", icon: "", role: :super_admin, path_override: "/backend/flipper"),
Shortcode.new(code: "ORWL", label: "Console audit", controller: "audits1984/audits", action: "index", icon: "", role: :super_admin, path_override: "/backend/console_audit")
]
end
# Exit last
shortcuts << Shortcode.new(code: "EXIT", label: "Exit backend", controller: nil, action: nil, icon: "", role: :general, path_override: nil)
shortcuts
end
def find_by_code(code)
all.find { |s| s.code.upcase == code.to_s.upcase }
end
def find_by_route(controller, action, user = nil)
all(user).find { |s| s.controller == controller && s.action == action }
end
def to_json_for(user)
all(user).map do |s|
{ code: s.code, label: s.label, path: s.path, icon: s.icon }
end.to_json
end
def public_id_prefixes
@public_id_prefixes ||= begin
Rails.application.eager_load! if Rails.env.development?
ActiveRecord::Base.descendants
.select { |klass| klass.included_modules.include?(PublicIdentifiable) }
.each_with_object({}) do |klass, hash|
prefix = klass.get_public_id_prefix rescue next
path = case klass.name
when "Identity" then "/backend/identities"
when "Verification" then "/backend/verifications"
when "Address" then "/backend/identities"
else "/backend/#{klass.name.underscore.pluralize}"
end
hash[prefix] = { model: klass.name, path: path }
end
end
end
def search_scopes_for(user)
scopes = [ { key: "identities", label: "Identities", icon: "" } ]
if user&.super_admin? || user&.program_manager?
scopes << { key: "oauth_apps", label: "OAuth apps", icon: "" }
end
scopes
end
def kbar_data_for(user)
{
shortcuts: all(user).map { |s| { code: s.code, label: s.label, path: s.path, icon: s.icon } },
prefixes: public_id_prefixes,
searchScopes: search_scopes_for(user)
}.to_json
end
end
end