- Updated various Ruby files to enforce strict typing with Sorbet, including controllers, jobs, and models. - Refactored method signatures across multiple classes to ensure better type checking and documentation. - Introduced `requires_ancestor` in several modules to enforce class hierarchy requirements. - Enhanced the `DbSampler` and `Scraper` classes with type signatures for better clarity and maintainability. - Added new methods in the `Domain::Fa::User` class for scan management, improving functionality and type safety. These changes aim to enhance the overall stability and maintainability of the codebase.
140 lines
3.7 KiB
Ruby
140 lines
3.7 KiB
Ruby
# typed: true
|
|
|
|
class Domain::Fa::PostsController < ApplicationController
|
|
before_action :set_ivfflat_probes!, only: %i[show]
|
|
before_action :set_domain_fa_post, only: %i[show scan_post]
|
|
|
|
skip_before_action :verify_authenticity_token,
|
|
only: %i[try_scan_post try_scan_posts]
|
|
|
|
skip_before_action :authenticate_user!, only: %i[show index]
|
|
|
|
# This action is always scoped to a user, so the :user_url_name parameter is required.
|
|
# GET /domain/fa/users/:user_url_name/posts
|
|
def index
|
|
@user = Domain::Fa::User.find_by!(url_name: params[:user_url_name])
|
|
relation = policy_scope(@user.posts)
|
|
@posts =
|
|
relation
|
|
.includes(:creator, :file)
|
|
.order(fa_id: :desc)
|
|
.page(params[:page])
|
|
.per(50)
|
|
.without_count
|
|
end
|
|
|
|
# GET /domain/fa/posts/:fa_id
|
|
def show
|
|
end
|
|
|
|
# GET /domain/fa/posts/:fa_id/favorites
|
|
def favorites
|
|
@post = Domain::Fa::Post.find_by!(fa_id: params[:fa_id])
|
|
end
|
|
|
|
def scan_post
|
|
if try_enqueue_post_scan(@post, @post.fa_id)
|
|
redirect_to domain_fa_post_path(@post.fa_id), notice: "Enqueued for scan"
|
|
else
|
|
redirect_to domain_fa_post_path(@post.fa_id), notice: "Already scanned"
|
|
end
|
|
end
|
|
|
|
def try_scan_post
|
|
fa_id = params[:fa_id]&.to_i || raise("need fa_id parameter")
|
|
post = Domain::Fa::Post.find_by(fa_id: fa_id)
|
|
enqueued = try_enqueue_post_scan(post, fa_id)
|
|
|
|
if post && (file = post.file).present?
|
|
state_string =
|
|
"downloaded #{helpers.time_ago_in_words(file.created_at, include_seconds: true)} ago"
|
|
elsif post && post.scanned?
|
|
state_string =
|
|
"scanned #{helpers.time_ago_in_words(post.scanned_at, include_seconds: true)} ago"
|
|
else
|
|
state_string = []
|
|
!post ? state_string << "not seen" : state_string << "#{post.state}"
|
|
|
|
state_string << "enqueued" if enqueued
|
|
|
|
state_string = state_string.join(", ")
|
|
end
|
|
|
|
render json: {
|
|
enqueued: enqueued,
|
|
title: post&.title,
|
|
state: state_string,
|
|
is_terminal_state: post&.scanned? && post.file&.present? || false,
|
|
}
|
|
end
|
|
|
|
def try_scan_posts
|
|
Rails.logger.info "params: #{params.inspect}"
|
|
fa_ids = params[:fa_ids].map(&:to_i)
|
|
fa_id_to_post =
|
|
Domain::Fa::Post
|
|
.where(fa_id: fa_ids)
|
|
.map { |post| [post.fa_id, post] }
|
|
.to_h
|
|
|
|
response = {}
|
|
|
|
fa_ids.each do |fa_id|
|
|
post = fa_id_to_post[fa_id]
|
|
if post.nil?
|
|
state = "not_seen"
|
|
elsif post.file.present?
|
|
state = "have_file"
|
|
elsif post.scanned?
|
|
state = "scanned"
|
|
else
|
|
state = "state_#{post.state}"
|
|
end
|
|
|
|
response[fa_id] = {
|
|
state: state,
|
|
enqueued: try_enqueue_post_scan(post, fa_id),
|
|
}
|
|
end
|
|
render json: response
|
|
end
|
|
|
|
private
|
|
|
|
def try_enqueue_post_scan(post, fa_id)
|
|
@@already_enqueued_fa_ids ||= Set.new
|
|
unless @@already_enqueued_fa_ids.add?(fa_id)
|
|
Rails.logger.info "Already enqueued #{fa_id}, skipping"
|
|
return false
|
|
end
|
|
|
|
if !post || !post.scanned?
|
|
Rails.logger.info "Enqueue scan #{fa_id}"
|
|
Domain::Fa::Job::ScanPostJob.set(
|
|
priority: -15,
|
|
queue: "manual",
|
|
).perform_later({ fa_id: fa_id })
|
|
return true
|
|
end
|
|
|
|
if post && post.file_uri && !post.file.present?
|
|
Rails.logger.info "Enqueue file #{fa_id}"
|
|
Domain::Fa::Job::ScanFileJob.set(
|
|
priority: -15,
|
|
queue: "manual",
|
|
).perform_later({ post: post })
|
|
return true
|
|
end
|
|
|
|
false
|
|
end
|
|
|
|
# Use callbacks to share common setup or constraints between actions.
|
|
def set_domain_fa_post
|
|
@post =
|
|
Domain::Fa::Post.includes(:creator, file: :response).find_by!(
|
|
fa_id: params[:fa_id],
|
|
)
|
|
end
|
|
end
|