menglifang/task-manager

View on GitHub
app/controllers/task_manager/api/v1/plans_controller.rb

Summary

Maintainability
A
40 mins
Test Coverage
# -*- encoding: utf-8 -*-
module TaskManager
  module Api
    module V1
      class PlansController < TaskManager::ApplicationController
        respond_to :json

        # 查询计划
        #
        # 支持的查询属性有:
        #   name                      计划名
        #   plan_type                 计划周期
        #   autocompletable           是否自动完成
        #   last_task_created_at      最后任务生成时间
        #   enabled_at                生效时间
        #
        # 支持的查询操作参见 https://github.com/ernie/ransack/wiki/Basic-Searching
        #
        # 分页查询参数:
        #   page    请求的页码,缺省值1
        #   limit   每页记录数,缺省值25
        #
        # @example
        #   # 请求
        #   GET /api/plans?q[name_cont]=... HTTP/1.1
        #   Accept: application/vnd.menglifang.com.cn; version=1
        #
        #   # 响应
        #   HTTP/1.1 200 OK
        #   {
        #     "total": ...,
        #     "plans": [{
        #       "id": ...,
        #       "name": ...,
        #       "data": ...,
        #       "plan_type": ...,
        #       "enabled_at": ...,
        #       "last_task_created_at": ...,
        #       "begin_to_remind": ...,
        #       "autocompletable": ...,
        #       "created_at": ...,
        #       "updated_at": ...,
        #       "assignees": [{
        #         "id": ...,
        #         "name": ...
        #       }, ...]
        #     }, ...]
        #   }
        def index
          plans = TaskManager::Plan.page(params[:page]).per(params[:limit]).
            order('id DESC').search(params[:q]).result
          result = {
            total: plans.total_count,
            plans: ActiveModel::ArraySerializer.new(plans).as_json
          }

          render json: result, status: :ok
        end

        # 创建计划
        #
        # @example
        #   # 请求
        #   POST /api/plans HTTP/1.1
        #   Accept: application/vnd.menglifang.com.cn; version=1
        #
        #   {
        #     "plan": {
        #       "name": ...,                     # 必填且唯一
        #       "plan_type": ...,                # 必填,有效取值:'daily',
        #                                        # 'weekly', 'monthly',
        #                                        # 'quarterly', 'yearly'
        #       "data": {
        #         "x": ...,                      # 可选
        #         "y": ...,                      # 可选
        #         "deadline_month": ...,         # 当"plan_type"为'yearly'或
        #                                        #  'quarterly'时,为必填项;
        #                                        #  否则,为null
        #         "deadline_day": ...,           # 当"plan_type"为'monthly'或
        #                                        #  'weekly'时,为必填项;
        #                                        #  否则,为null
        #         "deadline_hour": ...,          # 必填
        #         "deadline_minute": ...         # 必填
        #       },
        #       "enabled_at": ...,               # 必填
        #       "begin_to_remind": ...,          # 必填且大于等于0
        #       "autocompletable": ...,          # 必填,缺省值为false
        #       "assignables_attributes": [{     # 至少需要一个assignable
        #         "assignee_id": ...,
        #         "assignee_type": ...
        #       }, ...],
        #
        #       "callables_attributes": [{       # 可选
        #         "callback_id": ...,
        #         "callback_type": ...
        #       }]
        #     }
        #   }
        #
        #   # 响应
        #   ## 成功
        #   HTTP/1.1 201 Created
        #   {
        #     "plan": {
        #       "id": ...,
        #       "name": ...,
        #       "plan_type": ...,
        #       "data": ...,
        #       "enabled_at": ...,
        #       "begin_to_remind": ...,
        #       "autocompletable": ...,
        #       "created_at": ...,
        #       "updated_at": ...,
        #       "assignees": [{
        #         "id": ...,
        #         "name": ...
        #       }, ...]
        #     }
        #   }
        #   ## 失败
        #   HTTP/1.1 422 Unprocessable Entity
        #   {
        #     "errors": {
        #       "name": [...],
        #       ...
        #     }
        #   }
        def create
          plan = TaskManager::Plan.new(params[:plan])

          if plan.save
            render json: plan, status: :created
          else
            render json: { errors: plan.errors }, status: :unprocessable_entity
          end
        end

        # 更新计划
        #
        # @example
        #   # 请求
        #   PUT /api/plans/... HTTP/1.1
        #   Accept: application/vnd.menglifang.com.cn; version=1
        #
        #   {
        #     "plan": {
        #       "name": ...,                     # 必填且唯一
        #       "plan_type": ...,                # 必填,有效取值:'daily',
        #                                        # 'weekly', 'monthly',
        #                                        # 'quarterly', 'yearly'
        #       "data": {
        #         "x": ...,                      # 可选
        #         "y": ...,                      # 可选
        #         "deadline_month": ...,         # 当"plan_type"为'yearly'或
        #                                        #  'quarterly'时,为必填项;
        #                                        #  否则,为null
        #         "deadline_day": ...,           # 当"plan_type"为'monthly'或
        #                                        #  'weekly'时,为必填项;
        #                                        #  否则,为null
        #         "deadline_hour": ...,          # 必填
        #         "deadline_minute": ...         # 必填
        #       },
        #       "enabled_at": ...,               # 必填
        #       "begin_to_remind": ...,          # 必填且大于等于0
        #       "autocompletable": ...,          # 必填,缺省值为false
        #
        #       "assignables_attributes": [{
        #         "id": ...,                     ## 可选,
        #                                        ## 如果有,则更新,否则创建
        #         "assignee_id": ...,          ## 必填
        #         "assignee_type": ...,        ## 必填
        #         "_destroy": "1"                ## 可选,
        #                                        ## 如果设置,存在则删除,
        #                                        ## 不存在则忽略
        #       }, ...],
        #
        #       "callables_attributes": [{       # 可选
        #         "id": ...,                     ## 可选,
        #                                        ## 如果有,则更新,否则创建
        #         "callback_id": ...,            ## 必填
        #         "callback_type": ...,          ## 必填
        #         "_destroy": "1"                ## 可选,
        #                                        ## 如果设置,存在则删除,
        #                                        ## 不存在则忽略
        #       }]
        #     }
        #   }
        #
        #   # 响应
        #   ## 成功
        #   HTTP/1.1 202 Accepted
        #   {
        #     "plan": {
        #       "id": ...,
        #       "name": ...,
        #       "plan_type": ...,
        #       "data": ...,
        #       "enabled_at": ...,
        #       "begin_to_remind": ...,
        #       "autocompletable": ...,
        #       "created_at": ...,
        #       "updated_at": ...,
        #       "assignees": [{
        #         "id": ...,
        #         "name": ...
        #       }, ...]
        #     }
        #   }
        #   ## 失败
        #   HTTP/1.1 422 Unprocessable Entity
        #   {
        #     "errors": {
        #       "name": [...],
        #       ...
        #     }
        #   }
        def update
          plan.assignables.destroy_all
          plan.callables.destroy_all

          if plan.update_attributes(params[:plan])
            render json: plan, status: :ok
          else
            render json: { errors: plan.errors }, status: :unprocessable_entity
          end
        end

        # 删除计划
        #
        # @example
        #   # 请求
        #   DELETE /api/plans/... HTTP/1.1
        #   Accept: application/vnd.menglifang.com.cn; version=1
        #
        #   # 响应
        #   ## 成功
        #   HTTP/1.1 204 No Content
        def destroy
          plan.destroy

          head :no_content
        end

        private
        def plan
          TaskManager::Plan.find(params[:id])
        end
      end
    end
  end
end