Table of Contents

Namespace SESARWebHook.Core

Classes

WebhookHandlerBase

Classe de base pour les webhook handlers. Fournit des helpers pour accéder aux données du manifest et à la configuration.

UTILISATION :

  1. Héritez de cette classe
  2. Implémentez HandlerId, DisplayName, et ProcessAsync
  3. Utilisez les helpers d'auth dans Core.Auth

EXEMPLE COMPLET :

using SESARWebHook.Core;
using SESARWebHook.Core.Auth;
using SESARWebHook.Core.Models;

public class MyDynamicsHandler : WebhookHandlerBase
{
    private OAuth2ClientCredentialsHelper _auth;

    public override string HandlerId => "my-dynamics";
    public override string DisplayName => "My Dynamics 365 Handler";

    public override void Initialize(Dictionary<string, string> settings)
    {
        base.Initialize(settings);

        // Créer le helper d'auth avec vos paramètres
        _auth = OAuth2ClientCredentialsHelper.ForDynamics365(
            tenantId: GetRequiredSetting("TenantId"),
            clientId: GetRequiredSetting("ClientId"),
            clientSecret: GetRequiredSetting("ClientSecret"),
            dynamicsUrl: GetRequiredSetting("DynamicsUrl")
        );
    }

    public override async Task<IntegrationResult> ProcessAsync(
        StoreManifest manifest,
        WebhookContext context)
    {
        // Extraire les données avec les helpers
        var email = GetSenderEmail(manifest);
        var subject = GetSubject(manifest);

        // Obtenir un token (auto-refresh géré par le helper)
        var token = await _auth.GetAccessTokenAsync();

        // Faire votre appel API
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Bearer", token);

            var payload = new {
                emailaddress1 = email,
                subject = subject,
                description = $"From SESAR: {context.RequestId}"
            };

            var response = await client.PostAsync(
                $"{GetRequiredSetting("DynamicsUrl")}/api/data/v9.2/contacts",
                new StringContent(
                    JsonConvert.SerializeObject(payload),
                    Encoding.UTF8,
                    "application/json"));

            if (response.IsSuccessStatusCode)
            {
                return IntegrationResult.Ok("Contact created", HandlerId);
            }
            else
            {
                var error = await response.Content.ReadAsStringAsync();
                return IntegrationResult.Fail("API error", error, HandlerId);
            }
        }
    }
}