openapi: 3.0.0

info:
  title: Security
  version: 1.0.0

servers:
- url: https://security.app.tradesoft.ru/
  description: App url

tags:
- name: grpc
- name: rule

paths:
  "/rule":
    get:
      tags: [rule]
      security:
      - bearerAuth: []
      summary: Get rule list
      operationId: rule
      parameters:
      - name: ns
        in: query
        description: Namespace
        schema:
          type: string
          example: 'tecdoc'
      responses:
        200:
          $ref: '#/components/responses/RuleListResponse'
        400:
          $ref: '#/components/responses/Error'
    post:
      tags: [rule]
      security:
      - bearerAuth: []
      summary: Add rule
      operationId: postRule
      parameters:
      - name: author
        in: header
        required: true
        description: Who managed operation
        schema:
          type: string
          example: 't.ogorodnikov'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RuleRequest'
      responses:
        200:
          $ref: '#/components/responses/RuleResponse'
        400:
          $ref: '#/components/responses/Error'
  "/rule/{id}":
    put:
      tags: [rule]
      security:
      - bearerAuth: []
      summary: Edit rule
      operationId: putRule
      parameters:
      - name: id
        in: path
        required: true
        description: rule id
        schema:
          type: string
          example: 'd3190764f126fabbf56bf3e36efbd56a'
      - name: author
        in: header
        description: Who managed operation
        required: true
        schema:
          type: string
          example: 't.ogorodnikov'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Rule'
      responses:
        200:
          $ref: '#/components/responses/RuleResponse'
        400:
          $ref: '#/components/responses/Error'
    delete:
      tags: [rule]
      security:
      - bearerAuth: []
      summary: Edit rule
      operationId: deleteRule
      parameters:
      - name: id
        in: path
        required: true
        description: rule id
        schema:
          type: string
          example: 'd3190764f126fabbf56bf3e36efbd56a'
      - name: author
        in: header
        description: Who managed operation
        required: true
        schema:
          type: string
          example: 't.ogorodnikov'
      responses:
        204:
          description: "OK"
  "/grpc/MultiEnforceDebug":
    post:
      tags: [grpc]
      summary: Security query
      operationId: debug
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Model'
      responses:
        200:
          $ref: '#/components/responses/EnforceDebug'
        400:
          $ref: '#/components/responses/Error'

components:
  responses:
    RuleResponse:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Rule'
    RuleListResponse:
      description: Success
      content:
        application/json:
          schema:
            type: array
            items:
              $ref: '#/components/schemas/Rule'
    EnforceDebug:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/EnforceDebug'
    Error:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      title: Error
      description: Error response to request
      properties:
        code:
          type: integer
        message:
          type: string
    RuleRequest:
      title: Rule
      description: rule
      properties:
        ns:
          description: namespace
          type: string
          example: 'pc'
        serviceId:
          description: service id
          type: integer
          example: 2171
        serviceKey:
          description: service key
          type: string
          example: "pc.api"
        limit:
          description: rule limit
          type: integer
          example: 510000
        period:
          description: period of checking limit
          type: integer
          example: 2592000
        access:
          description: grant access to resources
          type: array
          items:
            type:
              string
          example: ['pc.api.resource.*', 'pc.api.catalog.*']
        resources:
          description: check limit by this resources
          type: array
          items:
            type:
              string
          example: [
            "pc.api.resource.cars.success",
            "pc.api.resource.groups.success",
            "pc.api.resource.parts.success",
            "pc.api.resource.vin.success"
          ]
    Rule:
      title: Rule
      description: rule
      properties:
        id:
          description: rule id
          type: string
          example: 'd3190764f126fabbf56bf3e36efbd56a'
        ns:
          description: namespace
          type: string
          example: 'pc'
        serviceId:
          description: service id
          type: integer
          example: 2171
        serviceKey:
          description: service key
          type: string
          example: "pc.api"
        period:
          description: period (in seconds)
          type: integer
          example: 2592000
        limit:
          description: rule limit
          type: integer
          example: 510000
        access:
          description: grant access to resources
          type: array
          items:
            type:
              string
          example: ['pc.api.resource.*', 'pc.api.catalog.*']
        resources:
          description: check limit by this resources
          type: array
          items:
            type:
              string
          example: [
            "pc.api.resource.cars.success",
            "pc.api.resource.groups.success",
            "pc.api.resource.parts.success",
            "pc.api.resource.vin.success"
          ]
    EnforceDebug:
      title: EnforceDebug
      description: Debug response
      properties:
        result:
          description: result status
          type: boolean
        reason:
          description: error reason
          type: string
          enum: ["ok", "error"]
        report:
          description: report data
          type: array
          items:
            type:
              string
    Model:
      properties:
        handler:
          type: string
          description: App Handler
          example: 'tecdoc'
        project:
          type: string
          description: Project ID
          example: '3959'
        client:
          type: string
          description: Client Name
          example: ''
        ip:
          type: string
          description: IP address
          example: '136.243.110.80'
        domain:
          type: string
          description: Domain
          example: ''
        resources:
          type: array
          description: used resources / services
          items:
            type: string
          example: 'tecdoc-service.resource.service, tecdoc-service.access.full'
  securitySchemes:
    BearerAuth:
      type: "http"
      scheme: "bearer"
      bearerFormat: "token"