From 03d80d17eb8be0f25121c50dbf95d37199916bfb Mon Sep 17 00:00:00 2001 From: "wizard-ci-bot[bot]" <254716194+wizard-ci-bot[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 16:55:22 +0000 Subject: [PATCH] wizard-ci: rails/fizzy --- apps/basic-integration/rails/fizzy/.gitignore | 1 + apps/basic-integration/rails/fizzy/Gemfile | 4 +++ .../account/cancellations_controller.rb | 6 ++++ .../controllers/account/exports_controller.rb | 6 ++++ .../controllers/account/imports_controller.rb | 5 ++++ .../app/controllers/application_controller.rb | 5 ++++ .../boards/publications_controller.rb | 10 +++++++ .../app/controllers/boards_controller.rb | 6 ++++ .../controllers/cards/comments_controller.rb | 5 ++++ .../controllers/cards/publishes_controller.rb | 6 ++++ .../fizzy/app/controllers/cards_controller.rb | 13 +++++++++ .../my/access_tokens_controller.rb | 12 ++++++++ .../sessions/magic_links_controller.rb | 11 +++++++ .../signups/completions_controller.rb | 5 ++++ .../rails/fizzy/app/models/identity.rb | 8 +++++ .../fizzy/config/initializers/posthog.rb | 29 +++++++++++++++++++ 16 files changed, 132 insertions(+) create mode 100644 apps/basic-integration/rails/fizzy/config/initializers/posthog.rb diff --git a/apps/basic-integration/rails/fizzy/.gitignore b/apps/basic-integration/rails/fizzy/.gitignore index 38bd80d0d..649280ae7 100644 --- a/apps/basic-integration/rails/fizzy/.gitignore +++ b/apps/basic-integration/rails/fizzy/.gitignore @@ -41,3 +41,4 @@ /config/credentials/*.key .DS_Store +.env diff --git a/apps/basic-integration/rails/fizzy/Gemfile b/apps/basic-integration/rails/fizzy/Gemfile index 882ecb266..154066eb2 100644 --- a/apps/basic-integration/rails/fizzy/Gemfile +++ b/apps/basic-integration/rails/fizzy/Gemfile @@ -37,6 +37,10 @@ gem "zip_kit" gem "mittens" gem "useragent", bc: "useragent" +# PostHog analytics and Rails instrumentation +gem "posthog-ruby", "~> 3.0" +gem "posthog-rails" + # Operations gem "autotuner" gem "mission_control-jobs" diff --git a/apps/basic-integration/rails/fizzy/app/controllers/account/cancellations_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/account/cancellations_controller.rb index b6ac82ab4..8e9d8b9b2 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/account/cancellations_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/account/cancellations_controller.rb @@ -3,6 +3,12 @@ class Account::CancellationsController < ApplicationController def create Current.account.cancel + + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "account_cancelled" + ) + redirect_to session_menu_path(script_name: nil), notice: "Account deleted" end diff --git a/apps/basic-integration/rails/fizzy/app/controllers/account/exports_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/account/exports_controller.rb index dbe0a11c1..387b36ab4 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/account/exports_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/account/exports_controller.rb @@ -10,6 +10,12 @@ def show def create Current.account.exports.create!(user: Current.user).build_later + + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "account_export_requested" + ) + redirect_to account_settings_path, notice: "Export started. You'll receive an email when it's ready." end diff --git a/apps/basic-integration/rails/fizzy/app/controllers/account/imports_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/account/imports_controller.rb index 1a62f83a0..631520d57 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/account/imports_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/account/imports_controller.rb @@ -39,6 +39,11 @@ def start_import(account) import.process_later end + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "account_import_started" + ) + redirect_to account_import_path(import, script_name: account.slug) end end diff --git a/apps/basic-integration/rails/fizzy/app/controllers/application_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/application_controller.rb index 87c3ab8dd..18fa191a9 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/application_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/application_controller.rb @@ -10,4 +10,9 @@ class ApplicationController < ActionController::Base etag { "v1" } stale_when_importmap_changes allow_browser versions: :modern + + private + def current_identity + Current.identity + end end diff --git a/apps/basic-integration/rails/fizzy/app/controllers/boards/publications_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/boards/publications_controller.rb index 9435bd8bf..484686469 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/boards/publications_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/boards/publications_controller.rb @@ -5,10 +5,20 @@ class Boards::PublicationsController < ApplicationController def create @board.publish + + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "board_published" + ) end def destroy @board.unpublish @board.reload + + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "board_unpublished" + ) end end diff --git a/apps/basic-integration/rails/fizzy/app/controllers/boards_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/boards_controller.rb index a8284b309..16bbb0887 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/boards_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/boards_controller.rb @@ -28,6 +28,12 @@ def new def create @board = Board.create! board_params.with_defaults(all_access: true) + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "board_created", + properties: { all_access: @board.all_access } + ) + respond_to do |format| format.html { redirect_to board_path(@board) } format.json { head :created, location: board_path(@board, format: :json) } diff --git a/apps/basic-integration/rails/fizzy/app/controllers/cards/comments_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/cards/comments_controller.rb index f2b318813..2a0c1bee2 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/cards/comments_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/cards/comments_controller.rb @@ -12,6 +12,11 @@ def index def create @comment = @card.comments.create!(comment_params) + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "comment_created" + ) + respond_to do |format| format.turbo_stream format.json { head :created, location: card_comment_path(@card, @comment, format: :json) } diff --git a/apps/basic-integration/rails/fizzy/app/controllers/cards/publishes_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/cards/publishes_controller.rb index a0378eec3..e15d85e7c 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/cards/publishes_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/cards/publishes_controller.rb @@ -4,6 +4,12 @@ class Cards::PublishesController < ApplicationController def create @card.publish + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "card_published", + properties: { add_another: add_another_param? } + ) + if add_another_param? card = @board.cards.create!(status: :drafted) redirect_to card_draft_path(card), notice: "Card added" diff --git a/apps/basic-integration/rails/fizzy/app/controllers/cards_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/cards_controller.rb index e007527b8..673066a20 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/cards_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/cards_controller.rb @@ -14,11 +14,24 @@ def create respond_to do |format| format.html do card = Current.user.draft_new_card_in(@board) + + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "card_draft_started" + ) + redirect_to card_draft_path(card) end format.json do card = @board.cards.create! card_params.merge(creator: Current.user, status: "published") + + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "card_created", + properties: { creation_method: "api" } + ) + head :created, location: card_path(card, format: :json) end end diff --git a/apps/basic-integration/rails/fizzy/app/controllers/my/access_tokens_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/my/access_tokens_controller.rb index 99c87893f..c5ecd546b 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/my/access_tokens_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/my/access_tokens_controller.rb @@ -17,11 +17,23 @@ def create access_token = my_access_tokens.create!(access_token_params) expiring_id = verifier.generate access_token.id, expires_in: 10.seconds + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "access_token_created", + properties: { permission: access_token.permission } + ) + redirect_to my_access_token_path(expiring_id) end def destroy my_access_tokens.find(params[:id]).destroy! + + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "access_token_revoked" + ) + redirect_to my_access_tokens_path end diff --git a/apps/basic-integration/rails/fizzy/app/controllers/sessions/magic_links_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/sessions/magic_links_controller.rb index d2b25594c..f4a7b1bbb 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/sessions/magic_links_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/sessions/magic_links_controller.rb @@ -44,6 +44,17 @@ def sign_in(magic_link) clear_pending_authentication_token start_new_session_for magic_link.identity + PostHog.identify( + distinct_id: magic_link.identity.posthog_distinct_id, + properties: magic_link.identity.posthog_properties + ) + + PostHog.capture( + distinct_id: magic_link.identity.posthog_distinct_id, + event: "magic_link_signed_in", + properties: { requires_signup_completion: requires_signup_completion?(magic_link) } + ) + respond_to do |format| format.html { redirect_to after_sign_in_url(magic_link) } format.json { render json: { session_token: session_token, requires_signup_completion: requires_signup_completion?(magic_link) } } diff --git a/apps/basic-integration/rails/fizzy/app/controllers/signups/completions_controller.rb b/apps/basic-integration/rails/fizzy/app/controllers/signups/completions_controller.rb index 0d45f2f8a..2ba7e7fbb 100644 --- a/apps/basic-integration/rails/fizzy/app/controllers/signups/completions_controller.rb +++ b/apps/basic-integration/rails/fizzy/app/controllers/signups/completions_controller.rb @@ -23,6 +23,11 @@ def signup_params end def welcome_to_account + PostHog.capture( + distinct_id: Current.identity.posthog_distinct_id, + event: "signup_completed" + ) + respond_to do |format| format.html do flash[:welcome_letter] = true diff --git a/apps/basic-integration/rails/fizzy/app/models/identity.rb b/apps/basic-integration/rails/fizzy/app/models/identity.rb index 7495e37c3..7713fc948 100644 --- a/apps/basic-integration/rails/fizzy/app/models/identity.rb +++ b/apps/basic-integration/rails/fizzy/app/models/identity.rb @@ -28,6 +28,14 @@ def send_magic_link(**attributes) end end + def posthog_distinct_id + id.to_s + end + + def posthog_properties + { email: email_address } + end + private def deactivate_users users.find_each(&:deactivate) diff --git a/apps/basic-integration/rails/fizzy/config/initializers/posthog.rb b/apps/basic-integration/rails/fizzy/config/initializers/posthog.rb new file mode 100644 index 000000000..7d31881ab --- /dev/null +++ b/apps/basic-integration/rails/fizzy/config/initializers/posthog.rb @@ -0,0 +1,29 @@ +require "posthog" + +api_key = ENV.fetch("POSTHOG_PROJECT_TOKEN", nil) +host = ENV.fetch("POSTHOG_HOST", nil) + +if Rails.env.development? + if api_key.blank? + raise "POSTHOG_PROJECT_TOKEN variable required by PostHog is missing or un-configured, this causes events to be silently missed. This error stops appearing once POSTHOG_PROJECT_TOKEN is configured" + end + if host.blank? + raise "POSTHOG_HOST variable required by PostHog is missing or un-configured, this causes events to be silently missed. This error stops appearing once POSTHOG_HOST is configured" + end +end + +if api_key.present? && host.present? + PostHog.init do |config| + config.api_key = api_key + config.host = host + end + + PostHog::Rails.configure do |config| + config.auto_capture_exceptions = true + config.report_rescued_exceptions = true + config.auto_instrument_active_job = true + config.capture_user_context = true + config.current_user_method = :current_identity + config.user_id_method = :posthog_distinct_id + end +end