openapi: 3.0.1
info:
  title: NCMP to CPS Proxy API
  description: NCMP to CPS Proxy API
  version: "1.0"
servers:
- url: /ncmp
paths:
  /v1/ch/{cm-handle}/data/ds/ncmp-datastore:passthrough-operational:
    get:
      tags:
      - network-cm-proxy
      summary: Get resource data from pass-through operational for cm handle
      description: Get resource data from pass-through operational for given cm handle
      operationId: getResourceDataOperationalForCmHandle
      parameters:
      - name: cm-handle
        in: path
        description: "The identifier for a network function, network element, subnetwork\
          \ or any other cm object by managed Network CM Proxy"
        required: true
        schema:
          type: string
          example: my-cm-handle
      - name: resourceIdentifier
        in: query
        description: The format of resource identifier depend on the associated DMI
          Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but
          it can really be anything.
        required: true
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              resourceIdentifier: \shops\bookstore
          sample 2:
            value:
              resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]"
          sample 3:
            value:
              resourceIdentifier: "parent=shops,child=bookstore"
      - name: Accept
        in: header
        description: "Accept parameter for response, if accept parameter is null,\
          \ that means client can accept any format."
        required: false
        schema:
          type: string
          enum:
          - application/json
          - application/yang-data+json
      - name: options
        in: query
        description: "options parameter in query, it is mandatory to wrap key(s)=value(s)\
          \ in parenthesis'()'. The format of options parameter depend on the associated\
          \ DMI Plugin implementation."
        required: false
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              options: (depth=3)
          sample 2:
            value:
              options: (fields=book)
          sample 3:
            value:
              options: "(depth=2,fields=book/authors)"
      - name: topic
        in: query
        description: topic parameter in query.
        required: false
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              topic: my-topic-name
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: object
              examples:
                dataSampleResponse:
                  $ref: '#/components/examples/dataSampleResponse'
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
        "502":
          description: Bad Gateway
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DmiErrorMessage'
              example:
                message: "Bad Gateway Error Message NCMP"
                dmi-response:
                  http-code: 400
                  body: Bad Request

  /v1/ch/{cm-handle}/data/ds/ncmp-datastore:passthrough-running:
    get:
      tags:
      - network-cm-proxy
      summary: Get resource data from pass-through running for cm handle
      description: Get resource data from pass-through running for given cm handle
      operationId: getResourceDataRunningForCmHandle
      parameters:
      - name: cm-handle
        in: path
        description: "The identifier for a network function, network element, subnetwork\
          \ or any other cm object by managed Network CM Proxy"
        required: true
        schema:
          type: string
          example: my-cm-handle
      - name: resourceIdentifier
        in: query
        description: The format of resource identifier depend on the associated DMI
          Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but
          it can really be anything.
        required: true
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              resourceIdentifier: \shops\bookstore
          sample 2:
            value:
              resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]"
          sample 3:
            value:
              resourceIdentifier: "parent=shops,child=bookstore"
      - name: Accept
        in: header
        description: "Accept parameter for response, if accept parameter is null,\
          \ that means client can accept any format."
        required: false
        schema:
          type: string
          enum:
          - application/json
          - application/yang-data+json
      - name: options
        in: query
        description: "options parameter in query, it is mandatory to wrap key(s)=value(s)\
          \ in parenthesis'()'. The format of options parameter depend on the associated\
          \ DMI Plugin implementation."
        required: false
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              options: (depth=3)
          sample 2:
            value:
              options: (fields=book)
          sample 3:
            value:
              options: "(depth=2,fields=book/authors)"
      - name: topic
        in: query
        description: topic parameter in query.
        required: false
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              topic: my-topic-name
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: object
              examples:
                dataSampleResponse:
                  $ref: '#/components/examples/dataSampleResponse'
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
        "502":
          description: Bad Gateway
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DmiErrorMessage'
              example:
                message: "Bad Gateway Error Message NCMP"
                dmi-response:
                  http-code: 400
                  body: Bad Request
    put:
      tags:
      - network-cm-proxy
      summary: Update resource data from pass-through running for a cm handle
      description: Update resource data from pass-through running for the given cm
        handle
      operationId: updateResourceDataRunningForCmHandle
      parameters:
      - name: cm-handle
        in: path
        description: "The identifier for a network function, network element, subnetwork\
          \ or any other cm object by managed Network CM Proxy"
        required: true
        schema:
          type: string
          example: my-cm-handle
      - name: resourceIdentifier
        in: query
        description: The format of resource identifier depend on the associated DMI
          Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but
          it can really be anything.
        required: true
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              resourceIdentifier: \shops\bookstore
          sample 2:
            value:
              resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]"
          sample 3:
            value:
              resourceIdentifier: "parent=shops,child=bookstore"
      - name: Content-Type
        in: header
        description: "Content parameter for request, if content parameter is null,\
          \ default value is application/json."
        required: false
        schema:
          type: string
          example: application/yang-data+json
          default: application/json
      requestBody:
        content:
          application/json:
            schema:
              type: object
            examples:
              dataSampleRequest:
                $ref: '#/components/examples/dataSampleRequest'
          application/yang-data+json:
            schema:
              type: object
            examples:
              dataSampleRequest:
                $ref: '#/components/examples/dataSampleRequest'
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: object
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
        "502":
          description: Bad Gateway
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DmiErrorMessage'
              example:
                message: "Bad Gateway Error Message NCMP"
                dmi-response:
                  http-code: 400
                  body: Bad Request
    post:
      tags:
      - network-cm-proxy
      summary: create resource data from pass-through running for cm handle
      description: create resource data from pass-through running for given cm handle
      operationId: createResourceDataRunningForCmHandle
      parameters:
      - name: cm-handle
        in: path
        description: "The identifier for a network function, network element, subnetwork\
          \ or any other cm object by managed Network CM Proxy"
        required: true
        schema:
          type: string
          example: my-cm-handle
      - name: resourceIdentifier
        in: query
        description: The format of resource identifier depend on the associated DMI
          Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but
          it can really be anything.
        required: true
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              resourceIdentifier: \shops\bookstore
          sample 2:
            value:
              resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]"
          sample 3:
            value:
              resourceIdentifier: "parent=shops,child=bookstore"
      - name: Content-Type
        in: header
        description: "Content parameter for request, if content parameter is null,\
          \ default value is application/json."
        required: false
        schema:
          type: string
          example: application/yang-data+json
          default: application/json
      requestBody:
        content:
          application/json:
            schema:
              type: object
            examples:
              dataSampleRequest:
                $ref: '#/components/examples/dataSampleRequest'
          application/yang-data+json:
            schema:
              type: object
            examples:
              dataSampleRequest:
                $ref: '#/components/examples/dataSampleRequest'
        required: true
      responses:
        "201":
          description: Created
          content: {}
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
        "502":
          description: Bad Gateway
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DmiErrorMessage'
              example:
                message: "Bad Gateway Error Message NCMP"
                dmi-response:
                  http-code: 400
                  body: Bad Request
    delete:
      tags:
      - network-cm-proxy
      summary: Delete resource data
      description: Delete resource data from pass-through running for a given cm handle
      operationId: deleteResourceDataRunningForCmHandle
      parameters:
      - name: cm-handle
        in: path
        description: "The identifier for a network function, network element, subnetwork\
          \ or any other cm object by managed Network CM Proxy"
        required: true
        schema:
          type: string
          example: my-cm-handle
      - name: resourceIdentifier
        in: query
        description: The format of resource identifier depend on the associated DMI
          Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but
          it can really be anything.
        required: true
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              resourceIdentifier: \shops\bookstore
          sample 2:
            value:
              resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]"
          sample 3:
            value:
              resourceIdentifier: "parent=shops,child=bookstore"
      - name: Content-Type
        in: header
        description: "Content parameter for request, if content parameter is null,\
          \ default value is application/json."
        required: false
        schema:
          type: string
          example: application/yang-data+json
          default: application/json
      responses:
        "204":
          description: No Content
          content: {}
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "404":
          description: The specified resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400
                message: Not found error message
                details: Not found error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
        "502":
          description: Bad Gateway
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DmiErrorMessage'
              example:
                message: "Bad Gateway Error Message NCMP"
                dmi-response:
                  http-code: 400
                  body: Bad Request
    patch:
      tags:
      - network-cm-proxy
      summary: Patch resource data from pass-through running
      description: Patch resource data from pass-through running for the given cm
        handle
      operationId: patchResourceDataRunningForCmHandle
      parameters:
      - name: cm-handle
        in: path
        description: "The identifier for a network function, network element, subnetwork\
          \ or any other cm object by managed Network CM Proxy"
        required: true
        schema:
          type: string
          example: my-cm-handle
      - name: resourceIdentifier
        in: query
        description: The format of resource identifier depend on the associated DMI
          Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but
          it can really be anything.
        required: true
        allowReserved: true
        schema:
          type: string
        examples:
          sample 1:
            value:
              resourceIdentifier: \shops\bookstore
          sample 2:
            value:
              resourceIdentifier: "\\shops\\bookstore\\categories[@code=1]"
          sample 3:
            value:
              resourceIdentifier: "parent=shops,child=bookstore"
      - name: Content-Type
        in: header
        description: "Content parameter for request, if content parameter is null,\
          \ default value is application/json."
        required: false
        schema:
          type: string
          example: application/yang-data+json
          default: application/json
      requestBody:
        content:
          '*/*':
            schema:
              type: object
            examples:
              dataSampleRequest:
                $ref: '#/components/examples/dataSamplePatchRequest'
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: object
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
        "502":
          description: Bad Gateway
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DmiErrorMessage'
              example:
                message: "Bad Gateway Error Message NCMP"
                dmi-response:
                  http-code: 400
                  body: Bad Request
  /v1/ch/{cm-handle}/modules:
    get:
      tags:
      - network-cm-proxy
      summary: Fetch all module references (name and revision) for a given cm handle
      description: fetch all module references (name and revision) for a given cm
        handle
      operationId: getModuleReferencesByCmHandle
      parameters:
      - name: cm-handle
        in: path
        description: "The identifier for a network function, network element, subnetwork\
          \ or any other cm object by managed Network CM Proxy"
        required: true
        schema:
          type: string
          example: my-cm-handle
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RestModuleReference'
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
  /v1/ch/searches:
    post:
      tags:
      - network-cm-proxy
      summary: Execute cm handle search using the available conditions
      description: Execute cm handle searches using 'hasAllModules' condition to get
        all cm handles for the given module names
      operationId: executeCmHandleSearch
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Conditions'
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CmHandles'
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
  /v1/ch/{cm-handle}:
    get:
      tags:
      - network-cm-proxy
      summary: Retrieve CM handle details
      description: Retrieve CM handle details and properties by cm handle id
      operationId: retrieveCmHandleDetailsById
      parameters:
      - name: cm-handle
        in: path
        description: "The identifier for a network function, network element, subnetwork\
          \ or any other cm object by managed Network CM Proxy"
        required: true
        schema:
          type: string
          example: my-cm-handle
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RestOutputCmHandle'
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400 BAD_REQUEST
                message: Bad request error message
                details: Bad request error details
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 401
                message: Unauthorized error message
                details: Unauthorized error details
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 403
                message: Forbidden error message
                details: Forbidden error details
        "404":
          description: The specified resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 400
                message: Not found error message
                details: Not found error details
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
              example:
                status: 500
                message: Internal Server Error
                details: Internal Server Error occurred
components:
  schemas:
    ErrorMessage:
      title: Error
      type: object
      properties:
        status:
          type: string
        message:
          type: string
        details:
          type: string
    # DMI Server Exception Schema
    DmiErrorMessage:
      title: DMI Error Message
      type: object
      properties:
        message:
          type: string
          example: "Bad Gateway Error Message NCMP"
        dmi-response:
          type: object
          properties:
            http-code:
              type: integer
              example: 400
            body:
              type: string
              example: Bad Request
    RestModuleReference:
      title: Module reference details
      type: object
      properties:
        moduleName:
          type: string
          example: my-module-name
        revision:
          type: string
          example: my-module-revision
    Conditions:
      type: object
      properties:
        conditions:
          $ref: '#/components/schemas/ConditionsData'
    ConditionsData:
      type: array
      items:
        $ref: '#/components/schemas/ConditionProperties'
    ConditionProperties:
      properties:
        name:
          type: string
          example: hasAllModules
        conditionParameters:
          $ref: '#/components/schemas/ModuleNamesAsJsonArray'
    ModuleNamesAsJsonArray:
      type: array
      items:
        $ref: '#/components/schemas/ModuleNameAsJsonObject'
    ModuleNameAsJsonObject:
      properties:
        moduleName:
          type: string
          example: my-module
    CmHandles:
      type: object
      properties:
        cmHandles:
          $ref: '#/components/schemas/CmHandleProperties'
    CmHandleProperties:
      type: array
      items:
        $ref: '#/components/schemas/CmHandleProperty'
    CmHandleProperty:
      properties:
        cmHandleId:
          type: string
          example: my-cm-handle-id
    RestOutputCmHandle:
      title: CM handle Details
      type: object
      properties:
        cmHandle:
          type: string
          example: my-cm-handle1
        publicCmHandleProperties:
          $ref: '#/components/schemas/CmHandlePublicProperties'
    CmHandlePublicProperties:
      type: array
      items:
        type: object
        additionalProperties:
          type: string
          example: Book Type
  examples:
    dataSampleResponse:
      summary: Sample response
      description: Sample response for selecting 'sample 1'.
      value:
        bookstore:
          categories:
          - code: "01"
            books:
            - authors:
              - Iain M. Banks
              - Ursula K. Le Guin
            name: SciFi
          - code: "02"
            books:
            - authors:
              - Philip Pullman
            name: kids
    dataSampleRequest:
      summary: Sample request
      description: Sample request body
      value:
        test:bookstore:
          bookstore-name: Chapters
          categories:
          - code: "01"
            name: SciFi
            books:
            - authors:
              - Iain M. Banks
              - Ursula K. Le Guin
          - code: "02"
            name: kids
            books:
            - authors:
              - Philip Pullman
    dataSamplePatchRequest:
      summary: Sample patch request
      description: Sample patch request body
      value:
        ietf-restconf:yang-patch:
          patch-id: patch-1
          edit:
          - edit-id: edit1
            operation: merge
            target: /
            value:
              test:bookstore:
                bookstore-name: Chapters
                categories:
                - code: "01"
                  name: Science
                  books:
                  - authors:
                    - Author1
                    - Author2
                - code: "02"
                  name: Arts
                  books:
                  - authors:
                    - Author3
          - edit-id: edit2
            operation: merge
            target: /
            value:
              test:bookstore:
                bookstore-name: Novels
                categories:
                - code: "03"
                  name: History
                  books:
                  - authors:
                    - Iain M. Banks
                    - Ursula K. Le Guin
                - code: "04"
                  name: Fiction
                  books:
                  - authors:
                    - Philip Pullman