app/controllers/task_manager/api/v1/plans_controller.rb
# -*- 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