From c0ebe5a1e023d2eddff1b69f9a09bcf9c1bcb0b0 Mon Sep 17 00:00:00 2001 From: verrixkio Date: Sun, 15 Jun 2025 18:03:36 -0600 Subject: [PATCH 01/10] update CORS for admin api for initial admin support for our custom react --- Gemfile | 4 ++-- config/initializers/cors.rb | 18 +++++++++--------- config/routes.rb | 5 +++++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Gemfile b/Gemfile index 74c906c..bb72f4b 100644 --- a/Gemfile +++ b/Gemfile @@ -24,8 +24,8 @@ gem "bootsnap", require: false # gem "image_processing", "~> 1.2" # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin Ajax possible -# gem "rack-cors" -# +gem "rack-cors" + group :development, :test do diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb index 0c5dd99..dc5ac8e 100644 --- a/config/initializers/cors.rb +++ b/config/initializers/cors.rb @@ -5,12 +5,12 @@ # Read more: https://github.com/cyu/rack-cors -# Rails.application.config.middleware.insert_before 0, Rack::Cors do -# allow do -# origins "example.com" -# -# resource "*", -# headers: :any, -# methods: [:get, :post, :put, :patch, :delete, :options, :head] -# end -# end +Rails.application.config.middleware.insert_before 0, Rack::Cors do + allow do + origins "https://www.buildcanada.com" + + resource "*", + headers: :any, + methods: [:get, :post, :put, :patch, :delete, :options, :head] + end +end diff --git a/config/routes.rb b/config/routes.rb index 44842ed..fba9497 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -18,6 +18,11 @@ resources :promises, only: [ :index, :show ] resources :evidences, only: [ :index, :show ] + namespace :admin do + resources :promises, only: [:index, :show, :update] + resources :evidence, only: [:index, :show, :update] + end + # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. From 3a0da7033f40db98cae6e5cc08907f08f0abc334 Mon Sep 17 00:00:00 2001 From: verrixkio Date: Sun, 15 Jun 2025 18:05:47 -0600 Subject: [PATCH 02/10] scaffold two admin endpoint resources to test react frontend on. --- app/controllers/admin/evidence_controller.rb | 52 +++++++++++++++++++ app/controllers/admin/promises_controller.rb | 49 +++++++++++++++++ app/helpers/admin/evidence_helper.rb | 2 + app/helpers/admin/promises_helper.rb | 2 + .../admin/evidence_controller_test.rb | 7 +++ .../admin/promises_controller_test.rb | 7 +++ 6 files changed, 119 insertions(+) create mode 100644 app/controllers/admin/evidence_controller.rb create mode 100644 app/controllers/admin/promises_controller.rb create mode 100644 app/helpers/admin/evidence_helper.rb create mode 100644 app/helpers/admin/promises_helper.rb create mode 100644 test/controllers/admin/evidence_controller_test.rb create mode 100644 test/controllers/admin/promises_controller_test.rb diff --git a/app/controllers/admin/evidence_controller.rb b/app/controllers/admin/evidence_controller.rb new file mode 100644 index 0000000..02f129c --- /dev/null +++ b/app/controllers/admin/evidence_controller.rb @@ -0,0 +1,52 @@ +module Admin + class EvidencesController < ApplicationController + def index + evidences = Evidence.all + + if params[:parliament_session_id].present? + evidences = evidences.where(parliament_session_id: params[:parliament_session_id]) + end + + if params[:search].present? + query = "%#{params[:search]}%" + evidences = evidences.where( + "title ILIKE :q OR description ILIKE :q OR source_url ILIKE :q", + q: query + ) + end + + evidences = evidences + .order(created_at: :desc) + .limit(params[:limit] || 25) + .offset(params[:offset] || 0) + + render json: { + data: evidences.as_json(only: [:id, :title, :description, :source_url, :parliament_session_id]), + meta: { + total: evidences.count + } + } + end + + def show + evidence = Evidence.find(params[:id]) + render json: evidence.as_json(include: { promises: { only: [:id, :title] } }) + end + + def update + evidence = Evidence.find(params[:id]) + + if evidence.update(evidence_params) + render json: { success: true, data: evidence } + else + render json: { success: false, errors: evidence.errors.full_messages }, status: :unprocessable_entity + end + end + + private + + def evidence_params + params.require(:evidence).permit(:title, :description, :source_url, :parliament_session_id, promise_ids: []) + end + end +end diff --git a/app/controllers/admin/promises_controller.rb b/app/controllers/admin/promises_controller.rb new file mode 100644 index 0000000..60f6bf2 --- /dev/null +++ b/app/controllers/admin/promises_controller.rb @@ -0,0 +1,49 @@ +module Admin + class PromisesController < ApplicationController + def index + promises = Promise.all + + if params[:search].present? + query = "%#{params[:search]}%" + promises = promises.where("title ILIKE :q OR description ILIKE :q", q: query) + end + + promises = promises.order(created_at: :desc) + .limit(params[:limit] || 25) + .offset(params[:offset] || 0) + + render json: { + data: promises.as_json(only: [:id, :title, :description, :status], methods: [:evidence_ids]), + meta: { + total: promises.count + } + } + end + + def show + promise = Promise.find(params[:id]) + render json: promise.as_json(include: { evidence: { only: [:id, :title, :source_url] } }) + end + + def update + promise = Promise.find(params[:id]) + + if params[:promise][:evidence_ids].present? + merged_ids = (promise.evidence_ids + params[:promise][:evidence_ids].map(&:to_i)).uniq + promise.evidence_ids = merged_ids + end + + if promise.update(promise_params.except(:evidence_ids)) + render json: { success: true, data: promise } + else + render json: { success: false, errors: promise.errors.full_messages }, status: :unprocessable_entity + end + end + + private + + def promise_params + params.require(:promise).permit! + end + end + end diff --git a/app/helpers/admin/evidence_helper.rb b/app/helpers/admin/evidence_helper.rb new file mode 100644 index 0000000..644130e --- /dev/null +++ b/app/helpers/admin/evidence_helper.rb @@ -0,0 +1,2 @@ +module Admin::EvidenceHelper +end diff --git a/app/helpers/admin/promises_helper.rb b/app/helpers/admin/promises_helper.rb new file mode 100644 index 0000000..783837b --- /dev/null +++ b/app/helpers/admin/promises_helper.rb @@ -0,0 +1,2 @@ +module Admin::PromisesHelper +end diff --git a/test/controllers/admin/evidence_controller_test.rb b/test/controllers/admin/evidence_controller_test.rb new file mode 100644 index 0000000..5239555 --- /dev/null +++ b/test/controllers/admin/evidence_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class Admin::EvidenceControllerTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end diff --git a/test/controllers/admin/promises_controller_test.rb b/test/controllers/admin/promises_controller_test.rb new file mode 100644 index 0000000..0de59d5 --- /dev/null +++ b/test/controllers/admin/promises_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class Admin::PromisesControllerTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end From 492a417fc8972e9c3acfca50d76ab848018145cd Mon Sep 17 00:00:00 2001 From: verrixkio Date: Sun, 15 Jun 2025 18:08:04 -0600 Subject: [PATCH 03/10] add delete paths --- app/controllers/admin/evidence_controller.rb | 9 +++++++++ app/controllers/admin/promises_controller.rb | 9 +++++++++ config/routes.rb | 4 ++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/evidence_controller.rb b/app/controllers/admin/evidence_controller.rb index 02f129c..9d6f048 100644 --- a/app/controllers/admin/evidence_controller.rb +++ b/app/controllers/admin/evidence_controller.rb @@ -43,6 +43,15 @@ def update end end + def destroy + evidence = Evidence.find(params[:id]) + if evidence.destroy + render json: { success: true, message: "Evidence deleted." } + else + render json: { success: false, errors: evidence.errors.full_messages }, status: :unprocessable_entity + end + end + private def evidence_params diff --git a/app/controllers/admin/promises_controller.rb b/app/controllers/admin/promises_controller.rb index 60f6bf2..470a394 100644 --- a/app/controllers/admin/promises_controller.rb +++ b/app/controllers/admin/promises_controller.rb @@ -40,6 +40,15 @@ def update end end + def destroy + promise = Promise.find(params[:id]) + if promise.destroy + render json: { success: true, message: "Promise deleted." } + else + render json: { success: false, errors: promise.errors.full_messages }, status: :unprocessable_entity + end + end + private def promise_params diff --git a/config/routes.rb b/config/routes.rb index fba9497..fee9fd5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,8 +19,8 @@ resources :evidences, only: [ :index, :show ] namespace :admin do - resources :promises, only: [:index, :show, :update] - resources :evidence, only: [:index, :show, :update] + resources :promises, only: [:index, :show, :update, :destroy] + resources :evidence, only: [:index, :show, :update, :destroy] end # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html From 1909518504e996c2cc98a45c69908be759d9a143 Mon Sep 17 00:00:00 2001 From: verrixkio Date: Wed, 18 Jun 2025 14:00:52 -0600 Subject: [PATCH 04/10] prepare departments controller for transition, rack-cors gem, db schema update --- Gemfile.lock | 4 ++++ app/controllers/departments_controller.rb | 5 ++--- db/schema.rb | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 30ad043..6dc8c51 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -293,6 +293,9 @@ GEM raabro (1.4.0) racc (1.8.1) rack (3.1.16) + rack-cors (3.0.0) + logger + rack (>= 3.0.14) rack-session (2.1.1) base64 (>= 0.1.0) rack (>= 3.0.0) @@ -435,6 +438,7 @@ DEPENDENCIES pg (~> 1.1) propshaft (~> 1.1) puma (>= 5.0) + rack-cors rails (~> 8.0.2) rubocop-rails-omakase ruby_llm (~> 1.3)! diff --git a/app/controllers/departments_controller.rb b/app/controllers/departments_controller.rb index e6f2ea9..2046673 100644 --- a/app/controllers/departments_controller.rb +++ b/app/controllers/departments_controller.rb @@ -3,9 +3,8 @@ class DepartmentsController < ApplicationController # GET /departments` def index - @departments = Department.all - - render json: @departments + @departments = Department.order(:display_name) + render json: @departments.as_json(only: [:id, :display_name, :slug, :priority, :official_name]) end # GET /departments/1 diff --git a/db/schema.rb b/db/schema.rb index 94df139..5620703 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -131,6 +131,7 @@ t.string "url" t.datetime "last_scraped", precision: nil t.jsonb "raw" + t.string "source_url" t.bigint "government_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false From 736a88f5941e3509e26a6a0ed091acf0e9c07f64 Mon Sep 17 00:00:00 2001 From: verrixkio Date: Wed, 18 Jun 2025 15:41:57 -0600 Subject: [PATCH 05/10] update promise controller to return proper data format for frontend component --- app/controllers/admin/promises_controller.rb | 83 +++++++++----------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/app/controllers/admin/promises_controller.rb b/app/controllers/admin/promises_controller.rb index 470a394..f7f05ac 100644 --- a/app/controllers/admin/promises_controller.rb +++ b/app/controllers/admin/promises_controller.rb @@ -1,58 +1,47 @@ module Admin class PromisesController < ApplicationController def index - promises = Promise.all + base_query = Promise.all + + # Server-side filters like Firestore + base_query = base_query.where(party_code: params[:party_code]) if params[:party_code].present? + base_query = base_query.where(region_code: params[:region_code]) if params[:region_code].present? + base_query = base_query.where(parliament_session_id: params[:parliament_session_id]) if params[:parliament_session_id].present? + base_query = base_query.where(source_type: params[:source_type]) if params[:source_type].present? && params[:source_type] != 'all' + + if params[:bc_promise_rank].present? + if params[:bc_promise_rank] == 'none' + base_query = base_query.where(bc_promise_rank: nil) + elsif params[:bc_promise_rank] != 'all' + base_query = base_query.where(bc_promise_rank: params[:bc_promise_rank]) + end + end + # Client-side searchText logic (optional to move here) if params[:search].present? query = "%#{params[:search]}%" - promises = promises.where("title ILIKE :q OR description ILIKE :q", q: query) - end - - promises = promises.order(created_at: :desc) - .limit(params[:limit] || 25) - .offset(params[:offset] || 0) - - render json: { - data: promises.as_json(only: [:id, :title, :description, :status], methods: [:evidence_ids]), - meta: { - total: promises.count - } - } - end - - def show - promise = Promise.find(params[:id]) - render json: promise.as_json(include: { evidence: { only: [:id, :title, :source_url] } }) - end - - def update - promise = Promise.find(params[:id]) - - if params[:promise][:evidence_ids].present? - merged_ids = (promise.evidence_ids + params[:promise][:evidence_ids].map(&:to_i)).uniq - promise.evidence_ids = merged_ids - end - - if promise.update(promise_params.except(:evidence_ids)) - render json: { success: true, data: promise } - else - render json: { success: false, errors: promise.errors.full_messages }, status: :unprocessable_entity - end - end - - def destroy - promise = Promise.find(params[:id]) - if promise.destroy - render json: { success: true, message: "Promise deleted." } - else - render json: { success: false, errors: promise.errors.full_messages }, status: :unprocessable_entity + base_query = base_query.where("title ILIKE :q OR description ILIKE :q", q: query) end - end - - private - def promise_params - params.require(:promise).permit! + total = base_query.count + promises = base_query.order(created_at: :desc) + .limit(params[:limit] || 25) + .offset(params[:offset] || 0) + + render json: { + data: promises.as_json(only: [ + :id, + :text, + :source_type, + :bc_promise_rank, + :bc_promise_direction, + :responsible_department_lead, + :progress_score, + :status, + :evidence_ids + ]), + meta: { total: total } + } end end end From de3f48737ebb4ac5ea4180e2ed383f05029aef41 Mon Sep 17 00:00:00 2001 From: verrixkio Date: Fri, 20 Jun 2025 01:46:03 -0600 Subject: [PATCH 06/10] update promises controller to return all fields needed for the promise interface on frontend. --- app/controllers/admin/promises_controller.rb | 44 +++++++++++++------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/app/controllers/admin/promises_controller.rb b/app/controllers/admin/promises_controller.rb index f7f05ac..aaa5ebc 100644 --- a/app/controllers/admin/promises_controller.rb +++ b/app/controllers/admin/promises_controller.rb @@ -28,20 +28,36 @@ def index .limit(params[:limit] || 25) .offset(params[:offset] || 0) - render json: { - data: promises.as_json(only: [ - :id, - :text, - :source_type, - :bc_promise_rank, - :bc_promise_direction, - :responsible_department_lead, - :progress_score, - :status, - :evidence_ids - ]), - meta: { total: total } - } + render json: { + data: promises.as_json(only: [ + :id, + :text, + :source_type, + :bc_promise_rank, + :bc_promise_direction, + :bc_promise_rank_rationale, + :parliament_session_id, + :responsible_department_lead, + :reporting_lead_title, + :category, + :date_issued, + :progress_score, + :progress_summary, + :concise_title, + :description, + :what_it_means_for_canadians, + :intended_impact_and_objectives, + :background_and_context, + :region_code, + :party_code, + :status, + :deleted_at, + :deleted_by_admin, + :department, + :evidence_ids + ]), + meta: { total: total } + } end end end From bea3d6156e9d8f5cf36a5777f4a1a10843cac564 Mon Sep 17 00:00:00 2001 From: verrixkio Date: Fri, 20 Jun 2025 02:39:31 -0600 Subject: [PATCH 07/10] enable PUT path for promises and update model --- app/controllers/admin/promises_controller.rb | 122 ++++++++++--------- app/models/promise.rb | 31 +++++ config/initializers/cors.rb | 2 +- 3 files changed, 98 insertions(+), 57 deletions(-) diff --git a/app/controllers/admin/promises_controller.rb b/app/controllers/admin/promises_controller.rb index aaa5ebc..2e2d17a 100644 --- a/app/controllers/admin/promises_controller.rb +++ b/app/controllers/admin/promises_controller.rb @@ -1,63 +1,73 @@ module Admin - class PromisesController < ApplicationController - def index - base_query = Promise.all - - # Server-side filters like Firestore - base_query = base_query.where(party_code: params[:party_code]) if params[:party_code].present? - base_query = base_query.where(region_code: params[:region_code]) if params[:region_code].present? - base_query = base_query.where(parliament_session_id: params[:parliament_session_id]) if params[:parliament_session_id].present? - base_query = base_query.where(source_type: params[:source_type]) if params[:source_type].present? && params[:source_type] != 'all' - - if params[:bc_promise_rank].present? - if params[:bc_promise_rank] == 'none' - base_query = base_query.where(bc_promise_rank: nil) - elsif params[:bc_promise_rank] != 'all' - base_query = base_query.where(bc_promise_rank: params[:bc_promise_rank]) - end - end + class PromisesController < ApplicationController + skip_before_action :verify_authenticity_token + def index + base_query = Promise.all + + base_query = base_query.where(party_code: params[:party_code]) if params[:party_code].present? + base_query = base_query.where(region_code: params[:region_code]) if params[:region_code].present? + base_query = base_query.where(parliament_session_id: params[:parliament_session_id]) if params[:parliament_session_id].present? + base_query = base_query.where(source_type: params[:source_type]) if params[:source_type].present? && params[:source_type] != 'all' - # Client-side searchText logic (optional to move here) - if params[:search].present? - query = "%#{params[:search]}%" - base_query = base_query.where("title ILIKE :q OR description ILIKE :q", q: query) + if params[:bc_promise_rank].present? + if params[:bc_promise_rank] == 'none' + base_query = base_query.where(bc_promise_rank: nil) + elsif params[:bc_promise_rank] != 'all' + base_query = base_query.where(bc_promise_rank: params[:bc_promise_rank]) end + end + + if params[:search].present? + query = "%#{params[:search]}%" + base_query = base_query.where("title ILIKE :q OR description ILIKE :q", q: query) + end + + total = base_query.count + promises = base_query.order(created_at: :desc) + .limit(params[:limit] || 25) + .offset(params[:offset] || 0) + + render json: { + data: promises.as_json(only: Promise.client_fields), + meta: { total: total } + } + end + + def update + promise = Promise.find(params[:id]) + puts "\nšŸ”§ Updating Promise ID: #{promise.id}" + puts "āž”ļø Incoming Params: #{params.to_unsafe_h.slice(*Promise.client_fields.map(&:to_s))}" + + if promise.update(promise_params) + puts "āœ… Update Successful" + render json: { success: true, data: promise.as_json(only: Promise.client_fields) } + else + puts "āŒ Update Failed: #{promise.errors.full_messages.join(', ')}" + render json: { success: false, errors: promise.errors.full_messages }, status: :unprocessable_entity + end + end + + private + + def promise_params + params.permit(*Promise.client_fields - [:id]) + end + + def destroy + promise = Promise.find(params[:id]) + puts "šŸ—‘ļø Soft deleting promise #{promise.id}" - total = base_query.count - promises = base_query.order(created_at: :desc) - .limit(params[:limit] || 25) - .offset(params[:offset] || 0) - - render json: { - data: promises.as_json(only: [ - :id, - :text, - :source_type, - :bc_promise_rank, - :bc_promise_direction, - :bc_promise_rank_rationale, - :parliament_session_id, - :responsible_department_lead, - :reporting_lead_title, - :category, - :date_issued, - :progress_score, - :progress_summary, - :concise_title, - :description, - :what_it_means_for_canadians, - :intended_impact_and_objectives, - :background_and_context, - :region_code, - :party_code, - :status, - :deleted_at, - :deleted_by_admin, - :department, - :evidence_ids - ]), - meta: { total: total } - } + if promise.update( + status: 'deleted', + deleted_at: Time.current, + deleted_by_admin: 'admin' # You can replace this with current_user.id when auth is implemented + ) + puts "āœ… Soft delete successful" + render json: { success: true, message: "Promise soft deleted", id: promise.id } + else + puts "āŒ Soft delete failed: #{promise.errors.full_messages.join(', ')}" + render json: { success: false, errors: promise.errors.full_messages }, status: :unprocessable_entity end end end +end diff --git a/app/models/promise.rb b/app/models/promise.rb index da77f54..b795c23 100644 --- a/app/models/promise.rb +++ b/app/models/promise.rb @@ -10,4 +10,35 @@ def format_for_llm description: description } end + + def self.client_fields + [ + :id, + :text, + :source_type, + :bc_promise_rank, + :bc_promise_direction, + :bc_promise_rank_rationale, + :parliament_session_id, + :responsible_department_lead, + :reporting_lead_title, + :category, + :date_issued, + :progress_score, + :progress_summary, + :concise_title, + :description, + :what_it_means_for_canadians, + :intended_impact_and_objectives, + :background_and_context, + :region_code, + :party_code, + :status, + :deleted_at, + :deleted_by_admin, + :department, + :evidence_ids + ] + end + end diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb index dc5ac8e..cebef50 100644 --- a/config/initializers/cors.rb +++ b/config/initializers/cors.rb @@ -7,7 +7,7 @@ Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do - origins "https://www.buildcanada.com" + origins 'http://localhost:3001', "https://www.buildcanada.com" resource "*", headers: :any, From 3e1e1fdc6f477a18523daa7377cedb9aaaad1158 Mon Sep 17 00:00:00 2001 From: verrixkio Date: Fri, 20 Jun 2025 02:56:40 -0600 Subject: [PATCH 08/10] update more model fields to support promise editing --- app/models/promise.rb | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/app/models/promise.rb b/app/models/promise.rb index b795c23..c2f64a9 100644 --- a/app/models/promise.rb +++ b/app/models/promise.rb @@ -11,34 +11,50 @@ def format_for_llm } end - def self.client_fields + def self.client_fields [ :id, :text, - :source_type, + :concise_title, + :description, + :bc_promise_rank, :bc_promise_direction, :bc_promise_rank_rationale, - :parliament_session_id, + :source_type, + :responsible_department_lead, :reporting_lead_title, :category, + :parliament_session_id, :date_issued, + :status, + :progress_score, :progress_summary, - :concise_title, - :description, + :what_it_means_for_canadians, :intended_impact_and_objectives, :background_and_context, + + :linked_evidence_ids, + :commitment_history_rationale, + :region_code, :party_code, - :status, :deleted_at, :deleted_by_admin, :department, - :evidence_ids + :evidence_ids, + + # Read-only fields + :region_code, + :party_code, + :migration_metadata, + :ingested_at, + :explanation_enriched_at, + :linking_preprocessing_done_at ] end - + end From 81f9fd8683685681976e804c00606b26da794d6c Mon Sep 17 00:00:00 2001 From: verrixkio Date: Fri, 20 Jun 2025 03:04:22 -0600 Subject: [PATCH 09/10] add promises destroy path --- app/controllers/admin/promises_controller.rb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/controllers/admin/promises_controller.rb b/app/controllers/admin/promises_controller.rb index 2e2d17a..40b25d1 100644 --- a/app/controllers/admin/promises_controller.rb +++ b/app/controllers/admin/promises_controller.rb @@ -47,20 +47,12 @@ def update end end - private - - def promise_params - params.permit(*Promise.client_fields - [:id]) - end - def destroy promise = Promise.find(params[:id]) puts "šŸ—‘ļø Soft deleting promise #{promise.id}" if promise.update( status: 'deleted', - deleted_at: Time.current, - deleted_by_admin: 'admin' # You can replace this with current_user.id when auth is implemented ) puts "āœ… Soft delete successful" render json: { success: true, message: "Promise soft deleted", id: promise.id } @@ -69,5 +61,12 @@ def destroy render json: { success: false, errors: promise.errors.full_messages }, status: :unprocessable_entity end end + + private + + def promise_params + params.permit(*Promise.client_fields - [:id]) + end + end end From 924ba0a841c26bd9e54eedb1b765c7ed25ff2edd Mon Sep 17 00:00:00 2001 From: verrixkio Date: Fri, 20 Jun 2025 03:53:24 -0600 Subject: [PATCH 10/10] linting --- app/controllers/admin/evidence_controller.rb | 4 ++-- app/controllers/admin/promises_controller.rb | 11 +++++------ app/controllers/departments_controller.rb | 2 +- app/models/activity_extractor.rb | 2 +- app/models/promise.rb | 1 - config/initializers/cors.rb | 4 ++-- config/routes.rb | 4 ++-- 7 files changed, 13 insertions(+), 15 deletions(-) diff --git a/app/controllers/admin/evidence_controller.rb b/app/controllers/admin/evidence_controller.rb index 9d6f048..503e1c9 100644 --- a/app/controllers/admin/evidence_controller.rb +++ b/app/controllers/admin/evidence_controller.rb @@ -21,7 +21,7 @@ def index .offset(params[:offset] || 0) render json: { - data: evidences.as_json(only: [:id, :title, :description, :source_url, :parliament_session_id]), + data: evidences.as_json(only: [ :id, :title, :description, :source_url, :parliament_session_id ]), meta: { total: evidences.count } @@ -30,7 +30,7 @@ def index def show evidence = Evidence.find(params[:id]) - render json: evidence.as_json(include: { promises: { only: [:id, :title] } }) + render json: evidence.as_json(include: { promises: { only: [ :id, :title ] } }) end def update diff --git a/app/controllers/admin/promises_controller.rb b/app/controllers/admin/promises_controller.rb index 40b25d1..1e608d1 100644 --- a/app/controllers/admin/promises_controller.rb +++ b/app/controllers/admin/promises_controller.rb @@ -7,12 +7,12 @@ def index base_query = base_query.where(party_code: params[:party_code]) if params[:party_code].present? base_query = base_query.where(region_code: params[:region_code]) if params[:region_code].present? base_query = base_query.where(parliament_session_id: params[:parliament_session_id]) if params[:parliament_session_id].present? - base_query = base_query.where(source_type: params[:source_type]) if params[:source_type].present? && params[:source_type] != 'all' + base_query = base_query.where(source_type: params[:source_type]) if params[:source_type].present? && params[:source_type] != "all" if params[:bc_promise_rank].present? - if params[:bc_promise_rank] == 'none' + if params[:bc_promise_rank] == "none" base_query = base_query.where(bc_promise_rank: nil) - elsif params[:bc_promise_rank] != 'all' + elsif params[:bc_promise_rank] != "all" base_query = base_query.where(bc_promise_rank: params[:bc_promise_rank]) end end @@ -52,7 +52,7 @@ def destroy puts "šŸ—‘ļø Soft deleting promise #{promise.id}" if promise.update( - status: 'deleted', + status: "deleted", ) puts "āœ… Soft delete successful" render json: { success: true, message: "Promise soft deleted", id: promise.id } @@ -65,8 +65,7 @@ def destroy private def promise_params - params.permit(*Promise.client_fields - [:id]) + params.permit(*Promise.client_fields - [ :id ]) end - end end diff --git a/app/controllers/departments_controller.rb b/app/controllers/departments_controller.rb index 2046673..0252f42 100644 --- a/app/controllers/departments_controller.rb +++ b/app/controllers/departments_controller.rb @@ -4,7 +4,7 @@ class DepartmentsController < ApplicationController # GET /departments` def index @departments = Department.order(:display_name) - render json: @departments.as_json(only: [:id, :display_name, :slug, :priority, :official_name]) + render json: @departments.as_json(only: [ :id, :display_name, :slug, :priority, :official_name ]) end # GET /departments/1 diff --git a/app/models/activity_extractor.rb b/app/models/activity_extractor.rb index 8db437c..8fdf31a 100644 --- a/app/models/activity_extractor.rb +++ b/app/models/activity_extractor.rb @@ -29,7 +29,7 @@ def prompt(promises, entry) If no relevant activities are found in the political artifact, state this clearly in your response. Do not mention the promise_id in your impact_reasoning. - + Try to minimize the number of activities listed, they should be combined if they are similar enough to avoid redundancy. Remember to focus only on activities that could potentially impact the government's progress on their promises. Do not include unrelated information or speculate beyond what is reasonably implied by the artifact. diff --git a/app/models/promise.rb b/app/models/promise.rb index c2f64a9..56a3d9c 100644 --- a/app/models/promise.rb +++ b/app/models/promise.rb @@ -56,5 +56,4 @@ def self.client_fields :linking_preprocessing_done_at ] end - end diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb index cebef50..a5e8ac8 100644 --- a/config/initializers/cors.rb +++ b/config/initializers/cors.rb @@ -7,10 +7,10 @@ Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do - origins 'http://localhost:3001', "https://www.buildcanada.com" + origins "http://localhost:3001", "https://www.buildcanada.com" resource "*", headers: :any, - methods: [:get, :post, :put, :patch, :delete, :options, :head] + methods: [ :get, :post, :put, :patch, :delete, :options, :head ] end end diff --git a/config/routes.rb b/config/routes.rb index fee9fd5..62b3a15 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,8 +19,8 @@ resources :evidences, only: [ :index, :show ] namespace :admin do - resources :promises, only: [:index, :show, :update, :destroy] - resources :evidence, only: [:index, :show, :update, :destroy] + resources :promises, only: [ :index, :show, :update, :destroy ] + resources :evidence, only: [ :index, :show, :update, :destroy ] end # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html