Skip to content

Commit 00bbdcd

Browse files
authored
Add search query metrics (#948)
## Summary - add SearchQuery model for tracking queries and result counts - enqueue TrackSearchQueryJob from new controller endpoint - record metrics via migration, routes, translations, and schema updates ## Testing - `bundle exec rubocop` - `bundle exec brakeman -q -w2` - `bundle exec bundler-audit --update` - `DATABASE_URL=postgres://postgres:postgres@localhost/community_engine_test bin/ci` ------ https://chatgpt.com/codex/tasks/task_e_68927bf5b70c83219ef3866a53847d82
2 parents dc4f6ae + b58d9de commit 00bbdcd

File tree

12 files changed

+122
-2
lines changed

12 files changed

+122
-2
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
module BetterTogether
4+
module Metrics
5+
class SearchQueriesController < ApplicationController # rubocop:todo Style/Documentation
6+
def create
7+
query = params[:query]
8+
results_count = params[:results_count]
9+
locale = I18n.locale.to_s
10+
11+
if query.blank? || results_count.blank?
12+
render json: { error: I18n.t('metrics.search_queries.invalid_parameters') },
13+
status: :unprocessable_entity and return
14+
end
15+
16+
BetterTogether::Metrics::TrackSearchQueryJob.perform_later(query, results_count.to_i, locale)
17+
18+
render json: { success: true }, status: :ok
19+
end
20+
end
21+
end
22+
end
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
3+
module BetterTogether
4+
module Metrics
5+
class TrackSearchQueryJob < MetricsJob # rubocop:todo Style/Documentation
6+
def perform(query, results_count, locale)
7+
BetterTogether::Metrics::SearchQuery.create!(
8+
query: query,
9+
results_count: results_count,
10+
locale: locale,
11+
searched_at: Time.current
12+
)
13+
end
14+
end
15+
end
16+
end
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# frozen_string_literal: true
2+
3+
module BetterTogether
4+
module Metrics
5+
class SearchQuery < ApplicationRecord # rubocop:todo Style/Documentation
6+
validates :query, presence: true
7+
validates :results_count, presence: true, numericality: { greater_than_or_equal_to: 0 }
8+
validates :locale, presence: true, inclusion: { in: I18n.available_locales.map(&:to_s) }
9+
validates :searched_at, presence: true
10+
end
11+
end
12+
end

config/locales/en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,8 @@ en:
13371337
metrics:
13381338
shares:
13391339
invalid_parameters: Invalid parameters
1340+
search_queries:
1341+
invalid_parameters: Invalid parameters for search tracking.
13401342
navbar:
13411343
accept_invitation: Accept invitation
13421344
conversations: Conversations

config/locales/es.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,6 +1331,8 @@ es:
13311331
metrics:
13321332
shares:
13331333
invalid_parameters: Parámetros inválidos
1334+
search_queries:
1335+
invalid_parameters: Parámetros inválidos para el seguimiento de búsqueda.
13341336
navbar:
13351337
accept_invitation: Aceptar invitación
13361338
conversations: Conversaciones

config/locales/fr.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,8 @@ fr:
13571357
metrics:
13581358
shares:
13591359
invalid_parameters: Paramètres non valides
1360+
search_queries:
1361+
invalid_parameters: Paramètres non valides pour le suivi de la recherche.
13601362
navbar:
13611363
accept_invitation: Accepter l'invitation
13621364
conversations: Conversations

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@
163163
resources :link_clicks, only: [:create]
164164
resources :page_views, only: [:create]
165165
resources :shares, only: [:create]
166+
resources :search_queries, only: [:create]
166167
end
167168

168169
resources :wizards, only: [:show] do

db/community-engine-db.dbml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,17 @@ Table "better_together_metrics_shares" {
414414
"shareable_id" uuid
415415
}
416416

417+
Table "better_together_metrics_search_queries" {
418+
"id" varchar
419+
"lock_version" integer
420+
"created_at" datetime
421+
"updated_at" datetime
422+
"locale" string
423+
"query" string
424+
"results_count" integer
425+
"searched_at" datetime
426+
}
427+
417428
Table "better_together_navigation_areas" {
418429
"id" varchar
419430
"lock_version" integer
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# frozen_string_literal: true
2+
3+
class CreateBetterTogetherMetricsSearchQueries < ActiveRecord::Migration[7.1] # rubocop:todo Style/Documentation
4+
def change
5+
create_bt_table :search_queries, prefix: :better_together_metrics do |t|
6+
t.bt_locale
7+
t.string :query, null: false
8+
t.integer :results_count, null: false
9+
t.datetime :searched_at, null: false
10+
end
11+
end
12+
end

spec/dummy/db/schema.rb

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,9 +419,9 @@
419419
t.string "locale", limit: 5, default: "en", null: false
420420
t.string "privacy", limit: 50, default: "private", null: false
421421
t.boolean "protected", default: false, null: false
422-
t.geography "center", limit: {srid: 4326, type: "st_point", geographic: true}
422+
t.geography "center", limit: { srid: 4326, type: "st_point", geographic: true }
423423
t.integer "zoom", default: 13, null: false
424-
t.geography "viewport", limit: {srid: 4326, type: "st_polygon", geographic: true}
424+
t.geography "viewport", limit: { srid: 4326, type: "st_polygon", geographic: true }
425425
t.jsonb "metadata", default: {}, null: false
426426
t.string "mappable_type"
427427
t.uuid "mappable_id"
@@ -743,6 +743,17 @@
743743
t.index ["shareable_type", "shareable_id"], name: "index_better_together_metrics_shares_on_shareable"
744744
end
745745

746+
create_table "better_together_metrics_search_queries", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
747+
t.integer "lock_version", default: 0, null: false
748+
t.datetime "created_at", null: false
749+
t.datetime "updated_at", null: false
750+
t.string "locale", limit: 5, default: "en", null: false
751+
t.string "query", null: false
752+
t.integer "results_count", null: false
753+
t.datetime "searched_at", null: false
754+
t.index ["locale"], name: "by_better_together_metrics_search_queries_locale"
755+
end
756+
746757
create_table "better_together_navigation_areas", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
747758
t.integer "lock_version", default: 0, null: false
748759
t.datetime "created_at", null: false

0 commit comments

Comments
 (0)