From f348601acab879b6d95d500550546dae0916b90d Mon Sep 17 00:00:00 2001 From: Jeremy Lecour Date: Thu, 27 Jan 2022 17:42:47 +0100 Subject: [PATCH] =?UTF-8?q?Cr=C3=A9ation=20de=20checks=20par=20l'API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/check_reports_controller.rb | 38 +++++++++++++++++++ app/controllers/api/v1/checks_controller.rb | 26 ------------- app/models/check_report.rb | 8 ++++ app/views/checks/index.html.erb | 4 +- config/routes.rb | 2 +- .../20220127153040_add_date_to_checks.rb | 5 +++ db/schema.rb | 3 +- 7 files changed, 56 insertions(+), 30 deletions(-) create mode 100644 app/controllers/api/v1/check_reports_controller.rb delete mode 100644 app/controllers/api/v1/checks_controller.rb create mode 100644 app/models/check_report.rb create mode 100644 db/migrate/20220127153040_add_date_to_checks.rb diff --git a/app/controllers/api/v1/check_reports_controller.rb b/app/controllers/api/v1/check_reports_controller.rb new file mode 100644 index 0000000..396eaaf --- /dev/null +++ b/app/controllers/api/v1/check_reports_controller.rb @@ -0,0 +1,38 @@ +class Api::V1::CheckReportsController < Api::V1::BaseController + + # POST /check-reports or /check-reports.json + def create + @check_report = CheckReport.new(check_report_params) + + if @check_report.checks.empty? + render json: { message: "At least 1 check must be present" }, status: :unprocessable_entity + else + checks_params = ActionController::Parameters.new(@check_report.checks).permit(:name, :description).map { |check| + { + hostname: @check_report.hostname, + date: @check_report.date, + name: check.fetch(:name, ""), + description: check.fetch(:description, "") + } + } + checks = Check.create(checks_params) + + persisted = checks.count(&:persisted?) + invalid = checks.count(&:invalid?) + + if checks.all?(:persisted?) + render json: { message: "#{persisted} checks created" }, status: :created + else + render json: { message: "error while creating checks : #{persisted} persisted, #{invalid} invalid" }, status: :unprocessable_entity + end + end + end + + private + + # Only allow a list of trusted parameters through. + def check_report_params + params.require(:check_report).permit(:hostname, :date, {checks: [:name, :description]}) + end + +end \ No newline at end of file diff --git a/app/controllers/api/v1/checks_controller.rb b/app/controllers/api/v1/checks_controller.rb deleted file mode 100644 index 167d8a9..0000000 --- a/app/controllers/api/v1/checks_controller.rb +++ /dev/null @@ -1,26 +0,0 @@ -class Api::V1::ChecksController < Api::V1::BaseController - - # POST /checks or /checks.json - def create - @check = Check.new(check_params) - - if @check.save - render json: { message: "created" }, status: :created - else - render json: @check.errors, status: :unprocessable_entity - end - end - - private - - # Use callbacks to share common setup or constraints between actions. - def set_check - @check = Check.find(params[:id]) - end - - # Only allow a list of trusted parameters through. - def check_params - params.require(:check).permit(:name, :description, :hostname) - end - -end \ No newline at end of file diff --git a/app/models/check_report.rb b/app/models/check_report.rb new file mode 100644 index 0000000..6bb2300 --- /dev/null +++ b/app/models/check_report.rb @@ -0,0 +1,8 @@ +class CheckReport + include ActiveModel::API + include ActiveModel::Attributes + + attribute :hostname, :string + attribute :date, :datetime, default: -> { Time.now } + attribute :checks, array: true +end diff --git a/app/views/checks/index.html.erb b/app/views/checks/index.html.erb index 6da1e15..3f4c2ca 100644 --- a/app/views/checks/index.html.erb +++ b/app/views/checks/index.html.erb @@ -43,7 +43,7 @@ <%= check.description %> - <%= check.created_at %> + <%= check.date %> <%= link_to "Show", check, class: "text-indigo-600 hover:text-indigo-900" %> @@ -55,7 +55,7 @@ -
+
<%= link_to_previous_page @checks, 'Previous page', class: "ml-3 paginate-page paginate-page-single" %> <%= link_to_next_page @checks, 'Next Page', class: "paginate-page paginate-page-single" %> diff --git a/config/routes.rb b/config/routes.rb index 881d8bd..2dba573 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,7 +4,7 @@ Rails.application.routes.draw do namespace :v1 do defaults format: :json do get '/ping', to: 'base#ping' - resources :checks, only: [:create] + resources :check_reports, path: "check-reports", only: [:create] end end end diff --git a/db/migrate/20220127153040_add_date_to_checks.rb b/db/migrate/20220127153040_add_date_to_checks.rb new file mode 100644 index 0000000..6b80a94 --- /dev/null +++ b/db/migrate/20220127153040_add_date_to_checks.rb @@ -0,0 +1,5 @@ +class AddDateToChecks < ActiveRecord::Migration[7.0] + def change + add_column :checks, :date, :datetime, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 3ef8ea5..adbd3ae 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_01_24_181635) do +ActiveRecord::Schema.define(version: 2022_01_27_153040) do create_table "api_keys", force: :cascade do |t| t.string "token" @@ -27,6 +27,7 @@ ActiveRecord::Schema.define(version: 2022_01_24_181635) do t.string "hostname" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.datetime "date", precision: 6, null: false t.index ["hostname"], name: "index_checks_on_hostname" t.index ["name"], name: "index_checks_on_name" end