feat(browse): gestion CRUD des dossiers depuis la page Browse

- Ajout boutons Modifier/Supprimer sur chaque tuile de dossier
- Supprimer visible uniquement si dossier vide (0 APIs, 0 sous-dossiers)
- Modale Angular (sans fr-modal DSFR) pour créer/éditer un dossier
- Backend: remove() lève BadRequestException si dossier non vide
- Ajout fichiers YAML de démo (OpenAPI Petstore, AsyncAPI User Events)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
This commit is contained in:
z3n
2026-05-22 13:59:16 +00:00
parent 921a6e652b
commit 93fadb43f9
4 changed files with 376 additions and 31 deletions

View File

@@ -0,0 +1,101 @@
asyncapi: "3.0.0"
info:
title: User Events API
version: "1.0.0"
description: API événementielle pour les actions utilisateurs
channels:
userSignedUp:
address: user.signed.up
messages:
userSignedUp:
$ref: "#/components/messages/UserSignedUp"
userLoggedIn:
address: user.logged.in
messages:
userLoggedIn:
$ref: "#/components/messages/UserLoggedIn"
orderPlaced:
address: order.placed
messages:
orderPlaced:
$ref: "#/components/messages/OrderPlaced"
operations:
onUserSignedUp:
action: receive
channel:
$ref: "#/channels/userSignedUp"
onUserLoggedIn:
action: receive
channel:
$ref: "#/channels/userLoggedIn"
onOrderPlaced:
action: receive
channel:
$ref: "#/channels/orderPlaced"
components:
messages:
UserSignedUp:
name: UserSignedUp
title: Utilisateur inscrit
summary: Émis lorsqu'un utilisateur crée un compte
payload:
type: object
required:
- userId
- email
- createdAt
properties:
userId:
type: string
format: uuid
email:
type: string
format: email
createdAt:
type: string
format: date-time
UserLoggedIn:
name: UserLoggedIn
title: Utilisateur connecté
summary: Émis lorsqu'un utilisateur se connecte
payload:
type: object
required:
- userId
- loginAt
properties:
userId:
type: string
format: uuid
loginAt:
type: string
format: date-time
OrderPlaced:
name: OrderPlaced
title: Commande passée
summary: Émis lorsqu'une commande est créée
payload:
type: object
required:
- orderId
- userId
- total
properties:
orderId:
type: string
format: uuid
userId:
type: string
format: uuid
total:
type: number
format: float
items:
type: array
items:
type: object
properties:
productId:
type: string
quantity:
type: integer

View File

@@ -0,0 +1,96 @@
openapi: "3.0.0"
info:
title: Petstore API
version: "1.0.0"
description: API de gestion d'une animalerie
paths:
/pets:
get:
summary: Liste des animaux
operationId: listPets
parameters:
- name: limit
in: query
required: false
schema:
type: integer
maximum: 100
responses:
"200":
description: Liste des animaux
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/Pet"
post:
summary: Créer un animal
operationId: createPet
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/NewPet"
responses:
"201":
description: Animal créé
content:
application/json:
schema:
$ref: "#/components/schemas/Pet"
/pets/{id}:
get:
summary: Récupérer un animal par ID
operationId: getPet
parameters:
- name: id
in: path
required: true
schema:
type: integer
responses:
"200":
description: Animal trouvé
content:
application/json:
schema:
$ref: "#/components/schemas/Pet"
"404":
description: Animal non trouvé
delete:
summary: Supprimer un animal
operationId: deletePet
parameters:
- name: id
in: path
required: true
schema:
type: integer
responses:
"204":
description: Animal supprimé
components:
schemas:
Pet:
type: object
required:
- id
- name
properties:
id:
type: integer
name:
type: string
tag:
type: string
NewPet:
type: object
required:
- name
properties:
name:
type: string
tag:
type: string