Class: Dbviewer::TablesController
Instance Method Summary
collapse
#access_control, #database_manager, #filter_accessible_columns, #filter_accessible_tables, #table_query_operations
#fetch_table_columns, #fetch_table_metadata, #fetch_table_record_count, #fetch_table_records, #fetch_tables
#fetch_mini_erd_for_table, #fetch_table_relationships
#default_query, #execute_query, #prepare_query
#fetch_datatable_data, #fetch_table_stats
#fetch_database_name, #get_adapter_name, #get_database_name
#export_table_to_csv
#available_connections, #current_connection_key, #switch_connection
Instance Method Details
#create_record ⇒ Object
44
45
46
47
48
49
50
51
52
53
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 44
def create_record
model_class = database_manager.get_model_for(@table_name)
record = model_class.new(record_params)
if record.save
render json: { message: "Record created successfully" }
else
render json: { errors: record.errors, messages: record.errors.full_messages }, status: :unprocessable_entity
end
end
|
#destroy_record ⇒ Object
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 95
def destroy_record
model_class = database_manager.get_model_for(@table_name)
primary_key = database_manager.primary_key(@table_name) || "id"
record = model_class.find_by(primary_key => params[:record_id])
if record.nil?
render json: { error: "Record not found" }, status: :not_found
return
end
begin
if record.destroy
render json: { message: "Record deleted successfully" }, status: :ok
else
render json: { errors: record.errors.full_messages, message: "Failed to delete record" }, status: :unprocessable_entity
end
rescue => e
Rails.logger.error("Error deleting record from #{@table_name}: #{e.message}")
render json: { error: "Failed to delete record: #{e.message}" }, status: :internal_server_error
end
end
|
#edit_record ⇒ Object
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 117
def edit_record
model_class = database_manager.get_model_for(@table_name)
primary_key = database_manager.primary_key(@table_name) || "id"
@record = model_class.find_by(primary_key => params[:record_id])
if @record.nil?
render json: { error: "Record not found" }, status: :not_found
return
end
@table_columns = filter_accessible_columns(@table_name, database_manager.table_columns(@table_name))
@metadata = database_manager.table_metadata(@table_name)
@foreign_key_options = load_foreign_key_options(@metadata)
render layout: false
end
|
#export_csv ⇒ Object
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 72
def export_csv
unless Dbviewer.configuration.enable_data_export
flash[:alert] = "Data export is disabled in the configuration"
redirect_to table_path(params[:id])
return
end
query_params = Dbviewer::Datatable::QueryParams.new(
page: @current_page,
per_page: (params[:limit] || 10000).to_i,
order_by: @order_by,
direction: @order_direction,
column_filters: @column_filters.reject { |_, v| v.blank? }
)
csv_data = export_table_to_csv(@table_name, query_params, params[:include_headers] != "0")
filename = "#{@table_name}_#{Time.now.strftime('%Y%m%d%H%M%S')}.csv"
send_data csv_data,
type: "text/csv; charset=utf-8; header=present",
disposition: "attachment; filename=#{filename}"
end
|
#index ⇒ Object
13
14
15
16
17
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 13
def index
@tables = @tables.map do |table|
table.merge(record_count: fetch_table_record_count(table[:name]))
end
end
|
#new_record ⇒ Object
36
37
38
39
40
41
42
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 36
def new_record
@table_columns = filter_accessible_columns(@table_name, database_manager.table_columns(@table_name))
@metadata = database_manager.table_metadata(@table_name)
@foreign_key_options = load_foreign_key_options(@metadata)
render layout: false
end
|
#query ⇒ Object
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 55
def query
all_columns = fetch_table_columns(@table_name)
@columns = filter_accessible_columns(@table_name, all_columns)
@query = prepare_query(@table_name, params[:query])
if @query.present?
begin
validate_query_access(@query)
rescue SecurityError => e
flash[:alert] = e.message
render :query and return
end
end
@records = execute_query(@query)
end
|
#show ⇒ Object
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 19
def show
query_params = Dbviewer::Datatable::QueryParams.new(
page: @current_page,
per_page: @per_page,
order_by: @order_by,
direction: @order_direction,
column_filters: @column_filters.reject { |_, v| v.blank? }
)
datatable_data = fetch_datatable_data(@table_name, query_params)
@total_count = datatable_data[:total_count]
@records = datatable_data[:records]
@total_pages = datatable_data[:total_pages]
@columns = filter_accessible_columns(@table_name, datatable_data[:columns])
@metadata = datatable_data[:metadata]
end
|
#update_record ⇒ Object
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
# File 'app/controllers/dbviewer/tables_controller.rb', line 134
def update_record
model_class = database_manager.get_model_for(@table_name)
primary_key = database_manager.primary_key(@table_name) || "id"
record = model_class.find_by(primary_key => params[:record_id])
if record.nil?
render json: { error: "Record not found" }, status: :not_found
return
end
begin
if record.update(record_params)
render json: { message: "Record updated successfully" }
else
render json: { errors: record.errors, messages: record.errors.full_messages }, status: :unprocessable_entity
end
rescue => e
Rails.logger.error("Error updating record in #{@table_name}: #{e.message}")
render json: { error: "Failed to update record: #{e.message}" }, status: :internal_server_error
end
end
|