Class: Dbviewer::TablesController

Inherits:
ApplicationController show all
Includes:
AccessControlValidation
Defined in:
app/controllers/dbviewer/tables_controller.rb

Instance Method Summary collapse

Methods included from DatabaseOperations

#access_control, #database_manager, #filter_accessible_columns, #filter_accessible_tables, #table_query_operations

Methods included from DatabaseOperations::TableOperations

#fetch_table_columns, #fetch_table_metadata, #fetch_table_record_count, #fetch_table_records, #fetch_tables

Methods included from DatabaseOperations::RelationshipManagement

#fetch_mini_erd_for_table, #fetch_table_relationships

Methods included from DatabaseOperations::QueryOperations

#default_query, #execute_query, #prepare_query

Methods included from DatabaseOperations::DatatableOperations

#fetch_datatable_data, #fetch_table_stats

Methods included from DatabaseOperations::DatabaseInformation

#fetch_database_name, #get_adapter_name, #get_database_name

Methods included from DatabaseOperations::DataExport

#export_table_to_csv

Methods included from DatabaseOperations::ConnectionManagement

#available_connections, #current_connection_key, #switch_connection

Instance Method Details

#create_recordObject



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_recordObject



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_recordObject



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_name)
  @foreign_key_options = load_foreign_key_options(@metadata)

  render layout: false
end

#export_csvObject



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

#indexObject



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_recordObject



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_name)
  @foreign_key_options = load_foreign_key_options(@metadata)

  render layout: false
end

#queryObject



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

#showObject



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_recordObject



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