Added pdf analyzer

Analyzer should be moved to ActiveStorage::Analyzer
First there are many bugs with ActiveStorage that needs to be fixed:
Files are not deleted if job is destroyed (dependent: :purge is set)
If a new file is uploaded the old file is not deleted
(has_one_attechment)
This commit is contained in:
2024-08-08 13:56:36 +02:00
parent 19cf60c9a9
commit 616bd0cbe7
7 changed files with 139 additions and 14 deletions

View File

@@ -2,7 +2,7 @@ class Job < ApplicationRecord
belongs_to :operator, class_name: 'User', optional: true
belongs_to :costumer, class_name: 'User', optional: true
has_one_attached :pdf, dependent: :destroy
has_one_attached :pdf, dependent: :purge
validates_presence_of :costumer_firstname, :costumer_lastname, :privacy_policy_accepted, :pdf
validate :acceptable_pdf
@@ -11,6 +11,9 @@ class Job < ApplicationRecord
before_save :update_paid_at, if: :will_save_change_to_status?
before_save :update_status_changed_at, if: :will_save_change_to_status?
# TODO: works only when job is created. Should move analyzer to activestorage :https://discuss.rubyonrails.org/t/active-storage-in-production-lessons-learned-and-in-depth-look-at-how-it-works/83289
after_create_commit :analyze_pdf
# NOTE: Multiple status if paing before brinting?
enum status: {
open: 0,
@@ -53,12 +56,10 @@ class Job < ApplicationRecord
def acceptable_pdf
return unless pdf.attached?
errors.add(:pdf, 'is too big') unless pdf.blob.byte_size <= 100.megabyte
acceptable_types = ['application/pdf']
return if acceptable_types.include?(pdf.content_type)
errors.add(:pdf, 'must be a PDF')
errors.add(:pdf, 'is too big') unless pdf.blob.byte_size <= 100.megabyte
errors.add(:pdf, 'must be a PDF') unless acceptable_types.include?(pdf.content_type)
end
def able_to_cancel?
@@ -84,4 +85,29 @@ class Job < ApplicationRecord
def update_status_changed_at
self.status_changed_at = Time.now
end
def analyze_pdf
# return unless pdf.attached? && pdf.new_record?
# TODO: add any check if attachment has changed
# pdfs.each do |pdf|
pdf.blob.open do |file|
self.number_of_plans_a0 = 0
self.number_of_plans_a1 = 0
self.number_of_plans_a2 = 0
self.number_of_plans_a3 = 0
self.costum_qm_plan = 0
# file = ActiveStorage::Blob.service.path_for(pdf.key).to_s
pdf_analyzer = Services::PdfAnalyzer.new(file)
pdf_analyzer.analyze
self.number_of_plans_a0 += pdf_analyzer.pages_a0
self.number_of_plans_a1 += pdf_analyzer.pages_a1
self.number_of_plans_a2 += pdf_analyzer.pages_a2
self.number_of_plans_a3 += pdf_analyzer.pages_a3
self.costum_qm_plan += pdf_analyzer.costum_qm
save
end
# end
end
end