{
  "startNodeId": "saisie",
  "steps": {
    "saisie": {
      "type": "PageNode",
      "nodes": [
        {
          "type": "UsernameCollectorNode",
          "layout": {
            "name": "Identifiant"
          }
        },
        {
          "type": "PasswordCollectorNode",
          "layout": {
            "name": "Mot de passe"
          }
        }
      ],
      "outcomes": {
        "outcome": "annuaire"
      },
      "layout": {
        "x": 40,
        "y": 220,
        "name": "Identifiant et mot de passe"
      },
      "stage": "PageNode"
    },
    "annuaire": {
      "type": "DataStoreNode",
      "config": {
        "authLevel": 0
      },
      "outcomes": {
        "true": "envoi",
        "false": "echec"
      },
      "layout": {
        "x": 360,
        "y": 230,
        "name": "Vérification du mot de passe"
      },
      "stage": "DataStoreNode"
    },
    "envoi": {
      "type": "EmailOtpSendNode",
      "config": {
        "otpLength": 6,
        "ttlSeconds": 300,
        "emailAttribute": "mail",
        "emailSubject": "Votre code de connexion TOSIAM",
        "emailBodyTemplate": "Bonjour,\n\nVotre code de connexion est : {otp}\n\nIl expire dans {ttl} secondes. Si vous n'êtes pas à l'origine de cette demande, ignorez ce message."
      },
      "outcomes": {
        "sent": "code",
        "error": "echec"
      },
      "layout": {
        "x": 680,
        "y": 60,
        "name": "Envoi du code par e-mail"
      },
      "stage": "EmailOtpSendNode"
    },
    "code": {
      "type": "EmailOtpVerifyNode",
      "config": {
        "maxAttempts": 3
      },
      "outcomes": {
        "true": "succes",
        "false": "code",
        "exceeded": "echec",
        "expired": "envoi"
      },
      "layout": {
        "x": 1000,
        "y": 330,
        "name": "Code reçu par e-mail"
      },
      "stage": "EmailOtpVerifyNode"
    },
    "succes": {
      "type": "SuccessNode",
      "layout": {
        "x": 1360,
        "y": 60,
        "name": "Succès"
      },
      "stage": "SuccessNode"
    },
    "echec": {
      "type": "FailureNode",
      "layout": {
        "x": 1360,
        "y": 520,
        "name": "Échec"
      },
      "stage": "FailureNode"
    }
  }
}
