Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)!
Expand Down
61 changes: 61 additions & 0 deletions app/controllers/admin/evidence_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
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

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
params.require(:evidence).permit(:title, :description, :source_url, :parliament_session_id, promise_ids: [])
end
end
end
71 changes: 71 additions & 0 deletions app/controllers/admin/promises_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
module Admin
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"

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

def destroy
promise = Promise.find(params[:id])
puts "🗑️ Soft deleting promise #{promise.id}"

if promise.update(
status: "deleted",
)
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

private

def promise_params
params.permit(*Promise.client_fields - [ :id ])
end
end
end
5 changes: 2 additions & 3 deletions app/controllers/departments_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions app/helpers/admin/evidence_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module Admin::EvidenceHelper
end
2 changes: 2 additions & 0 deletions app/helpers/admin/promises_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module Admin::PromisesHelper
end
2 changes: 1 addition & 1 deletion app/models/activity_extractor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
46 changes: 46 additions & 0 deletions app/models/promise.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,50 @@ def format_for_llm
description: description
}
end

def self.client_fields
[
:id,
:text,
:concise_title,
:description,

:bc_promise_rank,
:bc_promise_direction,
:bc_promise_rank_rationale,
:source_type,

:responsible_department_lead,
:reporting_lead_title,
:category,
:parliament_session_id,
:date_issued,
:status,

:progress_score,
:progress_summary,

:what_it_means_for_canadians,
:intended_impact_and_objectives,
:background_and_context,

:linked_evidence_ids,
:commitment_history_rationale,

:region_code,
:party_code,
:deleted_at,
:deleted_by_admin,
:department,
:evidence_ids,

# Read-only fields
:region_code,
:party_code,
:migration_metadata,
:ingested_at,
:explanation_enriched_at,
:linking_preprocessing_done_at
]
end
end
18 changes: 9 additions & 9 deletions config/initializers/cors.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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 "http://localhost:3001", "https://www.buildcanada.com"

resource "*",
headers: :any,
methods: [ :get, :post, :put, :patch, :delete, :options, :head ]
end
end
5 changes: 5 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
resources :promises, only: [ :index, :show ]
resources :evidences, only: [ :index, :show ]

namespace :admin do
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

# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
Expand Down
1 change: 1 addition & 0 deletions db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions test/controllers/admin/evidence_controller_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
require "test_helper"

class Admin::EvidenceControllerTest < ActionDispatch::IntegrationTest
# test "the truth" do
# assert true
# end
end
7 changes: 7 additions & 0 deletions test/controllers/admin/promises_controller_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
require "test_helper"

class Admin::PromisesControllerTest < ActionDispatch::IntegrationTest
# test "the truth" do
# assert true
# end
end
Loading