feat(lifecycle): REST endpoint for lifecycle rules CRUD
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
cb67a1063d
commit
7c17a7cb96
@ -1,5 +1,43 @@
|
|||||||
class Api::V1::Accounts::Captain::LifecycleRulesController < Api::V1::Accounts::BaseController
|
class Api::V1::Accounts::Captain::LifecycleRulesController < Api::V1::Accounts::BaseController
|
||||||
|
before_action :current_account
|
||||||
|
before_action -> { check_authorization(Captain::Lifecycle::Rule) }
|
||||||
|
before_action :set_rule, only: [:show, :update, :destroy]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
head :ok
|
@rules = Current.account.captain_lifecycle_rules.order(priority: :asc, id: :desc)
|
||||||
|
end
|
||||||
|
|
||||||
|
def show; end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@rule = Current.account.captain_lifecycle_rules.create!(
|
||||||
|
rule_params.merge(created_by_user: Current.user)
|
||||||
|
)
|
||||||
|
render 'api/v1/accounts/captain/lifecycle_rules/show'
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@rule.update!(rule_params)
|
||||||
|
render 'api/v1/accounts/captain/lifecycle_rules/show'
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@rule.destroy!
|
||||||
|
head :no_content
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_rule
|
||||||
|
@rule = Current.account.captain_lifecycle_rules.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def rule_params
|
||||||
|
params.require(:rule).permit(
|
||||||
|
:name, :description, :enabled, :event, :offset_minutes,
|
||||||
|
:message_type, :message_body, :priority,
|
||||||
|
filters: {},
|
||||||
|
message_payload: {}
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -0,0 +1 @@
|
|||||||
|
json.partial! 'api/v1/models/captain/lifecycle_rule', resource: @rule
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
json.payload do
|
||||||
|
json.array! @rules do |rule|
|
||||||
|
json.partial! 'api/v1/models/captain/lifecycle_rule', resource: rule
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
json.meta do
|
||||||
|
json.total_count @rules.count
|
||||||
|
end
|
||||||
@ -0,0 +1 @@
|
|||||||
|
json.partial! 'api/v1/models/captain/lifecycle_rule', resource: @rule
|
||||||
@ -0,0 +1 @@
|
|||||||
|
json.partial! 'api/v1/models/captain/lifecycle_rule', resource: @rule
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
json.id resource.id
|
||||||
|
json.account_id resource.account_id
|
||||||
|
json.name resource.name
|
||||||
|
json.description resource.description
|
||||||
|
json.enabled resource.enabled
|
||||||
|
json.event resource.event
|
||||||
|
json.offset_minutes resource.offset_minutes
|
||||||
|
json.filters resource.filters || {}
|
||||||
|
json.message_type resource.message_type
|
||||||
|
json.message_body resource.message_body
|
||||||
|
json.message_payload resource.message_payload
|
||||||
|
json.priority resource.priority
|
||||||
|
json.created_by_user_id resource.created_by_user_id
|
||||||
|
json.created_at resource.created_at&.iso8601
|
||||||
|
json.updated_at resource.updated_at&.iso8601
|
||||||
@ -0,0 +1,82 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'Api::V1::Accounts::Captain::LifecycleRules', type: :request do
|
||||||
|
let(:account) { create(:account) }
|
||||||
|
let(:admin) { create(:user, account: account, role: :administrator) }
|
||||||
|
let(:agent) { create(:user, account: account, role: :agent) }
|
||||||
|
let(:other_account) { create(:account) }
|
||||||
|
|
||||||
|
def json_response
|
||||||
|
JSON.parse(response.body, symbolize_names: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'GET /api/v1/accounts/:account_id/captain/lifecycle_rules' do
|
||||||
|
it 'returns 401 when unauthenticated' do
|
||||||
|
get "/api/v1/accounts/#{account.id}/captain/lifecycle_rules"
|
||||||
|
expect(response).to have_http_status(:unauthorized)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns the account rules (and not others)' do
|
||||||
|
create_list(:captain_lifecycle_rule, 2, account: account)
|
||||||
|
create(:captain_lifecycle_rule, account: other_account)
|
||||||
|
|
||||||
|
get "/api/v1/accounts/#{account.id}/captain/lifecycle_rules",
|
||||||
|
headers: admin.create_new_auth_token, as: :json
|
||||||
|
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
expect(json_response[:payload].length).to eq(2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'POST /api/v1/accounts/:account_id/captain/lifecycle_rules' do
|
||||||
|
let(:valid_params) do
|
||||||
|
{
|
||||||
|
rule: {
|
||||||
|
name: 'Lembrete pré check-in',
|
||||||
|
event: 'checkin.scheduled_at',
|
||||||
|
offset_minutes: -10,
|
||||||
|
message_type: 'text',
|
||||||
|
message_body: 'Oi {{ customer.first_name }}',
|
||||||
|
filters: { unit_ids: [1] },
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'blocks agents' do
|
||||||
|
post "/api/v1/accounts/#{account.id}/captain/lifecycle_rules",
|
||||||
|
params: valid_params, headers: agent.create_new_auth_token, as: :json
|
||||||
|
expect(response).to have_http_status(:unauthorized)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'creates for admin' do
|
||||||
|
post "/api/v1/accounts/#{account.id}/captain/lifecycle_rules",
|
||||||
|
params: valid_params, headers: admin.create_new_auth_token, as: :json
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
expect(json_response[:name]).to eq('Lembrete pré check-in')
|
||||||
|
expect(Captain::Lifecycle::Rule.where(account: account).count).to eq(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'PATCH /api/v1/accounts/:account_id/captain/lifecycle_rules/:id' do
|
||||||
|
let(:rule) { create(:captain_lifecycle_rule, account: account, name: 'old') }
|
||||||
|
|
||||||
|
it 'updates for admin' do
|
||||||
|
patch "/api/v1/accounts/#{account.id}/captain/lifecycle_rules/#{rule.id}",
|
||||||
|
params: { rule: { name: 'new' } },
|
||||||
|
headers: admin.create_new_auth_token, as: :json
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
expect(rule.reload.name).to eq('new')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'DELETE /api/v1/accounts/:account_id/captain/lifecycle_rules/:id' do
|
||||||
|
it 'destroys for admin' do
|
||||||
|
rule = create(:captain_lifecycle_rule, account: account)
|
||||||
|
delete "/api/v1/accounts/#{account.id}/captain/lifecycle_rules/#{rule.id}",
|
||||||
|
headers: admin.create_new_auth_token, as: :json
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
expect(Captain::Lifecycle::Rule.where(id: rule.id)).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue
Block a user