Include media assets in /uploads.json and /uploads/:id.json API responses, like this:
{
"id": 4983629,
"source": "https://www.pixiv.net/en/artworks/96198438",
"uploader_id": 52664,
"status": "completed",
"created_at": "2022-02-12T16:26:04.680-06:00",
"updated_at": "2022-02-12T16:26:08.071-06:00",
"referer_url": "",
"error": null,
"media_asset_count": 1,
"upload_media_assets": [
{
"id": 9370,
"created_at": "2022-02-12T16:26:08.068-06:00",
"updated_at": "2022-02-12T16:26:08.068-06:00",
"upload_id": 4983629,
"media_asset_id": 5206552,
"status": "pending",
"source_url": "https://i.pximg.net/img-original/img/2022/02/13/01/20/19/96198438_p0.jpg",
"error": null,
"page_url": "https://www.pixiv.net/artworks/96198438",
"media_asset": {
"id": 5206552,
"created_at": "2022-02-12T16:26:07.980-06:00",
"updated_at": "2022-02-12T16:26:08.061-06:00",
"md5": "90a85a5fae5f0e86bdb2501229af05b7",
"file_ext": "jpg",
"file_size": 1055775,
"image_width": 1052,
"image_height": 1545,
"duration": null,
"status": "active"
}
}
]
}
This is needed so you can check for upload errors in the API, since in a multi-file
upload, each asset can have a separate error message. This is a stopgap solution until
something like /uploads.json?include=upload_media_assets.media_asset works.
64 lines
2.5 KiB
Ruby
64 lines
2.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class UploadsController < ApplicationController
|
|
respond_to :html, :xml, :json, :js
|
|
skip_before_action :verify_authenticity_token, only: [:create], if: -> { request.xhr? }
|
|
|
|
def new
|
|
@upload = authorize Upload.new(uploader: CurrentUser.user, uploader_ip_addr: CurrentUser.ip_addr, source: params[:url], referer_url: params[:ref], **permitted_attributes(Upload))
|
|
respond_with(@upload)
|
|
end
|
|
|
|
def create
|
|
@upload = authorize Upload.new(uploader: CurrentUser.user, uploader_ip_addr: CurrentUser.ip_addr, **permitted_attributes(Upload))
|
|
@upload.save
|
|
respond_with(@upload)
|
|
end
|
|
|
|
def batch
|
|
authorize Upload
|
|
@url = params.dig(:batch, :url) || params[:url]
|
|
@source = Sources::Strategies.find(@url, params[:ref]) if @url.present?
|
|
respond_with(@source)
|
|
end
|
|
|
|
def image_proxy
|
|
authorize Upload
|
|
resp = ImageProxy.get_image(params[:url])
|
|
send_data resp.body, type: resp.mime_type, disposition: "inline"
|
|
end
|
|
|
|
def index
|
|
@mode = params.fetch(:mode, "table")
|
|
|
|
case @mode
|
|
when "table"
|
|
@uploads = authorize Upload.visible(CurrentUser.user).paginated_search(params, count_pages: true)
|
|
@uploads = @uploads.includes(:uploader, media_assets: :post, upload_media_assets: { media_asset: :post }) if request.format.html?
|
|
respond_with(@uploads, include: { upload_media_assets: { include: :media_asset }})
|
|
when "gallery"
|
|
@media_assets = authorize MediaAsset.active.visible(CurrentUser.user).includes(:post, uploads: [:uploader]).where(uploads: { uploader: CurrentUser.user }).paginated_search(params, count_pages: true).reorder("uploads.id DESC")
|
|
respond_with(@media_assets)
|
|
else
|
|
raise "Invalid mode '#{@mode}'"
|
|
end
|
|
end
|
|
|
|
def show
|
|
@upload = authorize Upload.find(params[:id])
|
|
@upload_media_asset = @upload.upload_media_assets.first
|
|
@media_asset = @upload_media_asset&.media_asset
|
|
|
|
@post = Post.new_from_upload(@upload, @media_asset, source: @upload.source, **permitted_attributes(Post).to_h.symbolize_keys)
|
|
@post.tag_string = "#{@post.tag_string} #{@upload.source_strategy&.artists.to_a.map(&:tag).map(&:name).join(" ")}".strip
|
|
@post.tag_string += " " if @post.tag_string.present?
|
|
|
|
if request.format.html? && @upload.is_completed? && @upload.media_assets.first&.post.present?
|
|
flash[:notice] = "Duplicate of post ##{@upload.media_assets.first.post.id}"
|
|
redirect_to @upload.media_assets.first.post
|
|
else
|
|
respond_with(@upload, include: { upload_media_assets: { include: :media_asset }})
|
|
end
|
|
end
|
|
end
|