diff --git a/app/controllers/dmsf_files_controller.rb b/app/controllers/dmsf_files_controller.rb index 6504120c..81e0cbeb 100644 --- a/app/controllers/dmsf_files_controller.rb +++ b/app/controllers/dmsf_files_controller.rb @@ -140,7 +140,6 @@ class DmsfFilesController < ApplicationController if upload revision.size = upload.size revision.disk_filename = revision.new_storage_filename - revision.mime_type = upload.mime_type revision.file.attach( io: File.open(upload.tempfile_path), filename: revision.disk_filename, @@ -151,7 +150,6 @@ class DmsfFilesController < ApplicationController else revision.size = last_revision.size revision.disk_filename = last_revision.disk_filename - revision.mime_type = last_revision.mime_type end # Custom fields revision.copy_custom_field_values(params[:dmsf_file_revision][:custom_field_values], last_revision) diff --git a/app/controllers/dmsf_upload_controller.rb b/app/controllers/dmsf_upload_controller.rb index 022f5d77..0b0677cc 100644 --- a/app/controllers/dmsf_upload_controller.rb +++ b/app/controllers/dmsf_upload_controller.rb @@ -113,7 +113,6 @@ class DmsfUploadController < ApplicationController uploaded_file[:disk_filename] = upload.disk_filename uploaded_file[:tempfile_path] = upload.tempfile_path uploaded_file[:size] = upload.size - uploaded_file[:digest] = upload.digest uploaded_file[:mime_type] = upload.mime_type end commit_files_internal uploaded_files diff --git a/app/helpers/dmsf_upload_helper.rb b/app/helpers/dmsf_upload_helper.rb index 550da8d0..7ab36977 100644 --- a/app/helpers/dmsf_upload_helper.rb +++ b/app/helpers/dmsf_upload_helper.rb @@ -68,7 +68,6 @@ module DmsfUploadHelper new_revision.patch_version = if committed_file[:version_patch].present? DmsfUploadHelper.db_version committed_file[:version_patch] end - new_revision.mime_type = committed_file[:mime_type] new_revision.size = committed_file[:size] # Custom fields new_revision.copy_custom_field_values(committed_file[:custom_field_values]) diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index 0bf731ab..da7231d6 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -115,7 +115,11 @@ class DmsfFileRevision < ApplicationRecord end def checksum - file.blob.checksum + file.blob&.checksum + end + + def mime_type + file.blob&.content_type end def visible?(_user = nil) @@ -231,7 +235,6 @@ class DmsfFileRevision < ApplicationRecord new_revision.dmsf_file = dmsf_file new_revision.disk_filename = disk_filename new_revision.size = size - new_revision.mime_type = mime_type new_revision.title = title new_revision.description = description new_revision.workflow = workflow @@ -322,7 +325,7 @@ class DmsfFileRevision < ApplicationRecord file.attach( io: open_file, filename: dmsf_file.name, - content_type: mime_type, + content_type: mime_type.presence || Redmine::MimeType.of(disk_filename), identify: false ) end diff --git a/app/models/dmsf_upload.rb b/app/models/dmsf_upload.rb index fe136be5..c04d2e5a 100644 --- a/app/models/dmsf_upload.rb +++ b/app/models/dmsf_upload.rb @@ -32,7 +32,7 @@ class DmsfUpload if a uploaded = { disk_filename: DmsfHelper.temp_filename(a.filename), - content_type: a.content_type, + content_type: a.content_type.presence || 'application/octet-stream', original_filename: a.filename, comment: uploaded_file[:description], tempfile_path: a.diskfile, @@ -53,7 +53,6 @@ class DmsfUpload @size = 0 @tempfile_path = '' @token = '' - @digest = '' if RedmineDmsf.empty_minor_version_by_default? @major_version = 1 @minor_version = nil @@ -85,7 +84,6 @@ class DmsfUpload end @tempfile_path = uploaded[:tempfile_path] @token = uploaded[:token] - @digest = uploaded[:digest] if file.nil? || file.last_revision.nil? @title = DmsfFileRevision.filename_to_title(@name) diff --git a/app/views/dmsf_files/show.api.rsb b/app/views/dmsf_files/show.api.rsb index 80feeb9e..0b9d8dec 100644 --- a/app/views/dmsf_files/show.api.rsb +++ b/app/views/dmsf_files/show.api.rsb @@ -35,7 +35,7 @@ api.dmsf_file do api.dmsf_workflow_started_by_user_id r.dmsf_workflow_started_by_user_id api.dmsf_workflow_started_at r.dmsf_workflow_started_at api.dmsf_worklfow_state r.workflow_str(false) - api.digest r.digest + api.digest r.checksum render_api_custom_values r.visible_custom_field_values, api end end diff --git a/db/migrate/20251128131001_remove_digest_from_revision.rb b/db/migrate/20251128131001_remove_duplicities_from_revision.rb similarity index 71% rename from db/migrate/20251128131001_remove_digest_from_revision.rb rename to db/migrate/20251128131001_remove_duplicities_from_revision.rb index d418308d..afaf4517 100644 --- a/db/migrate/20251128131001_remove_digest_from_revision.rb +++ b/db/migrate/20251128131001_remove_duplicities_from_revision.rb @@ -18,13 +18,17 @@ # . # Add column -class RemoveDigestFromRevision < ActiveRecord::Migration[7.0] +class RemoveDuplicitiesFromRevision < ActiveRecord::Migration[7.0] def up remove_column :dmsf_file_revisions, :digest + remove_column :dmsf_file_revisions, :mime_type + # We need to keep the size despite the fact that it's duplicated in active_storage_blobs to speed up the main + # document view end def down add_column :dmsf_file_revisions, :digest, :string, limit: 64, default: '', null: false - # Recalculation of checksums for all revisions is technically possible but costs are too high. + add_column :dmsf_file_revisions, :mime_type, :string + # Recalculation of these columns for all revisions is technically possible but costs are too high. end end diff --git a/lib/redmine_dmsf/webdav/dmsf_resource.rb b/lib/redmine_dmsf/webdav/dmsf_resource.rb index 39ca604a..13bd514d 100644 --- a/lib/redmine_dmsf/webdav/dmsf_resource.rb +++ b/lib/redmine_dmsf/webdav/dmsf_resource.rb @@ -599,7 +599,6 @@ module RedmineDmsf new_revision.dmsf_file = f new_revision.user = User.current new_revision.name = basename - new_revision.mime_type = Redmine::MimeType.of(new_revision.name) # Phusion passenger does not have a method "length" in its model # however, includes a size method - so we instead use reflection @@ -786,9 +785,7 @@ module RedmineDmsf r.dmsf_file = f r.user = User.current r.name = basename - r.mime_type = Redmine::MimeType.of(r.name) r.size = 0 - r.digest = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' r.disk_filename = r.new_storage_filename r.available_custom_fields.each do |cf| # Add default value for CFs not existing next unless cf.default_value diff --git a/test/fixtures/active_storage_blobs.yml b/test/fixtures/active_storage_blobs.yml index 83c9a90f..b3523d05 100644 --- a/test/fixtures/active_storage_blobs.yml +++ b/test/fixtures/active_storage_blobs.yml @@ -3,7 +3,7 @@ active_storage_blob_1: id: 1 key: '5lge4yv88jwzt7xl76vri2be1v01' filename: 'test.txt' - content_type: 'tect/plain' + content_type: 'text/plain' metadata: '{"identified":true,"analyzed":true}' service_name: 'test' byte_size: 3 diff --git a/test/functional/dmsf_files_controller_test.rb b/test/functional/dmsf_files_controller_test.rb index e29fa353..d7f6db5c 100644 --- a/test/functional/dmsf_files_controller_test.rb +++ b/test/functional/dmsf_files_controller_test.rb @@ -150,6 +150,6 @@ class DmsfFilesControllerTest < RedmineDmsf::Test::TestCase } end assert_redirected_to dmsf_folder_path(id: @file1.project) - assert_not_nil @file1.last_revision.digest + assert_not_nil @file1.last_revision.checksum end end diff --git a/test/integration/webdav/dmsf_webdav_put_test.rb b/test/integration/webdav/dmsf_webdav_put_test.rb index c0b2638d..03b1cbe5 100644 --- a/test/integration/webdav/dmsf_webdav_put_test.rb +++ b/test/integration/webdav/dmsf_webdav_put_test.rb @@ -90,7 +90,7 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest params: '1234', headers: @jsmith.merge!({ content_type: :text }) assert_response :forbidden - # Lets check for our file + # Let's check for our file file = DmsfFile.find_file_by_name @project2, nil, 'test-1234.txt' assert_nil file, 'Check for files existance' end @@ -112,7 +112,6 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt' assert file, 'File test-1234 was not found in projects dmsf folder.' assert file.last_revision - assert_equal 'MD5', file.last_revision.digest_type with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1', 'dmsf_webdav' => '1', @@ -381,8 +380,8 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest headers: @jsmith.merge!({ content_type: :text }) assert_response :created end - sha = @file1.last_revision.file.checksum - assert_equal sha, @file1.last_revision.digest + checksum = Digest::MD5.base64digest('1234') + assert_equal checksum, @file1.last_revision.checksum end def test_put_version diff --git a/test/unit/dmsf_file_revision_test.rb b/test/unit/dmsf_file_revision_test.rb index 369d01db..69afe587 100644 --- a/test/unit/dmsf_file_revision_test.rb +++ b/test/unit/dmsf_file_revision_test.rb @@ -89,7 +89,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest r1.title = DmsfFileRevision.filename_to_title(r1.name) r1.description = nil r1.comment = nil - r1.mime_type = nil r1.size = 4 r2 = r1.clone @@ -132,7 +131,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest r1.title = DmsfFileRevision.filename_to_title(r1.name) r1.description = nil r1.comment = nil - r1.mime_type = nil r1.size = 4 assert r1.invalid? message = ['Attachment extension .png is not allowed'] @@ -215,32 +213,32 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest end def test_protocol_doc - @revision1.mime_type = Redmine::MimeType.of('test.doc') + @revision1.file.blob.content_type = Redmine::MimeType.of('test.doc') assert_equal 'ms-word', @revision1.protocol end def test_protocol_docx - @revision1.mime_type = Redmine::MimeType.of('test.docx') + @revision1.file.blob.content_type = Redmine::MimeType.of('test.docx') assert_equal 'ms-word', @revision1.protocol end def test_protocol_odt - @revision1.mime_type = Redmine::MimeType.of('test.odt') + @revision1.file.blob.content_type = Redmine::MimeType.of('test.odt') assert_equal 'ms-word', @revision1.protocol end def test_protocol_xls - @revision1.mime_type = Redmine::MimeType.of('test.xls') + @revision1.file.blob.content_type = Redmine::MimeType.of('test.xls') assert_equal 'ms-excel', @revision1.protocol end def test_protocol_xlsx - @revision1.mime_type = Redmine::MimeType.of('test.xlsx') + @revision1.file.blob.content_type = Redmine::MimeType.of('test.xlsx') assert_equal 'ms-excel', @revision1.protocol end def test_protocol_ods - @revision1.mime_type = Redmine::MimeType.of('test.ods') + @revision1.file.blob.content_type = Redmine::MimeType.of('test.ods') assert_equal 'ms-excel', @revision1.protocol end