> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wethehivers.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Modèle Blog

> Articles blog admin, catégories, publication SEO

# Blog

Les **articles de blog** sont rédigés par les admins et publiés sur `wethehivers.com/blog/*`. Outil d'acquisition SEO et d'information (conseils carrière, études sectorielles, actualités).

## Schéma

```mermaid theme={null}
classDiagram
    class Article {
        +Long id
        +Long authorId
        +String slug UK
        +String titre
        +String resume
        +Text contenu
        +String coverImageKey
        +Long categorieId
        +String[] tags
        +String status "DRAFT|PUBLISHED|ARCHIVED"
        +String metaTitle
        +String metaDescription
        +Integer readTimeMinutes
        +Integer vuesCount
        +Instant publishedAt
        +Instant createdAt
        +Instant updatedAt
    }

    class Categorie {
        +Long id
        +String nom
        +String slug
        +String couleur
    }

    class Commentaire {
        +Long id
        +Long articleId
        +Long userId
        +Text contenu
        +String status "PENDING|APPROVED|REJECTED"
        +Instant createdAt
    }

    class Admin {
        +Long id
        +String pseudo
    }

    Admin "1" --> "0..*" Article
    Categorie "1" --> "0..*" Article
    Article "1" --> "0..*" Commentaire
```

## Exemple JSON

```json theme={null}
{
  "id": 14,
  "slug": "reussir-entretien-backend-java-cameroun",
  "titre": "Réussir son entretien Backend Java au Cameroun",
  "resume": "5 conseils d'experts pour briller en entretien backend...",
  "contenu": "# Introduction\n\nLe marché du Java au Cameroun...",
  "coverImageUrl": "https://cdn.wethehivers.com/public/blog/14/cover.jpg",
  "categorie": { "id": 3, "nom": "Carrière", "slug": "carriere" },
  "tags": ["entretien", "java", "backend", "conseils"],
  "status": "PUBLISHED",
  "author": { "id": 1, "pseudo": "équipe THE HIVE" },
  "metaTitle": "Entretien Backend Java Cameroun : 5 conseils — THE HIVE",
  "metaDescription": "Découvrez comment préparer votre entretien backend Java...",
  "readTimeMinutes": 7,
  "vuesCount": 1452,
  "publishedAt": "2026-03-15T10:00:00Z"
}
```

## Cycle de publication

```mermaid theme={null}
stateDiagram-v2
    [*] --> DRAFT: POST /admin/blog
    DRAFT --> PUBLISHED: admin publish
    DRAFT --> DRAFT: update
    PUBLISHED --> DRAFT: unpublish
    PUBLISHED --> ARCHIVED: archive
    ARCHIVED --> PUBLISHED: republish
    ARCHIVED --> [*]
```

## Flow de publication

```mermaid theme={null}
sequenceDiagram
    autonumber
    participant A as Admin
    participant API as Backend
    participant DB as DB
    participant IMG as Image worker
    participant CDN as CDN

    A->>API: POST /admin/blog (DRAFT)
    API->>DB: INSERT article(status=DRAFT)
    A->>API: POST /admin/blog/14/cover (multipart image)
    API->>IMG: Optimize (WebP + resize)
    IMG-->>API: key + dims
    API->>DB: UPDATE coverImageKey
    A->>API: POST /admin/blog/14/publish
    API->>API: Valider SEO (meta + image + contenu > 300 mots)
    API->>DB: UPDATE status=PUBLISHED, publishedAt=NOW
    API->>CDN: Purge /blog/* + /sitemap.xml
    API-->>A: 200
```

## Validation SEO à la publication

```mermaid theme={null}
flowchart TD
    PUB[POST /admin/blog/:id/publish] --> V1{titre 30-70 car}
    V1 -->|non| E1[422]
    V1 -->|oui| V2{metaDescription 50-160 car}
    V2 -->|non| E2[422]
    V2 -->|oui| V3{contenu > 300 mots}
    V3 -->|non| E3[422]
    V3 -->|oui| V4{cover image présente}
    V4 -->|non| E4[422]
    V4 -->|oui| V5{slug unique}
    V5 -->|non| E5[409]
    V5 -->|oui| OK[Publier + sitemap]
```

## Commentaires (modération)

```mermaid theme={null}
flowchart LR
    U[Utilisateur soumet comment] --> P[PENDING]
    P --> MOD{Admin review}
    MOD -->|approve| APR[APPROVED\n visible public]
    MOD -->|reject| REJ[REJECTED\n non visible]
    APR --> SPAM{Signalé > 3?}
    SPAM -->|oui| REV[Retour PENDING]
```

## Endpoints principaux

### Public

| Méthode | Path                                    | Description                      |
| ------- | --------------------------------------- | -------------------------------- |
| `GET`   | `/v1/api/public/blog`                   | Liste articles PUBLISHED paginée |
| `GET`   | `/v1/api/public/blog/{slug}`            | Détail article                   |
| `GET`   | `/v1/api/public/blog/categories`        | Catégories                       |
| `POST`  | `/v1/api/public/blog/{id}/commentaires` | Poster comment                   |

### Admin

| Méthode | Path                                             | Description        |
| ------- | ------------------------------------------------ | ------------------ |
| `GET`   | `/v1/api/admin/blog`                             | Liste tous statuts |
| `POST`  | `/v1/api/admin/blog`                             | Créer DRAFT        |
| `PUT`   | `/v1/api/admin/blog/{id}`                        | Éditer             |
| `POST`  | `/v1/api/admin/blog/{id}/publish`                | Publier            |
| `POST`  | `/v1/api/admin/blog/{id}/unpublish`              | Dépublier          |
| `POST`  | `/v1/api/admin/blog/{id}/cover`                  | Upload cover       |
| `GET`   | `/v1/api/admin/blog/commentaires?status=PENDING` | File modération    |
| `PATCH` | `/v1/api/admin/blog/commentaires/{id}`           | Approuver/rejeter  |

## Sitemap & SEO

Chaque publication/dépublication déclenche un rebuild du sitemap :

```mermaid theme={null}
flowchart LR
    PUB[Publish] --> EVT[publish.event]
    EVT --> SM[Rebuild sitemap.xml]
    EVT --> PURGE[CDN purge /blog/*]
    EVT --> PING[Ping Google Indexing API]
```

## Catégories par défaut

| Catégorie            | Slug                   | Couleur   |
| -------------------- | ---------------------- | --------- |
| Carrière             | `carriere`             | `#264194` |
| Études sectorielles  | `etudes`               | `#4A63B5` |
| Conseils candidat    | `conseils-candidat`    | `#7B8DCB` |
| Ressources recruteur | `ressources-recruteur` | `#F5A623` |
| Actualités THE HIVE  | `actualites`           | `#50B347` |
