{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:ojja:contract:permission-manifest:1.0",
  "title": "Manifeste de permissions d'Ojja",
  "description": "Format ouvert du manifeste de permissions (contrat site et espace, section 3 bis). Produit depuis une seule source, les manifestes de lecture du monorepo ; toute modification du contenu du manifeste produit impose un nouveau numéro de version (manifest_version). Le site affiche la version et la date ; /releve n'affiche que ce qui porte releve, /confiance affiche tout. Les libellés sont ceux du dictionnaire des références, que le site remplace par les siens, référence par référence.",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema_version", "manifest_version", "published_on", "locale", "connectors"],
  "properties": {
    "schema_version": {
      "title": "version du format",
      "description": "Version de ce format.",
      "type": "string",
      "const": "1.0"
    },
    "manifest_version": {
      "title": "version du manifeste",
      "description": "Numéro lisible (1.0, 1.1…), enregistré avec l'empreinte du contenu du manifeste (hors date de publication et hors libellés) et sa date. Toute modification de ce contenu impose un nouveau numéro, que le site affiche avec la date.",
      "type": "string",
      "pattern": "^[0-9]+\\.[0-9]+$"
    },
    "published_on": {
      "title": "date de publication",
      "$ref": "#/$defs/CalendarDate"
    },
    "locale": {
      "title": "langue",
      "description": "Langue des libellés.",
      "type": "string",
      "pattern": "^[a-z]{2}$"
    },
    "connectors": {
      "title": "applications de lecture",
      "type": "array",
      "items": { "$ref": "#/$defs/Connector" }
    }
  },
  "$defs": {
    "CalendarDate": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "Ref": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_.-]*$"
    },
    "RefLabel": {
      "description": "Une référence du dictionnaire et son libellé.",
      "type": "object",
      "additionalProperties": false,
      "required": ["ref", "label"],
      "properties": {
        "ref": { "$ref": "#/$defs/Ref" },
        "label": { "type": "string", "minLength": 1 }
      }
    },
    "RequestedFor": {
      "description": "Pour quoi la permission ou le rôle est demandé : le relevé gratuit, Watch, le portail.",
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": { "enum": ["releve", "watch", "portal"] }
    },
    "Regime": {
      "description": "never_access : nous n'y avons jamais accès. never_touch : nous n'y touchons jamais (lecture seule, liste fermée des points d'accès appelés).",
      "enum": ["never_access", "never_touch"]
    },
    "Permission": {
      "type": "object",
      "additionalProperties": false,
      "required": ["permission", "type", "reads", "why", "requested_for"],
      "properties": {
        "permission": {
          "title": "permission",
          "description": "Nom exact de la permission, tel que l'éditeur l'écrit.",
          "type": "string",
          "minLength": 1
        },
        "type": {
          "title": "type",
          "enum": ["application", "delegated"]
        },
        "reads": {
          "title": "ce qu'elle lit",
          "$ref": "#/$defs/RefLabel"
        },
        "why": {
          "title": "pourquoi",
          "$ref": "#/$defs/RefLabel"
        },
        "requested_for": {
          "title": "demandée pour",
          "$ref": "#/$defs/RequestedFor"
        }
      }
    },
    "DirectoryRole": {
      "type": "object",
      "additionalProperties": false,
      "required": ["role", "requested_for", "optional", "fallback"],
      "properties": {
        "role": {
          "title": "rôle d'annuaire",
          "description": "Nom exact du rôle, tel que l'éditeur l'écrit.",
          "type": "string",
          "minLength": 1
        },
        "requested_for": {
          "title": "demandé pour",
          "$ref": "#/$defs/RequestedFor"
        },
        "optional": {
          "title": "facultatif",
          "type": "boolean"
        },
        "fallback": {
          "title": "sans ce rôle",
          "$ref": "#/$defs/RefLabel"
        }
      }
    },
    "Endpoint": {
      "description": "Un point d'accès de la liste fermée : sa méthode et son adresse, sans paramètre. GET, sauf une exception : la requête de lecture de l'inventaire Power Platform (POST, sur cette seule adresse), qui lit la configuration des agents sous le rôle d'annuaire Lecteur IA et n'écrit rien.",
      "type": "object",
      "additionalProperties": false,
      "required": ["method", "url"],
      "properties": {
        "method": { "enum": ["GET", "POST"] },
        "url": { "type": "string", "pattern": "^https://[^\\s?#]+$" }
      },
      "if": {
        "properties": { "method": { "const": "POST" } }
      },
      "then": {
        "properties": {
          "url": { "const": "https://api.powerplatform.com/resourcequery/resources/query" }
        }
      }
    },
    "Connector": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "connector_id",
        "app_name",
        "publisher_verified",
        "regime",
        "permissions",
        "directory_roles"
      ],
      "properties": {
        "connector_id": {
          "title": "application de lecture",
          "type": "string",
          "pattern": "^[a-z][a-z0-9-]{0,31}$"
        },
        "app_name": {
          "title": "application",
          "description": "Nom de l'application de lecture d'Ojja chez l'éditeur (« Ojja Reader »).",
          "type": "string",
          "minLength": 1
        },
        "publisher_verified": {
          "title": "éditeur vérifié",
          "description": "L'éditeur de l'application de lecture est vérifié chez l'éditeur de la source.",
          "type": "boolean"
        },
        "regime": {
          "title": "régime",
          "$ref": "#/$defs/Regime"
        },
        "permissions": {
          "title": "permissions",
          "type": "array",
          "items": { "$ref": "#/$defs/Permission" }
        },
        "directory_roles": {
          "title": "rôles d'annuaire",
          "type": "array",
          "items": { "$ref": "#/$defs/DirectoryRole" }
        },
        "endpoints": {
          "title": "points d'accès appelés",
          "description": "La liste fermée des points d'accès appelés, en régime never_touch seulement.",
          "type": "array",
          "minItems": 1,
          "items": { "$ref": "#/$defs/Endpoint" }
        }
      },
      "if": {
        "properties": { "regime": { "const": "never_touch" } }
      },
      "then": { "properties": { "endpoints": true }, "required": ["endpoints"] },
      "else": { "not": { "properties": { "endpoints": true }, "required": ["endpoints"] } }
    }
  }
}
