Skip to content

Commit 734a706

Browse files
committed
debug: add logs to depurate database issue
1 parent 368b8ac commit 734a706

3 files changed

Lines changed: 153 additions & 0 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# frozen_string_literal: true
2+
3+
module Api
4+
module V1
5+
class HealthController < ApplicationController
6+
skip_before_action :authenticate_request!, only: [:index, :db]
7+
8+
def index
9+
render json: {
10+
status: 'ok',
11+
timestamp: Time.current,
12+
environment: Rails.env,
13+
version: '1.0.0'
14+
}
15+
end
16+
17+
def db
18+
begin
19+
# Test database connection
20+
ActiveRecord::Base.connection.execute('SELECT 1')
21+
22+
# Get database info
23+
db_info = ActiveRecord::Base.connection.execute(
24+
"SELECT current_database() as db, current_user as user, version() as version"
25+
).first
26+
27+
# Check RLS status
28+
rls_status = ActiveRecord::Base.connection.execute(
29+
"SELECT tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public' AND tablename IN ('users', 'players', 'matches') ORDER BY tablename"
30+
).to_a
31+
32+
# Test simple query
33+
user_count = User.unscoped.count
34+
player_count = Player.unscoped.count
35+
36+
render json: {
37+
status: 'ok',
38+
database: {
39+
name: db_info['db'],
40+
user: db_info['user'],
41+
version: db_info['version']&.split(' ')&.first(3)&.join(' ')
42+
},
43+
rls_status: rls_status.map { |r| { table: r['tablename'], enabled: r['rowsecurity'] } },
44+
counts: {
45+
users: user_count,
46+
players: player_count
47+
}
48+
}
49+
rescue StandardError => e
50+
render json: {
51+
status: 'error',
52+
error: {
53+
class: e.class.name,
54+
message: e.message,
55+
backtrace: e.backtrace.first(5)
56+
}
57+
}, status: :internal_server_error
58+
end
59+
end
60+
end
61+
end
62+
end

config/routes.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
# API routes
1818
namespace :api do
1919
namespace :v1 do
20+
# Health check with DB diagnostics
21+
get 'health/db', to: 'health#db'
22+
2023
# Constants (public)
2124
get 'constants', to: 'constants#index'
2225

lib/tasks/test_db.rake

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# frozen_string_literal: true
2+
3+
namespace :db do
4+
desc 'Test database connection and RLS status'
5+
task test_connection: :environment do
6+
puts '=' * 80
7+
puts 'DATABASE CONNECTION TEST'
8+
puts '=' * 80
9+
puts ''
10+
11+
# Test basic connection
12+
puts '1. Testing database connection...'
13+
begin
14+
ActiveRecord::Base.connection.execute('SELECT 1')
15+
puts ' Connection OK'
16+
rescue StandardError => e
17+
puts " Connection FAILED: #{e.message}"
18+
exit 1
19+
end
20+
21+
# Get database info
22+
puts ''
23+
puts '2. Database info:'
24+
result = ActiveRecord::Base.connection.execute(
25+
"SELECT current_database(), current_user, version()"
26+
).first
27+
puts " Database: #{result['current_database']}"
28+
puts " User: #{result['current_user']}"
29+
puts " Version: #{result['version']}"
30+
31+
# Check RLS status
32+
puts ''
33+
puts '3. Checking RLS status on tables:'
34+
tables = %w[users organizations players matches]
35+
tables.each do |table|
36+
result = ActiveRecord::Base.connection.execute(
37+
"SELECT rowsecurity FROM pg_tables WHERE schemaname = 'public' AND tablename = '#{table}'"
38+
).first
39+
40+
if result
41+
status = result['rowsecurity'] ? ' ENABLED' : ' DISABLED'
42+
puts " #{table}: #{status}"
43+
else
44+
puts " #{table}: TABLE NOT FOUND"
45+
end
46+
end
47+
48+
# Test user query
49+
puts ''
50+
puts '4. Testing User.count (should work with RLS disabled):'
51+
begin
52+
count = User.count
53+
puts " Success! Found #{count} users"
54+
rescue StandardError => e
55+
puts " FAILED: #{e.message}"
56+
puts " This usually means RLS is blocking the query"
57+
end
58+
59+
# Test User.unscoped
60+
puts ''
61+
puts '5. Testing User.unscoped.count (bypasses RLS):'
62+
begin
63+
count = User.unscoped.count
64+
puts " Success! Found #{count} users"
65+
rescue StandardError => e
66+
puts " FAILED: #{e.message}"
67+
end
68+
69+
# Test finding specific user
70+
puts ''
71+
puts '6. Testing User.find_by(email: "coach@pain.gg"):'
72+
begin
73+
user = User.unscoped.find_by(email: 'coach@pain.gg')
74+
if user
75+
puts " Found user: #{user.email} (#{user.organization.name})"
76+
else
77+
puts ' User not found in database'
78+
end
79+
rescue StandardError => e
80+
puts " FAILED: #{e.message}"
81+
end
82+
83+
puts ''
84+
puts '=' * 80
85+
puts 'TEST COMPLETE'
86+
puts '=' * 80
87+
end
88+
end

0 commit comments

Comments
 (0)