openapi: 3.0.3
info:
  title: Data Collection Service API
  description: |
    数据归集服务API，基于数据归集实现数据采集和归集功能。

    主要功能：
    - 数据归集任务创建和管理
    - 数据同步任务执行
    - 任务监控和状态查询
    - 执行日志查看

  version: 1.0.0

servers:
  - url: http://localhost:8090/api/v1/collection
    description: Development server

tags:
  - name: CollectionTask
    description: 数据归集任务管理（包括模板查询）
  - name: TaskExecution
    description: 任务执行管理

paths:
  /data-collection/tasks:
    get:
      operationId: getTasks
      tags: [CollectionTask]
      summary: 获取归集任务列表
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            default: 0
        - name: size
          in: query
          schema:
            type: integer
            default: 20
        - name: status
          in: query
          schema:
            $ref: '#/components/schemas/TaskStatus'
        - name: name
          in: query
          description: 任务名称关键字搜索
          schema:
            type: string
      responses:
        '200':
          description: 归集任务列表
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PagedCollectionTaskSummary'

    post:
      operationId: createTask
      tags: [CollectionTask]
      summary: 创建归集任务
      description: 创建新的数据归集任务
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCollectionTaskRequest'
      responses:
        '201':
          description: 归集任务创建成功
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionTaskResponse'

  /data-collection/tasks/{id}:
    get:
      operationId: getTaskDetail
      tags: [CollectionTask]
      summary: 获取归集任务详情
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 归集任务详情
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionTaskResponse'
        '404':
          description: 归集任务不存在

    put:
      operationId: updateTask
      tags: [CollectionTask]
      summary: 更新归集任务
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCollectionTaskRequest'
      responses:
        '200':
          description: 归集任务更新成功
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionTaskResponse'

    delete:
      operationId: deleteTask
      tags: [CollectionTask]
      summary: 删除归集任务
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '204':
          description: 归集任务删除成功

  /tasks/{id}/execute:
    post:
      tags: [TaskExecution]
      summary: 执行归集任务
      description: 立即执行指定的归集任务
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '201':
          description: 任务执行已启动
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskExecutionResponse'

  /tasks/{id}/executions:
    get:
      tags: [TaskExecution]
      summary: 获取任务执行记录
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          schema:
            type: integer
            default: 0
        - name: size
          in: query
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: 任务执行记录列表
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PagedTaskExecutions'

  /executions/{id}:
    get:
      tags: [TaskExecution]
      summary: 获取执行详情
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 执行详情
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskExecutionDetail'

    delete:
      tags: [TaskExecution]
      summary: 停止任务执行
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '204':
          description: 任务执行已停止

  /templates:
    get:
      tags: [CollectionTask]
      summary: 获取DataX模板列表
      description: 获取可用的DataX任务模板列表，用于创建任务时选择
      parameters:
        - name: sourceType
          in: query
          description: 源数据源类型过滤
          schema:
            type: string
        - name: targetType
          in: query
          description: 目标数据源类型过滤
          schema:
            type: string
        - name: page
          in: query
          schema:
            type: integer
            default: 0
        - name: size
          in: query
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: 归集模板列表
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PagedDataxTemplates'

components:
  schemas:
    TaskStatus:
      type: string
      enum:
        - DRAFT
        - READY
        - RUNNING
        - SUCCESS
        - FAILED
        - STOPPED
      description: |
        任务和执行状态枚举:
        - DRAFT: 草稿状态
        - READY: 就绪状态
        - RUNNING: 运行中
        - SUCCESS: 执行成功 (对应原来的COMPLETED/SUCCESS)
        - FAILED: 执行失败
        - STOPPED: 已停止

    SyncMode:
      type: string
      enum: [ONCE, SCHEDULED]
      description: 同步方式：一次性(ONCE) 或 定时(SCHEDULED)

    CollectionTaskSummary:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        status:
          $ref: '#/components/schemas/TaskStatus'
        syncMode:
          $ref: '#/components/schemas/SyncMode'
        lastExecutionId:
          type: string
          description: 最后执行ID
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
      description: 任务列表摘要信息（不包含详细配置与调度表达式）

    CollectionTaskResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        config:
          type: object
          additionalProperties: true
          description: 归集配置，包含源端和目标端配置信息
        status:
          $ref: '#/components/schemas/TaskStatus'
        syncMode:
          $ref: '#/components/schemas/SyncMode'
        scheduleExpression:
          type: string
          description: Cron调度表达式 (仅当 syncMode = SCHEDULED 时有效)
        lastExecutionId:
          type: string
          description: 最后执行ID
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time

    CreateCollectionTaskRequest:
      type: object
      required:
        - name
        - config
        - syncMode
      properties:
        name:
          type: string
          description: 任务名称
          minLength: 1
          maxLength: 100
        description:
          type: string
          description: 任务描述
          maxLength: 500
        config:
          type: object
          description: 归集配置，包含源端和目标端配置信息
          additionalProperties: true
        syncMode:
          $ref: '#/components/schemas/SyncMode'
        scheduleExpression:
          type: string
          description: Cron调度表达式 (syncMode=SCHEDULED 时必填)

    UpdateCollectionTaskRequest:
      type: object
      properties:
        name:
          type: string
          description: 任务名称
          minLength: 1
          maxLength: 100
        description:
          type: string
          description: 任务描述
          maxLength: 500
        config:
          type: object
          description: 归集配置，包含源端和目标端配置信息
          additionalProperties: true
        syncMode:
          $ref: '#/components/schemas/SyncMode'
        scheduleExpression:
          type: string
          description: Cron调度表达式 (syncMode=SCHEDULED 时必填)

    PagedCollectionTaskSummary:
      type: object
      properties:
        content:
          type: array
          items:
            $ref: '#/components/schemas/CollectionTaskSummary'
        totalElements:
          type: integer
        totalPages:
          type: integer
        number:
          type: integer
        size:
          type: integer

    PagedCollectionTasks:
      type: object
      properties:
        content:
          type: array
          items:
            $ref: '#/components/schemas/CollectionTaskResponse'
        totalElements:
          type: integer
        totalPages:
          type: integer
        number:
          type: integer
        size:
          type: integer

    TaskExecutionResponse:
      type: object
      properties:
        id:
          type: string
        taskId:
          type: string
        taskName:
          type: string
        status:
          $ref: '#/components/schemas/TaskStatus'
        startedAt:
          type: string
          format: date-time

    TaskExecutionDetail:
      type: object
      properties:
        id:
          type: string
        taskId:
          type: string
        taskName:
          type: string
        status:
          $ref: '#/components/schemas/TaskStatus'
        progress:
          type: number
          format: double
          minimum: 0
          maximum: 100
        recordsTotal:
          type: integer
        recordsProcessed:
          type: integer
        recordsSuccess:
          type: integer
        recordsFailed:
          type: integer
        throughput:
          type: number
          format: double
        dataSizeBytes:
          type: integer
        startedAt:
          type: string
          format: date-time
        completedAt:
          type: string
          format: date-time
        durationSeconds:
          type: integer
        errorMessage:
          type: string

    PagedTaskExecutions:
      type: object
      properties:
        content:
          type: array
          items:
            $ref: '#/components/schemas/TaskExecutionDetail'
        totalElements:
          type: integer
        totalPages:
          type: integer
        number:
          type: integer
        size:
          type: integer

    DataxTemplateSummary:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        sourceType:
          type: string
          description: 源数据源类型
        targetType:
          type: string
          description: 目标数据源类型
        description:
          type: string
        version:
          type: string
        isSystem:
          type: boolean
          description: 是否为系统模板
        createdAt:
          type: string
          format: date-time

    PagedDataxTemplates:
      type: object
      properties:
        content:
          type: array
          items:
            $ref: '#/components/schemas/DataxTemplateSummary'
        totalElements:
          type: integer
        totalPages:
          type: integer
        number:
          type: integer
        size:
          type: integer
