# Publication sociale Serenity

## Responsabilités

Serenity fournit l’interface client : connexion des comptes, choix des canaux,
composition, planification et suivi. Le hub CPCREATION reste la source de vérité
et porte toute la logique fournisseur :

```text
Utilisateur Serenity
    → VitiCore SocialPublishingHub
    → jeton d’instance social de 5 minutes
    → hub CPCREATION
    → adapter Meta, puis LinkedIn ou TikTok
```

VitiCore ne stocke aucun secret Meta, aucun jeton de Page et aucune entité
propre à Facebook ou Instagram. Il consomme des objets neutres `Channel`,
`Publication` et `PublicationTarget`. Le tableau `capabilities` décrit ce que
chaque canal accepte : types de contenu, taille maximale du texte, nombre de
médias, planification et nécessité d’une URL publique.

## Prérequis

L’installation Serenity doit être appairée au hub depuis la configuration
Commerce. Le snapshot `CatalogConfigurationSnapshot` fournit l’URL du hub,
l’UUID technique et le jeton d’enrôlement chiffré.

Le module utilise ensuite deux niveaux d’autorisation :

1. le jeton d’enrôlement longue durée est envoyé uniquement au point d’échange
   serveur-à-serveur du hub ;
2. le hub retourne un JWT RS256 valable cinq minutes et limité à
   `social:read` ou `social:write`.

Le transport HTTP non tracé `http_client.transport` évite de conserver ces
en-têtes dans le profiler Symfony.

## Parcours administrateur

La route historique `/social-network` devient le centre de publication :

- connexion Meta par OAuth centralisé ;
- liste des Pages Facebook et comptes Instagram professionnels ;
- déconnexion protégée par CSRF ;
- composition d’un texte et/ou d’une image HTTPS ;
- sélection de plusieurs canaux ;
- date de publication et suivi de chaque destination ;
- annulation tant que le traitement n’a pas commencé.

Les rôles `ROLE_ADMIN` et `ROLE_SOCIAL` restent admis. L’ancienne route
`admin_social_instagram_login` redirige vers le nouveau parcours afin de ne pas
casser les liens existants.

## Ajouter un fournisseur

L’interface VitiCore ne doit pas changer. Le travail s’effectue dans le hub :

1. ajouter un adapter d’autorisation pour le fournisseur ;
2. implémenter `SocialPublicationAdapter` ;
3. convertir les comptes distants en canaux et capacités neutres ;
4. mapper les erreurs distantes vers les statuts de cible ;
5. ajouter les permissions et pages légales propres au fournisseur ;
6. tester le cycle connexion, publication, révocation et suppression.

LinkedIn et TikTok peuvent ainsi rejoindre le système sans ajouter de secret
dans chaque site client.

## Publicité

La publicité ne doit pas être modélisée comme une simple publication. Une
extension dédiée devra gérer les comptes publicitaires, moyens de paiement,
budgets, campagnes, ensembles, audiences, créations, validations et rapports.
Elle pourra réutiliser l’identité de canal et l’échange de jetons courts, mais
exposera des capacités et des permissions séparées. Cela permet de soumettre les
permissions Marketing API à Meta seulement lorsque le parcours publicitaire est
réellement testable dans Serenity.
