Class: Admin::MediaAssetsController

Inherits:
ApplicationController
  • Object
show all
Includes:
AdminBulkActions, AdminPagination, AdminTurboTable, AuditLoggable
Defined in:
lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb

Overview

Media library — list, upload, preview and bulk-manage assets stored in Active Storage.

Permission gating runs through Admin::BaseController#check_permission_for_controller, which consults CONTROLLER_PERMISSION_MAP (we register +media_assets :manage_media there).

Constant Summary collapse

DEFAULT_FOLDERS =
%w[general sports events news declarations].freeze
SORTS =
%w[recent name size used].freeze
VIEWS =
%w[grid list].freeze

Constants included from AdminPagination

AdminPagination::DEFAULT_MAX_PER_PAGE, AdminPagination::DEFAULT_MIN_PER_PAGE

Instance Method Summary collapse

Methods included from AdminTurboTable

#turbo_frame_id, #turbo_frame_request?, #turbo_redirect_to, #turbo_render_form, #turbo_render_index, #turbo_stream_replace_table, #turbo_stream_request?, #turbo_stream_update_table

Methods included from AdminPagination

#paginate_collection, #set_pagination_vars

Instance Method Details

#bulk_deleteObject



95
96
97
98
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 95

def bulk_delete
  bulk_destroy(MediaAsset, audit: :media_deleted, target_label: "MediaAsset")
  turbo_redirect_to admin_media_assets_path, notice: "Geselecteerde assets verwijderd."
end

#bulk_moveObject



100
101
102
103
104
105
106
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 100

def bulk_move
  folder = params[:folder].to_s
  redirect_to admin_media_assets_path, alert: "Geen doel-folder opgegeven." and return if folder.blank?

  bulk_update(MediaAsset, { folder: }, audit: :media_moved, target_label: "MediaAsset")
  turbo_redirect_to admin_media_assets_path(folder:), notice: "Verplaatst naar #{folder}."
end

#createObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 49

def create
  file = params.dig(:media_asset, :file) || params[:file]
  redirect_to admin_media_assets_path, alert: "Selecteer minstens een bestand om te uploaden." and return if file.blank?

  uploads = Array(file).reject(&:blank?)
  created = []

  MediaAsset.transaction do
    uploads.each do |upload|
      asset = build_asset_from_upload(upload)
      asset.save!
      created << asset
    end
  end

  created.each do |asset|
    audit!(:media_uploaded, target: asset, summary: "Uploaded #{asset.name} to #{asset.folder}", meta: { id: asset.id, folder: asset.folder, size_kb: asset.size_kb, kind: asset.kind })
  end

  redirect_to admin_media_assets_path(folder: params[:folder]),
              notice: "#{created.size} bestand#{'en' if created.size != 1} geüpload."
rescue ActiveRecord::RecordInvalid => e
  redirect_to admin_media_assets_path, alert: "Upload mislukt: #{e.record.errors.full_messages.to_sentence}"
end

#destroyObject



88
89
90
91
92
93
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 88

def destroy
  name = @media_asset.name
  @media_asset.destroy
  audit!(:media_deleted, target: "MediaAsset:#{name}", summary: "Deleted media #{name}", meta: { id: @media_asset.id })
  turbo_redirect_to admin_media_assets_path, notice: "Asset verwijderd."
end

#editObject



74
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 74

def edit; end

#indexObject



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 25

def index
  scope = MediaAsset.all
  scope = scope.in_folder(params[:folder]) if params[:folder].present? && params[:folder] != "all"
  scope = scope.search(params[:search])    if params[:search].present?
  scope = apply_sort(scope, params[:sort])

  @folder         = params[:folder].presence || "all"
  @sort           = SORTS.include?(params[:sort]) ? params[:sort] : "recent"
  @view           = VIEWS.include?(params[:view]) ? params[:view] : "grid"
  @search         = params[:search].to_s
  @folder_counts  = MediaAsset.folder_counts
  @folders        = (DEFAULT_FOLDERS + @folder_counts.keys.reject {|k| k == "all" }).uniq
  @total_size_kb  = MediaAsset.sum(:size_kb)
  @unused_count   = MediaAsset.unused.count
  @media_assets   = set_pagination_vars(scope)
  turbo_render_index
end

#newObject



45
46
47
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 45

def new
  @media_asset = MediaAsset.new(folder: params[:folder].presence || "general")
end

#pickerObject

JSON endpoint for a future visual-editor picker.



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 109

def picker
  scope = MediaAsset.recent
  scope = scope.in_folder(params[:folder]) if params[:folder].present? && params[:folder] != "all"
  scope = scope.search(params[:search])    if params[:search].present?
  scope = scope.limit(200)

  render json: scope.map {|a|
    {
      id: a.id,
      name: a.name,
      cdn_url: a.cdn_url,
      width: a.width,
      height: a.height,
      mime_type: a.mime_type,
      folder: a.folder
    }
  }
end

#showObject



43
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 43

def show; end

#updateObject



76
77
78
79
80
81
82
83
84
85
86
# File 'lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb', line 76

def update
  attrs = media_asset_params
  attrs = attrs.to_h.merge(tags: parse_tags(attrs[:tags])) if attrs[:tags].kind_of?(String)

  if @media_asset.update(attrs)
    audit!(:media_updated, target: @media_asset, summary: "Updated media #{@media_asset.name}")
    turbo_redirect_to admin_media_asset_path(@media_asset), notice: "Asset bijgewerkt."
  else
    turbo_render_form :edit
  end
end