Class: LatoCms::MediaController

Inherits:
ApplicationController show all
Defined in:
app/controllers/lato_cms/media_controller.rb

Constant Summary collapse

ADMIN_ONLY_ACTIONS =
%i[destroy_action].freeze

Instance Method Summary collapse

Instance Method Details

#createObject



29
30
31
# File 'app/controllers/lato_cms/media_controller.rb', line 29

def create
  @media = LatoCms::Media.new
end

#create_actionObject



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/controllers/lato_cms/media_controller.rb', line 33

def create_action
  @media = LatoCms::Media.new(create_params.merge(lato_spaces_group_id: @session.get(:spaces_group_id)))

  respond_to do |format|
    if @media.save
      format.html { redirect_to lato_cms.media_path, notice: t('lato_cms.media_created') }
      format.json { render json: @media }
    else
      format.html { render :create, status: :unprocessable_entity }
      format.json { render json: @media.errors, status: :unprocessable_entity }
    end
  end
end

#destroy_actionObject



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'app/controllers/lato_cms/media_controller.rb', line 89

def destroy_action
  @media = query_media.find(params[:id])
  in_use = @media.usage_count.positive?
  force = ActiveModel::Type::Boolean.new.cast(params[:force])

  respond_to do |format|
    if (!in_use || force) && @media.destroy
      format.html { redirect_to lato_cms.media_path, notice: t('lato_cms.media_deleted') }
      format.json { render json: { message: t('lato_cms.media_deleted') } }
    else
      message = in_use ? t('lato_cms.media_delete_in_use', count: @media.usage_count) : t('lato_cms.media_delete_failed')
      format.html { redirect_to lato_cms.media_path, alert: message }
      format.json { render json: { error: message, usage_count: @media.usage_count }, status: :unprocessable_entity }
    end
  end
end

#indexObject



8
9
10
11
12
13
14
15
16
17
# File 'app/controllers/lato_cms/media_controller.rb', line 8

def index
  @media = lato_index_collection(
    query_media.order(created_at: :desc),
    columns: %i[name media_type actions],
    sortable_columns: %i[name media_type created_at],
    searchable_columns: %i[name alt_text],
    default_sort_by: 'created_at|DESC',
    pagination: 24
  )
end

#picker_actionObject

Searchable/filterable grid used inside the field media picker modal (distinct from index, which is the full standalone library page).



21
22
23
24
25
26
27
# File 'app/controllers/lato_cms/media_controller.rb', line 21

def picker_action
  media = query_media
  media = media.of_type(params[:type]) if params[:type].present?
  media = media.where('LOWER(lato_cms_media.name) LIKE :q', q: "%#{params[:q].to_s.downcase}%") if params[:q].present?

  @media = media.order(created_at: :desc).page(params[:page]).per(24)
end

#regenerate_alt_text_actionObject

Runs as a Lato::Operation (see GenerateAltTextJob) rather than inline: an LLM call can take a while, and blocking the request risks timing it out. The admin instead lands on a live progress page.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'app/controllers/lato_cms/media_controller.rb', line 68

def regenerate_alt_text_action
  @media = query_media.find(params[:id])

  unless @media.image? && LatoCms.config.llm_configured?
    respond_to do |format|
      message = t('lato_cms.media_alt_text_regenerate_unavailable')
      format.html { redirect_to lato_cms.media_update_path(@media), alert: message }
      format.json { render json: { error: message }, status: :unprocessable_entity }
    end
    return
  end

  operation = Lato::Operation.generate('LatoCms::GenerateAltTextJob', { media_id: @media.id }, @session.user_id)

  if operation.start
    redirect_to lato.operation_path(operation)
  else
    redirect_to lato_cms.media_update_path(@media), alert: t('lato_cms.media_alt_text_regenerate_failed')
  end
end

#updateObject



47
48
49
# File 'app/controllers/lato_cms/media_controller.rb', line 47

def update
  @media = query_media.find(params[:id])
end

#update_actionObject



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'app/controllers/lato_cms/media_controller.rb', line 51

def update_action
  @media = query_media.find(params[:id])

  respond_to do |format|
    if @media.update(update_params)
      format.html { redirect_to lato_cms.media_path, notice: t('lato_cms.media_updated') }
      format.json { render json: @media }
    else
      format.html { render :update, status: :unprocessable_entity }
      format.json { render json: @media.errors, status: :unprocessable_entity }
    end
  end
end