# elmasghatimohamed-cmd/afffiliatelink architecture

> Architecture diagram of the GitHub repository elmasghatimohamed-cmd/afffiliatelink, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/elmasghatimohamed-cmd/afffiliatelink
- Repository: https://github.com/elmasghatimohamed-cmd/afffiliatelink

## Overview

AffiliateLink is a Spring REST API for affiliate marketing. Its main workflow is profile registration and administration, advertiser offer creation and discovery, then campaign creation and lifecycle management. The Profile and Offer modules are documented as communicating through public APIs and a profile-suspension event; campaign creation also checks advertiser activity through ProfileApi. Service implementations form the internal business layer between controllers and persistence. The README documents publisher notifications, but the sampled sources do not establish their trigger or delivery path.

Main entry points: [`src/main/java/ma/affilatelink/profil/services/implementation`](https://github.com/elmasghatimohamed-cmd/afffiliatelink/tree/main/src/main/java/ma/affilatelink/profil/services/implementation) (Profile services), [`src/main/java/ma/affilatelink/offer/services/implementation/CampaignServiceImpl.java`](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/services/implementation/CampaignServiceImpl.java) (Campaign services), [`src/main/java/ma/affilatelink/offer/services/implementation/OfferServiceImpl.java`](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/services/implementation/OfferServiceImpl.java) (Offer services), [`src/main/java/ma/affilatelink/profil/api/ProfileApi.java`](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/api/ProfileApi.java) (Profile module API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_profiles["Profile management"]
  node_publisher_api["Publisher endpoints"]
  node_advertiser_api["Advertiser endpoints"]
  node_admin_api["Admin endpoints"]
  node_profile_services["Profile services"]
  node_profile_store[("Profile repositories")]
  node_suspension_event["Suspension event"]
  node_profile_api["Profile module API<br/>[ProfileApi.java]"]
end

subgraph group_offers["Offer management"]
  node_offer_api["Offer endpoints"]
  node_offer_services["Offer services"]
  node_offer_store[("Offer repositories")]
  node_offer_data["Offers and tags<br/>[Offer.java]"]
end

subgraph group_campaigns["Campaign management"]
  node_campaign_api["Campaign endpoints"]
  node_campaign_services["Campaign services"]
  node_campaign_store[("Campaign repository")]
  node_campaign_data["Campaign records<br/>[Campaign.java]"]
  node_suspension_listener["Suspension listener"]
  node_notifications["Publisher notifications"]
end

subgraph group_shared["Shared API handling"]
  node_shared_errors["API error handling"]
end

node_user(("API clients"))
node_app["Spring application"]

node_user -->|"registers or reads"| node_publisher_api
node_user -->|"registers or reads"| node_advertiser_api
node_user -->|"changes status"| node_admin_api
node_user -->|"creates or searches"| node_offer_api
node_user -->|"manages campaigns"| node_campaign_api
node_publisher_api -->|"delegates to"| node_profile_services
node_advertiser_api -->|"delegates to"| node_profile_services
node_admin_api -->|"delegates to"| node_profile_services
node_profile_services -->|"persists profiles"| node_profile_store
node_profile_services -.->|"publishes"| node_suspension_event
node_offer_api -->|"delegates to"| node_offer_services
node_offer_services -->|"queries and saves"| node_offer_store
node_offer_services -->|"checks advertiser"| node_profile_api
node_campaign_api -->|"delegates to"| node_campaign_services
node_campaign_services -->|"queries and saves"| node_campaign_store
node_campaign_services -->|"loads offer"| node_offer_store
node_campaign_services -->|"checks advertiser"| node_profile_api
node_profile_api -.->|"checks profile status"| node_profile_services
node_suspension_event -.->|"dispatches event"| node_suspension_listener
node_suspension_listener -.->|"suspends campaigns"| node_campaign_services
node_offer_services -.->|"triggers notifications"| node_notifications
node_shared_errors -->|"returns API errors"| node_user

click node_app "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/AffiliateLinkApplication.java"
click node_publisher_api "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/controllers/PublisherController.java"
click node_advertiser_api "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/controllers/AdvertiserController.java"
click node_admin_api "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/controllers/AdminController.java"
click node_profile_services "https://github.com/elmasghatimohamed-cmd/afffiliatelink/tree/main/src/main/java/ma/affilatelink/profil/services/implementation"
click node_profile_store "https://github.com/elmasghatimohamed-cmd/afffiliatelink/tree/main/src/main/java/ma/affilatelink/profil/repositories"
click node_suspension_event "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/events/ProfileSuspended.java"
click node_offer_api "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/controllers/OfferController.java"
click node_offer_services "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/services/implementation/OfferServiceImpl.java"
click node_offer_store "https://github.com/elmasghatimohamed-cmd/afffiliatelink/tree/main/src/main/java/ma/affilatelink/offer/repositories"
click node_offer_data "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/entities/Offer.java"
click node_campaign_api "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/controllers/CampaignController.java"
click node_campaign_services "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/services/implementation/CampaignServiceImpl.java"
click node_campaign_store "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/repositories/CampaignRepository.java"
click node_campaign_data "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/entities/Campaign.java"
click node_suspension_listener "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/listeners/ProfileSuspendedListener.java"
click node_profile_api "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/api/ProfileApi.java"
click node_notifications "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/services/implementation/PublisherNotificationServiceImpl.java"
click node_shared_errors "https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/common/exceptions/GlobalExceptionHandler.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_publisher_api,node_advertiser_api,node_admin_api,node_profile_services,node_profile_store,node_suspension_event,node_profile_api,node_user toneBlue
class node_offer_api,node_offer_services,node_offer_store,node_offer_data toneAmber
class node_campaign_api,node_campaign_services,node_campaign_store,node_campaign_data,node_suspension_listener,node_notifications toneMint
class node_shared_errors toneRose
class node_app toneTeal
```

## Components

### Profile management

- [Publisher endpoints](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/controllers/PublisherController.java): `src/main/java/ma/affilatelink/profil/controllers/PublisherController.java`
- [Advertiser endpoints](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/controllers/AdvertiserController.java): `src/main/java/ma/affilatelink/profil/controllers/AdvertiserController.java`
- [Admin endpoints](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/controllers/AdminController.java): `src/main/java/ma/affilatelink/profil/controllers/AdminController.java`
- [Profile services](https://github.com/elmasghatimohamed-cmd/afffiliatelink/tree/main/src/main/java/ma/affilatelink/profil/services/implementation): `src/main/java/ma/affilatelink/profil/services/implementation`
- [Profile repositories](https://github.com/elmasghatimohamed-cmd/afffiliatelink/tree/main/src/main/java/ma/affilatelink/profil/repositories): `src/main/java/ma/affilatelink/profil/repositories`
- [Suspension event](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/events/ProfileSuspended.java): `src/main/java/ma/affilatelink/profil/events/ProfileSuspended.java`
- [Profile module API](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/profil/api/ProfileApi.java): `src/main/java/ma/affilatelink/profil/api/ProfileApi.java`

### Offer management

- [Offer endpoints](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/controllers/OfferController.java): `src/main/java/ma/affilatelink/offer/controllers/OfferController.java`
- [Offer services](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/services/implementation/OfferServiceImpl.java): `src/main/java/ma/affilatelink/offer/services/implementation/OfferServiceImpl.java`
- [Offer repositories](https://github.com/elmasghatimohamed-cmd/afffiliatelink/tree/main/src/main/java/ma/affilatelink/offer/repositories): `src/main/java/ma/affilatelink/offer/repositories`
- [Offers and tags](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/entities/Offer.java): `src/main/java/ma/affilatelink/offer/entities/Offer.java`

### Campaign management

- [Campaign endpoints](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/controllers/CampaignController.java): `src/main/java/ma/affilatelink/offer/controllers/CampaignController.java`
- [Campaign services](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/services/implementation/CampaignServiceImpl.java): `src/main/java/ma/affilatelink/offer/services/implementation/CampaignServiceImpl.java`
- [Campaign repository](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/repositories/CampaignRepository.java): `src/main/java/ma/affilatelink/offer/repositories/CampaignRepository.java`
- [Campaign records](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/entities/Campaign.java): `src/main/java/ma/affilatelink/offer/entities/Campaign.java`
- [Suspension listener](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/listeners/ProfileSuspendedListener.java): `src/main/java/ma/affilatelink/offer/listeners/ProfileSuspendedListener.java`
- [Publisher notifications](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/offer/services/implementation/PublisherNotificationServiceImpl.java): `src/main/java/ma/affilatelink/offer/services/implementation/PublisherNotificationServiceImpl.java`

### Shared API handling

- [API error handling](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/common/exceptions/GlobalExceptionHandler.java): `src/main/java/ma/affilatelink/common/exceptions/GlobalExceptionHandler.java`

### Other components

- **API clients**
- [Spring application](https://github.com/elmasghatimohamed-cmd/afffiliatelink/blob/main/src/main/java/ma/affilatelink/AffiliateLinkApplication.java): `src/main/java/ma/affilatelink/AffiliateLinkApplication.java`

## Connections

- API clients → Publisher endpoints: registers or reads (evidence: `README.md`)
- API clients → Advertiser endpoints: registers or reads (evidence: `README.md`)
- API clients → Admin endpoints: changes status (evidence: `README.md`)
- API clients → Offer endpoints: creates or searches (evidence: `README.md`)
- API clients → Campaign endpoints: manages campaigns (evidence: `README.md`)
- Publisher endpoints → Profile services: delegates to (evidence: `src/main/java/ma/affilatelink/profil/controllers/PublisherController.java`)
- Advertiser endpoints → Profile services: delegates to (evidence: `src/main/java/ma/affilatelink/profil/controllers/AdvertiserController.java`)
- Admin endpoints → Profile services: delegates to (evidence: `src/main/java/ma/affilatelink/profil/controllers/AdminController.java`)
- Profile services → Profile repositories: persists profiles (evidence: `src/main/java/ma/affilatelink/profil/services/implementation/AdvertiserServiceImpl.java`)
- Profile services → Suspension event: publishes (evidence: `README.md`)
- Offer endpoints → Offer services: delegates to (evidence: `src/main/java/ma/affilatelink/offer/controllers/OfferController.java`)
- Offer services → Offer repositories: queries and saves (evidence: `src/main/java/ma/affilatelink/offer/services/implementation/OfferServiceImpl.java`)
- Offer services → Profile module API: checks advertiser (evidence: `src/main/java/ma/affilatelink/offer/services/implementation/OfferServiceImpl.java`)
- Campaign endpoints → Campaign services: delegates to (evidence: `src/main/java/ma/affilatelink/offer/controllers/CampaignController.java`)
- Campaign services → Campaign repository: queries and saves (evidence: `src/main/java/ma/affilatelink/offer/services/implementation/CampaignServiceImpl.java`)
- Campaign services → Offer repositories: loads offer (evidence: `src/main/java/ma/affilatelink/offer/services/implementation/CampaignServiceImpl.java`)
- Campaign services → Profile module API: checks advertiser (evidence: `src/main/java/ma/affilatelink/offer/services/implementation/CampaignServiceImpl.java`)
- Profile module API → Profile services: checks profile status
- Suspension event → Suspension listener: dispatches event (evidence: `README.md`)
- Suspension listener → Campaign services: suspends campaigns (evidence: `README.md`)
- Offer services → Publisher notifications: triggers notifications
- API error handling → API clients: returns API errors (evidence: `src/main/java/ma/affilatelink/common/exceptions/GlobalExceptionHandler.java`)
