diff --git a/app/controllers/upload_media_assets_controller.rb b/app/controllers/upload_media_assets_controller.rb new file mode 100644 index 000000000..b225e7190 --- /dev/null +++ b/app/controllers/upload_media_assets_controller.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class UploadMediaAssetsController < ApplicationController + respond_to :html, :xml, :json, :js + + def index + @upload_media_assets = authorize UploadMediaAsset.visible(CurrentUser.user).includes(media_asset: :post, upload: :uploader).where(upload: { uploader: CurrentUser.user }).paginated_search(params, count_pages: true) + respond_with(@upload_media_assets) + end + + def show + @upload_media_asset = authorize UploadMediaAsset.find(params[:id]) + @media_asset = @upload_media_asset.media_asset + + if request.format.html? && @media_asset&.post&.present? + flash[:notice] = "Duplicate of post ##{@media_asset.post.id}" + redirect_to @media_asset.post + else + respond_with(@upload_media_asset) + end + end +end diff --git a/app/models/upload_media_asset.rb b/app/models/upload_media_asset.rb index 59807cd33..8cc5d646f 100644 --- a/app/models/upload_media_asset.rb +++ b/app/models/upload_media_asset.rb @@ -11,6 +11,14 @@ class UploadMediaAsset < ApplicationRecord failed: 300, } + def self.visible(user) + if user.is_admin? + all + else + where(upload: { uploader: user }) + end + end + def self.search(params) q = search_attributes(params, :id, :created_at, :updated_at, :status, :source_url, :page_url, :error, :upload, :media_asset) q.apply_default_order(params) diff --git a/app/policies/upload_media_asset_policy.rb b/app/policies/upload_media_asset_policy.rb new file mode 100644 index 000000000..22971826b --- /dev/null +++ b/app/policies/upload_media_asset_policy.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class UploadMediaAssetPolicy < ApplicationPolicy + def show? + user.is_admin? || record.upload.uploader_id == user.id + end +end diff --git a/app/views/upload_media_assets/_gallery.html.erb b/app/views/upload_media_assets/_gallery.html.erb new file mode 100644 index 000000000..0b4092375 --- /dev/null +++ b/app/views/upload_media_assets/_gallery.html.erb @@ -0,0 +1,7 @@ +<%= render(MediaAssetGalleryComponent.new) do |gallery| %> + <% upload_media_assets.each do |upload_media_asset| %> + <% gallery.media_asset do %> + <%= render "upload_media_assets/preview", upload_media_asset: upload_media_asset, size: gallery.size %> + <% end %> + <% end %> +<% end %> diff --git a/app/views/upload_media_assets/_preview.html.erb b/app/views/upload_media_assets/_preview.html.erb new file mode 100644 index 000000000..a3f5b24fb --- /dev/null +++ b/app/views/upload_media_assets/_preview.html.erb @@ -0,0 +1,27 @@ +<% media_asset = upload_media_asset.media_asset %> + +<%= render MediaAssetPreviewComponent.new(media_asset: media_asset, size: size, link_target: [upload_media_asset.upload, upload_media_asset]) do |preview| %> + <% preview.missing_image do %> + <% if upload_media_asset.failed? %> + Failed + <% else %> + Loading + <% end %> + <% end %> + + <% preview.footer do %> +
+ <% if media_asset&.post.present? %> +
+ <%= link_to "post ##{media_asset.post.id}", media_asset.post, class: "leading-none" %> +
+ <% end %> + + <% if upload_media_asset.source_url.present? %> + <%= external_link_to upload_media_asset.source_url, Addressable::URI.parse(upload_media_asset.source_url).domain %> + <% else %> + No source + <% end %> +
+ <% end %> +<% end %> diff --git a/app/views/upload_media_assets/index.html.erb b/app/views/upload_media_assets/index.html.erb new file mode 100644 index 000000000..c720e9915 --- /dev/null +++ b/app/views/upload_media_assets/index.html.erb @@ -0,0 +1,16 @@ +
+
+
+

My Uploads

+ + + Gallery | + <%= link_to "Table", uploads_path(mode: "table") %> + +
+ + <%= render "upload_media_assets/gallery", upload_media_assets: @upload_media_assets %> + + <%= numbered_paginator(@upload_media_assets) %> +
+
diff --git a/config/routes.rb b/config/routes.rb index fecf9a2a8..f9bdeb35a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -252,7 +252,9 @@ Rails.application.routes.draw do get :batch get :image_proxy end + resources :upload_media_assets, only: [:show, :index], path: "assets" end + resources :upload_media_assets, only: [:show, :index] resources :users do resources :favorites, only: [:index, :create, :destroy] resources :favorite_groups, controller: "favorite_groups", only: [:index], as: "favorite_groups"