fceb1e0e83
Auto Tag Develop / tag (push) Successful in 10s
## Contexte Ticket Lesstime #47 — M0 position 0.5. Wire le nouveau module **Catalog** dans Starseed et synchronise les 3 sources RBAC (sidebar + personas E2E + seed back). Couvre **RG-1.01** (Admin uniquement) côté infra. Spec : [`docs/specs/M0-categories/spec-back.md` § 5.1 + § 5.3](https://gitea.malio.fr/MALIO-DEV/Starseed/src/branch/feature/M0-spec-categories/docs/specs/M0-categories/spec-back.md). > ⚠ **Mode stacked PR** — cible `feature/ERP-46-exposer-category-type-lecture-seule`, **PAS** `develop`. Quand la MR ERP-46 sera mergée sur develop, repointer la cible de cette MR vers develop. ## Modifications (6 fichiers — règle ABSOLUE Starseed n°8 : les 3 sources RBAC bougent ENSEMBLE) | Fichier | Rôle | |---|---| | `src/Module/Catalog/CatalogModule.php` (nouveau) | Déclaration du module : `ID=catalog`, `LABEL=Catalogue`, `REQUIRED=true`, 2 permissions (`view` + `manage`) | | `config/modules.php` | Wire `CatalogModule::class` | | `config/sidebar.php` | Item « Gestion des catégories » dans section Administration, gate sur `catalog.categories.view` | | `frontend/i18n/locales/fr.json` | Clé `sidebar.catalog.categories` = `Gestion des catégories` | | `frontend/tests/e2e/_fixtures/personas.ts` | `user-full` reçoit les 2 permissions + `'categories'` dans `expectedAdminLinks`. `super-admin` et `ALL_ADMIN_LINKS` étendus avec `'categories'`. `user-readonly` inchangé (Admin-only au M0 — pas de mode read-only spec'é). | | `src/Module/Core/Infrastructure/Console/SeedE2ECommand.php` | Miroir back : `user-full` reçoit les 2 permissions | ## Décisions - **`REQUIRED = true`** : la spec § 5.1 + le prompt user disent `true` (Category sera FK NOT NULL côté futurs modules Tiers). Le ticket Lesstime dit `false` par erreur — j'ai suivi la spec. - **Personas E2E « Admin » = `user-full`** : pas de persona métier « Admin » explicite dans `personas.ts` (personas techniques : `super-admin` bypass, `user-full` = toutes permissions). `user-full` est l'équivalent fonctionnel. - **`user-readonly` NON touché** : RG-1.01 dit « Admin uniquement », pas de pattern read-only spec'é au M0. À rouvrir dans un futur ticket si besoin. ## Validation - `make php-cs-fixer-allow-risky` ✓ (0 fichier corrigé) - `make db-reset` ✓ (sync-permissions : 11 codes en base, dont les 2 nouveaux `catalog.categories.*` vérifiés via `dbal:run-sql`) - `make test` ✓ (248 tests, 0 régression) - **RG-1.01 vérifiée manuellement** via curl : - Admin → 200 sur `GET /api/categories` et `GET /api/category_types` - Bob (zéro permission) → 403 sur `GET /api/categories`, `POST /api/categories`, `GET /api/category_types` - Anonyme → 401 sur `GET /api/categories` --------- Co-authored-by: Matthieu <mtholot19@gmail.com> Reviewed-on: #19 Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr> Co-committed-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr>
115 lines
3.6 KiB
TypeScript
115 lines
3.6 KiB
TypeScript
/**
|
|
* Definition des 6 personas utilises dans les tests E2E.
|
|
*
|
|
* Source de verite unique partagee entre :
|
|
* - le seed backend (`bin/console app:seed-e2e`)
|
|
* - les tests Playwright (via `loginAs`)
|
|
*
|
|
* Regle : chaque persona cible une case precise de la matrice RBAC.
|
|
* Si tu ajoutes une permission au domaine, tu NE crees pas un nouveau
|
|
* persona par reflexe — tu ajustes un persona existant si possible.
|
|
* L'objectif est de garder ce set petit et comprehensible a 6 mois.
|
|
*
|
|
* IMPORTANT : ces personas sont recrees a chaque `app:seed-e2e`. Ne jamais
|
|
* reutiliser les users dev (admin/alice/bob) dans les tests : ils evoluent
|
|
* au gre des fixtures de demo et casseraient la suite E2E.
|
|
*/
|
|
|
|
export type PersonaKey =
|
|
| 'super-admin'
|
|
| 'user-full'
|
|
| 'user-readonly'
|
|
| 'user-users-only'
|
|
| 'user-audit-only'
|
|
| 'user-nothing'
|
|
|
|
export interface Persona {
|
|
key: PersonaKey
|
|
username: string
|
|
password: string
|
|
isAdmin: boolean
|
|
// Permissions directes attribuees en dur (on bypasse les roles pour
|
|
// garder le seed simple et la correspondance test<->permission directe).
|
|
permissions: string[]
|
|
// Contenu attendu de la sidebar (admin links). Utilise par le test
|
|
// sidebar-visibility pour driver la matrice. Les valeurs correspondent
|
|
// aux slugs de route (`/admin/<slug>`), volontairement stables quand
|
|
// la copie/i18n change.
|
|
expectedAdminLinks: Array<'users' | 'roles' | 'sites' | 'audit-log' | 'categories'>
|
|
}
|
|
|
|
const SHARED_PASSWORD = 'e2e-secret'
|
|
|
|
export const personas: Record<PersonaKey, Persona> = {
|
|
'super-admin': {
|
|
key: 'super-admin',
|
|
username: 'e2e.super-admin',
|
|
password: SHARED_PASSWORD,
|
|
isAdmin: true,
|
|
permissions: [],
|
|
expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'audit-log'],
|
|
},
|
|
'user-full': {
|
|
key: 'user-full',
|
|
username: 'e2e.user-full',
|
|
password: SHARED_PASSWORD,
|
|
isAdmin: false,
|
|
permissions: [
|
|
'core.users.view',
|
|
'core.users.manage',
|
|
'core.roles.view',
|
|
'core.roles.manage',
|
|
'core.audit_log.view',
|
|
'sites.view',
|
|
'sites.manage',
|
|
'sites.bypass_scope',
|
|
'catalog.categories.view',
|
|
'catalog.categories.manage',
|
|
],
|
|
expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'audit-log'],
|
|
},
|
|
'user-readonly': {
|
|
key: 'user-readonly',
|
|
username: 'e2e.user-readonly',
|
|
password: SHARED_PASSWORD,
|
|
isAdmin: false,
|
|
permissions: [
|
|
'core.users.view',
|
|
'core.roles.view',
|
|
'core.audit_log.view',
|
|
'sites.view',
|
|
],
|
|
expectedAdminLinks: ['users', 'roles', 'sites', 'audit-log'],
|
|
},
|
|
'user-users-only': {
|
|
key: 'user-users-only',
|
|
username: 'e2e.user-users-only',
|
|
password: SHARED_PASSWORD,
|
|
isAdmin: false,
|
|
permissions: ['core.users.view', 'core.users.manage'],
|
|
expectedAdminLinks: ['users'],
|
|
},
|
|
'user-audit-only': {
|
|
key: 'user-audit-only',
|
|
username: 'e2e.user-audit-only',
|
|
password: SHARED_PASSWORD,
|
|
isAdmin: false,
|
|
permissions: ['core.audit_log.view'],
|
|
expectedAdminLinks: ['audit-log'],
|
|
},
|
|
'user-nothing': {
|
|
key: 'user-nothing',
|
|
username: 'e2e.user-nothing',
|
|
password: SHARED_PASSWORD,
|
|
isAdmin: false,
|
|
permissions: [],
|
|
expectedAdminLinks: [],
|
|
},
|
|
}
|
|
|
|
export function getPersona(key: PersonaKey): Persona {
|
|
return personas[key]
|
|
}
|
|
|
|
export const ALL_ADMIN_LINKS = ['users', 'roles', 'sites', 'categories', 'audit-log'] as const
|