Table of Contents

Namespace KadicAuth.Application.Permissions.Seeding

Classes

PermissionAutoSeedHostedService

Runs once at application startup and seeds every permission declared in KadicErp.Core.Abstractions.Authorization.Permissions that is not yet in the database. New permissions are automatically assigned to all active roles (and tenant roles, except platform-scoped codes) by the existing SeedPermissionsCommand handler.

The seeder is idempotent. Existing permissions are skipped. It groups entries by module so that a missing module (unmapped / not yet provisioned in Auth.Modules) does not abort the whole sweep.

Controlled by Permissions:AutoSeedOnStartup (default: true). Set to false in appsettings to disable (e.g. read-only envs).

PermissionReflectionScanner

Recorre por reflexión la clase estática KadicErp.Core.Abstractions.Authorization.Permissions y convierte cada submódulo y constante en un PermissionSeedEntry.

Convención: - Clase anidada de nivel 1 marcada con KadicErp.Core.Abstractions.Authorization.PermissionModuleAttribute = módulo. - Clase anidada de nivel 2 (p. ej. Permissions.RentACar.RentalTypes) = submódulo. - Miembros public const string dentro de un submódulo = códigos de permiso.

El ModuleKey lo declara el propio módulo vía atributo, junto a sus permisos. Antes vivía en un diccionario compilado aquí mismo (KadicAuth.Application.Permissions.Seeding.PermissionReflectionScanner.ModuleKeyMap) y una clase ausente de ese diccionario se saltaba en silencio. Ese silencio tenía dos consecuencias encadenadas: sus permisos nunca llegaban a la base de datos, y además el diff los contaba como huérfanos por no encontrarlos en la salida del escáner. Usa ScanUnmapped() para obtener justo lo que antes se perdía.

UnmappedModuleClass

Una clase de permisos cuyos códigos no se están sembrando, y el motivo. Lo que antes era un continue silencioso en el escáner.

Enums

UnmappedModuleReason

Por qué los códigos de una clase de permisos no llegan a la base de datos.