Class: Smriti::Admin::MatViewDefinitionsController

Inherits:
ApplicationController show all
Includes:
DatatableHelper
Defined in:
app/controllers/smriti/admin/mat_view_definitions_controller.rb

Overview

Smriti::Admin::MatViewDefinitionsController

Admin CRUD controller for MatViewDefinition records.

Responsibilities:

  • Full CRUD lifecycle: index, show, new, create, edit, update, destroy.
  • Admin-only actions to trigger materialised view operations:
  • Integrates with Turbo Frames (uses frame-aware redirects/responses).
  • Normalizes array fields (unique_index_columns, dependencies) from comma-separated params into arrays.

Filters:

  • before_action :set_definition for member actions.
  • before_action :normalize_array_fields for create/update.
  • before_action :ensure_frame to enforce frame context.

Instance Method Summary collapse

Methods included from AuthBridge

#user

Instance Method Details

#createvoid

This method returns an undefined value.

POST /:lang/admin/definitions

Creates a new definition from params.



85
86
87
88
89
90
91
92
93
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 85

def create
  authorize_smriti!(:create, :smriti_definition)
  @definition = Smriti::MatViewDefinition.new(definition_params)
  if @definition.save
    handle_frame_response(status: 298)
  else
    render 'form', formats: :html, layout: 'smriti/turbo_frame', status: :unprocessable_content
  end
end

#create_nowvoid

This method returns an undefined value.

POST /:lang/admin/definitions/:id/create_now

Immediately enqueues a background job to create the materialised view.



139
140
141
142
143
144
145
146
147
148
149
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 139

def create_now
  authorize_smriti!(:create, :smriti_definition_view, @definition)

  force = params[:force].to_s.downcase == 'true'
  Smriti::Jobs::Adapter.enqueue(
    Smriti::CreateViewJob,
    queue: Smriti.configuration.job_queue,
    args: [@definition.id, force, row_count_strategy]
  )
  handle_frame_response
end

#delete_nowvoid

This method returns an undefined value.

POST /:lang/admin/definitions/:id/delete_now

Immediately enqueues a background job to delete the materialised view.



171
172
173
174
175
176
177
178
179
180
181
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 171

def delete_now
  authorize_smriti!(:destroy, :smriti_definition_view, @definition)

  cascade = params[:cascade].to_s.downcase == 'true'
  Smriti::Jobs::Adapter.enqueue(
    Smriti::DeleteViewJob,
    queue: Smriti.configuration.job_queue,
    args: [@definition.id, cascade, row_count_strategy]
  )
  handle_frame_response
end

#destroyvoid

This method returns an undefined value.

DELETE /:lang/admin/definitions/:id

Destroys the definition. Frame-specific redirect/empty response.



124
125
126
127
128
129
130
131
132
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 124

def destroy
  authorize_smriti!(:destroy, :smriti_definition, @definition)
  @definition.destroy!
  if @frame_id == 'dash-definitions'
    redirect_to admin_mat_view_definitions_path(frame_id: @frame_id), status: :see_other
  else
    render 'empty', formats: :html, layout: 'smriti/turbo_frame', status: 298
  end
end

#editvoid

This method returns an undefined value.

GET /:lang/admin/definitions/:id/edit

Renders the edit form for an existing definition.



100
101
102
103
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 100

def edit
  authorize_smriti!(:update, :smriti_definition, @definition)
  render 'form', formats: :html, layout: 'smriti/turbo_frame'
end

#indexvoid

This method returns an undefined value.

GET /:lang/admin/definitions

Two part rendering:

  • Full page load when no stream param: renders index with datatable frame. This is essentially shell of the datatable for initial load.
  • When shell is loaded, it requests the stream version which renders just the datatable rows and pagination controls. This allows for dynamic updates via Turbo Streams.


45
46
47
48
49
50
51
52
53
54
55
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 45

def index
  authorize_smriti!(:read, :smriti_definitions)

  assign_index_state

  if params[:stream].present?
    render_dt_turbo_streams
    return
  end
  render 'index', formats: :html, layout: 'smriti/turbo_frame', locals: { row_meta: @row_meta }
end

#newvoid

This method returns an undefined value.

GET /:lang/admin/definitions/new

Renders the new definition form.



74
75
76
77
78
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 74

def new
  authorize_smriti!(:create, :smriti_definition)
  @definition = Smriti::MatViewDefinition.new
  render 'form', formats: :html, layout: 'smriti/turbo_frame'
end

#refreshvoid

This method returns an undefined value.

POST /:lang/admin/definitions/:id/refresh

Immediately enqueues a background job to refresh the materialised view.



156
157
158
159
160
161
162
163
164
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 156

def refresh
  authorize_smriti!(:update, :smriti_definition_view, @definition)
  Smriti::Jobs::Adapter.enqueue(
    Smriti::RefreshViewJob,
    queue: Smriti.configuration.job_queue,
    args: [@definition.id, row_count_strategy]
  )
  handle_frame_response
end

#showvoid

This method returns an undefined value.

GET /:lang/admin/definitions/:id

Shows a single definition, including run history.



62
63
64
65
66
67
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 62

def show
  authorize_smriti!(:read, :smriti_definition, @definition)
  @mv_exists = Smriti::Services::CheckMatviewExists.new(@definition).call.response[:exists]
  @runs = @definition.mat_view_runs.order(created_at: :desc).to_a
  render 'show', formats: :html, layout: 'smriti/turbo_frame'
end

#updatevoid

This method returns an undefined value.

PATCH/PUT /:lang/admin/definitions/:id

Updates an existing definition.



110
111
112
113
114
115
116
117
# File 'app/controllers/smriti/admin/mat_view_definitions_controller.rb', line 110

def update
  authorize_smriti!(:update, :smriti_definition, @definition)
  if @definition.update(definition_params)
    handle_frame_response(status: 298)
  else
    render 'form', formats: :html, layout: 'smriti/turbo_frame', status: :unprocessable_content
  end
end