#%RAML 1.0

title: API-Vitam Version Alpha - Espace de travail interne
version: v1
baseUri: http://workspace.internal.vitam.gouv.fr/{version}
protocols: [ HTTP ]

uses:
  StandardTypes: libraries/StandardTypes.raml
  StandardTraits: libraries/StandardTraits.raml
  AccessTypes: libraries/AccessTypes.raml
  AccessTraits: libraries/AccessTraits.raml
  DslTypes: libraries/DslTypes.raml
  CollectionTraits: libraries/CollectionTraits.raml
  StorageTypes: libraries/StorageTypes.raml
  StorageTraits: libraries/StorageTraits.raml
  StorageResourceTraits: libraries/StorageResourceTypes.raml

securitySchemes:
  VitamPlatform: !include securitySchemes/SecuritySchemeVitamInternal.raml

securedBy: [ VitamPlatform ]

mediaType: application/json

types:
  _reserved:
    type: string


documentation:
  - title: Avertissements
    content: !include docs-fr/avertissement.md

  - title: Licence
    content: !include docs-fr/license.md

  - title: Containers
    content: |
      Le principe proposé serait le suivant:
        - Le Container indique une Opération (id de l'opération):
          - POST /containers
        - Les clients sont responsables d'assurer la logique des Folders et des Objects c'est à dire l'arborescence
        - Même si c'est autorisé, il est à réfléchir si la céation d'Objets sous un container est une bonne praitque

      Questions ou remarques:
        - Le /status pourrait être étendu pour avoir des informations statistiques.

/containers:
  displayName: Containers
  description: Administration des Containers (Dossiers de plus haut niveau)
  get:
    is: [CollectionTraits.collection-get]
  post:
    is: [CollectionTraits.collection-get, StandardTraits.OverrideGet]

  /{cid}:
    displayName: Single Container API
    description: API de gestion d'un Container (Dossier).
    get:
      description: Permet d'accéder aux informations d'un container
      is: [CollectionTraits.collection-get]
    post:
      description: Permet de créer un nouveau container
      is: [CollectionTraits.collection-post]
      body:
        application/json:
          type: StorageTypes.ContainerInfo
          example: !include libraries/samples/containerInfo.sample
      responses:
        201:
          body:
            application/json:
              type: StorageTypes.ContainerInfo
              example: !include libraries/samples/containerInfo.sample
    head:
      description: Permet de tester l'existence du Container
      is: [CollectionTraits.collection-head]
    delete:
      description: Permet d'effacer un Container (selon l'argument peut être récursif)
      is: [CollectionTraits.collection-delete]
      headers:
        X-Recursive:
          description: Si Vrai la destruction est récursive, sinon si non vide retourne une erreur
          type: boolean
    put:
      description: Permet d'uploader un ZIP ou TAR avec un unzip/untar automatique à la racine du container, incluant la création de sous-folders
      body:
        application/zip:
        application/x-tar:
      responses:
        201:
          description: L'archive - au sens informatique - est décompressée
          body:
            application/json:
              type: object
              example: !include libraries/samples/collectionList.sample

    /count:
      displayName: Count operation
      description: Pour compter le nombre d'objets d'un container (hors dossiers)
      get:
        description: Nombre d'objets binaires pour le container.
        is: [ StandardTraits.StandardOptionalHeader,StandardTraits.StandardHeader200, StandardTraits.StandardHeader404, StandardTraits.StandardHeader412, StandardTraits.StandardHeader400]
        responses:
          200:
            body:
              application/json:
                type: object
                example: !include libraries/samples/count.sample


    /folders:
      displayName: Folders operations
      description: Pour gérer la création de sous-dossiers
      get:
        description: Liste du contenu binaire pour ce container.
        is: [CollectionTraits.collection-get]
      post:
        is: [CollectionTraits.collection-get, StandardTraits.OverrideGet]

      /{idf}:
        displayName: Folder operations
        type: StorageResourceTraits.StoreWmrmItem
        get:
          headers:
            Accept:
              description: Seul application/json est autorisé
              type: string
              enum: [ "application/json" ]
        delete:
          headers:
            X-Recursive:
              description: Si Vrai la destruction est récursive, sinon si non vide retourne une erreur
              type: boolean
        put:
          description: Permet d'uploader un ZIP ou TAR avec un unzip/untar automatique sous ce folder, incluant la création de sous-folders
          body:
            application/zip:
            application/x-tar:
          responses:
            201:
              description: L'archive - au sens informatique - est décompressée

    /objects:
      # root endpoint request
      displayName: Objects operations
      description: Pour gérer la création de nouveaux Objects
      get:
        description: Liste du contenu binaire pour ce container.
        is: [CollectionTraits.collection-get]
      post:
        is: [CollectionTraits.collection-get, StandardTraits.OverrideGet]

      /{id_object}:
        displayName: Object operations
        type: StorageResourceTraits.StoreWmrmItem
        post:
          description: Permet de créer une nouveau Object.
          body:
            binary/octet-stream:

/status:
  get:
    is: [ StandardTraits.Status, StandardTraits.StandardHeader200,
      StandardTraits.StandardHeader401, StandardTraits.StandardHeader404, StandardTraits.StandardHeader503 ]
