Class: AgentCode::Blueprint::Generators::SeederGenerator
- Inherits:
-
Object
- Object
- AgentCode::Blueprint::Generators::SeederGenerator
- Defined in:
- lib/agentcode/blueprint/generators/seeder_generator.rb
Overview
Generates seeder files for roles and users with aggregated permissions. Port of agentcode-adonis-server seeder_generator.ts.
Constant Summary collapse
- ALL_ACTIONS =
%w[index show store update destroy trashed restore forceDelete].freeze
Instance Method Summary collapse
-
#aggregate_permissions(blueprints) ⇒ Hash<String, Array<String>>
Aggregate permissions from multiple blueprints.
-
#generate_role_seeder(roles) ⇒ String
Generate a RoleSeeder file for multi-tenant apps.
-
#generate_user_permission_seeder(roles, aggregated_permissions) ⇒ String
Generate a UserPermissionSeeder file for non-tenant apps.
-
#generate_user_role_seeder(roles, aggregated_permissions) ⇒ String
Generate a UserRoleSeeder file for multi-tenant apps.
-
#permissions_to_ruby_array(permissions) ⇒ Object
Convert permission array to Ruby array literal.
Instance Method Details
#aggregate_permissions(blueprints) ⇒ Hash<String, Array<String>>
Aggregate permissions from multiple blueprints. Returns { role_slug => ['model.action', ...] } with wildcard simplification.
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/agentcode/blueprint/generators/seeder_generator.rb', line 104 def (blueprints) result = {} blueprints.each do |blueprint| slug = blueprint[:slug] blueprint[:permissions].each do |role, perm| result[role] ||= Set.new has_all = ALL_ACTIONS.all? { |a| perm[:actions].include?(a) } if has_all result[role].add("#{slug}.*") else perm[:actions].each { |action| result[role].add("#{slug}.#{action}") } end end end # Simplify: if a role has wildcard on ALL models → ['*'] model_slugs = blueprints.map { |b| b[:slug] } final_result = {} result.each do |role, perms| perm_array = perms.to_a.sort has_all_wildcards = model_slugs.all? { |s| perms.include?("#{s}.*") } if has_all_wildcards && model_slugs.any? final_result[role] = ["*"] else final_result[role] = perm_array end end final_result end |
#generate_role_seeder(roles) ⇒ String
Generate a RoleSeeder file for multi-tenant apps.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/agentcode/blueprint/generators/seeder_generator.rb', line 15 def generate_role_seeder(roles) role_entries = roles.map do |slug, role| desc = role[:description].gsub("'", "\\\\'") " Role.find_or_create_by!(slug: '\#{slug}') do |r|\n r.name = '\#{role[:name]}'\n r.description = '\#{desc}'\n end\n RUBY\n end.join(\"\\n\\n\")\n\n <<~RUBY\n # frozen_string_literal: true\n\n\n \#{role_entries}\n RUBY\nend\n".chomp |
#generate_user_permission_seeder(roles, aggregated_permissions) ⇒ String
Generate a UserPermissionSeeder file for non-tenant apps.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/agentcode/blueprint/generators/seeder_generator.rb', line 77 def (roles, ) user_entries = roles.map do |slug, role| = [slug] || [] perm_str = () " # \#{role[:name]}\n User.find_or_create_by!(email: '\#{slug}@demo.com') do |u|\n u.password = 'password'\n u.permissions = \#{perm_str}\n end\n RUBY\n end.join(\"\\n\\n\")\n\n <<~RUBY\n # frozen_string_literal: true\n\n\n \#{user_entries}\n RUBY\nend\n".chomp |
#generate_user_role_seeder(roles, aggregated_permissions) ⇒ String
Generate a UserRoleSeeder file for multi-tenant apps.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/agentcode/blueprint/generators/seeder_generator.rb', line 39 def generate_user_role_seeder(roles, ) user_entries = roles.map do |slug, role| = [slug] || [] perm_str = () " # \#{role[:name]}\n \#{slug}_user = User.find_or_create_by!(email: '\#{slug}@demo.com') do |u|\n u.password = 'password'\n end\n \#{slug}_role = Role.find_by!(slug: '\#{slug}')\n UserRole.find_or_create_by!(\n user: \#{slug}_user,\n organization: org,\n role: \#{slug}_role\n ) do |ur|\n ur.permissions = \#{perm_str}\n end\n RUBY\n end.join(\"\\n\\n\")\n\n <<~RUBY\n # frozen_string_literal: true\n\n\n org = Organization.find_or_create_by!(slug: 'demo-org') do |o|\n o.name = 'Demo Organization'\n end\n\n \#{user_entries}\n RUBY\nend\n".chomp |
#permissions_to_ruby_array(permissions) ⇒ Object
Convert permission array to Ruby array literal.
143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/agentcode/blueprint/generators/seeder_generator.rb', line 143 def () return "[]" if .empty? return "['*']" if .length == 1 && [0] == "*" items = .map { |p| "'#{p}'" } inline = "[#{items.join(', ')}]" if inline.length <= 80 inline else lines = items.join(",\n ") "[\n #{lines},\n ]" end end |