# /notification - Integration Notifications SmartStack

> **Synergie Skill/Commande:**
> - **Skill** (`templates/skills/notification/`) → Invocation automatique par Claude
> - **Commande** (`/notification`) → Invocation manuelle par l'utilisateur

---

## ARGUMENTS

```
/notification <action> [options]
```

| Action | Description |
|--------|-------------|
| `add` | Ajouter une notification dans un service existant |
| `type` | Creer un nouveau type de notification |
| `hook` | Creer le hook frontend avec SignalR |

---

## WORKFLOW

### /notification add

Ajoute l'envoi de notification dans un service existant.

**Questions:**
1. Quel service modifier ? (liste des services)
2. Quelle methode ? (Create, Update, Delete, etc.)
3. Qui notifier ? (createur, assigne, role, liste)
4. Quel type de notification ? (existant ou nouveau)

**Actions:**
1. Injecter `INotificationService` si pas present
2. Ajouter l'appel `SendNotificationAsync` dans la methode
3. Logger l'envoi de notification

### /notification type

Cree un nouveau type de notification.

**Questions:**
1. Nom du type ? (ex: `ProductCreated`)
2. Categorie ? (Support, Admin, System, SLA)
3. Description ?

**Actions:**
1. Ajouter dans `NotificationType.cs`
2. Creer migration EF Core

### /notification hook

Cree le hook frontend pour recevoir les notifications en temps reel.

**Questions:**
1. Quel module ?
2. Quel type d'entite ?

**Actions:**
1. Creer `use{Module}Notifications.ts`
2. Integrer `useSignalR`
3. Configurer les callbacks

---

## TEMPLATES

### Template SendNotification

```csharp
await _notificationService.SendNotificationAsync(
    userId: $USER_ID,
    type: NotificationType.$TYPE,
    title: "$TITLE",
    message: $"$MESSAGE",
    relatedEntityType: "$ENTITY_TYPE",
    relatedEntityId: $ENTITY_ID,
    actionUrl: $"/$MODULE/$ENTITY_ID",
    cancellationToken: ct);

_logger.LogInformation(
    "Notification sent to {UserId}: {Type}",
    $USER_ID, NotificationType.$TYPE);
```

### Template Hook

```typescript
// hooks/use{Module}Notifications.ts
import { useSignalR } from '@/hooks/useSignalR';
import { useQueryClient } from '@tanstack/react-query';
import { toast } from 'sonner';

export function use{Module}Notifications() {
  const queryClient = useQueryClient();

  useSignalR({
    onNotification: (notification) => {
      if (notification.relatedEntityType === '{Entity}') {
        queryClient.invalidateQueries(['{module}']);
        toast.info(notification.title, {
          description: notification.message,
          action: notification.actionUrl ? {
            label: 'Voir',
            onClick: () => window.location.href = notification.actionUrl,
          } : undefined,
        });
      }
    },
  });
}
```

---

## FICHIERS CLES

| Fichier | Role |
|---------|------|
| `Domain/Support/Enums/NotificationType.cs` | Types de notification |
| `Application/Common/Interfaces/INotificationService.cs` | Interface |
| `Infrastructure/Services/Support/NotificationService.cs` | Implementation |
| `web/src/hooks/useSignalR.ts` | Hook SignalR |

---

User: $ARGUMENTS
