aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2017-06-30 19:12:58 +0200
committerDavid Heinemeier Hansson <david@loudthinking.com>2017-06-30 19:12:58 +0200
commitdd50144bcd4dbd605995123ab5afc99e40e9a630 (patch)
tree81698d44cf2f9dd62e24a95f945f6904689be2f2 /lib
downloadrails-dd50144bcd4dbd605995123ab5afc99e40e9a630.tar.gz
rails-dd50144bcd4dbd605995123ab5afc99e40e9a630.tar.bz2
rails-dd50144bcd4dbd605995123ab5afc99e40e9a630.zip
First sketching
Diffstat (limited to 'lib')
-rw-r--r--lib/active_file.rb8
-rw-r--r--lib/active_file/blob.rb45
-rw-r--r--lib/active_file/filename.rb31
-rw-r--r--lib/active_file/migration.rb14
-rw-r--r--lib/active_file/purge_job.rb7
-rw-r--r--lib/active_file/railtie.rb6
-rw-r--r--lib/active_file/store.rb26
7 files changed, 137 insertions, 0 deletions
diff --git a/lib/active_file.rb b/lib/active_file.rb
new file mode 100644
index 0000000000..7dbcf95163
--- /dev/null
+++ b/lib/active_file.rb
@@ -0,0 +1,8 @@
+require "active_record"
+require "active_file/railtie" if defined?(Rails)
+
+module ActiveFile
+ extend ActiveSupport::Autoload
+
+ autoload :Blob
+end \ No newline at end of file
diff --git a/lib/active_file/blob.rb b/lib/active_file/blob.rb
new file mode 100644
index 0000000000..248b136903
--- /dev/null
+++ b/lib/active_file/blob.rb
@@ -0,0 +1,45 @@
+# Schema: id, token, filename, content_type, metadata, byte_size, digest, created_at
+class ActiveFile::Blob < ActiveRecord::Base
+ self.table_name = "rails_active_file_blobs"
+
+ store :metadata, coder: JSON
+ has_secure_token
+
+ class_attribute :verifier, default: -> { Rails.application.message_verifier('ActiveFile') }
+ class_attribute :storage
+
+ class << self
+ def find_verified(signed_id)
+ find(verifier.verify(signed_id))
+ end
+
+ def build_after_upload(data:, filename:, content_type: nil, metadata: nil)
+ new.tap do |blob|
+ blob.filename = name
+ blob.content_type = Marcel::MimeType.for(data, name: name, declared_type: content_type)
+ blob.data = data
+ end
+ end
+
+ def create_after_upload!(data:, filename:, content_type: nil, metadata: nil)
+ build_after_upload(data: data, filename: filename, content_type: content_type, metadata: metadata).tap(&:save!)
+ end
+ end
+
+ def filename
+ Filename.new(filename)
+ end
+
+ def delete
+ storage.delete token
+ end
+
+ def purge
+ delete
+ destroy
+ end
+
+ def purge_later
+ ActiveFile::PurgeJob.perform_later(self)
+ end
+end
diff --git a/lib/active_file/filename.rb b/lib/active_file/filename.rb
new file mode 100644
index 0000000000..b3c184e26c
--- /dev/null
+++ b/lib/active_file/filename.rb
@@ -0,0 +1,31 @@
+class ActiveFile::Filename
+ include Comparable
+
+ def initialize(filename)
+ @filename = filename
+ end
+
+ def extname
+ File.extname(@filename)
+ end
+
+ def extension
+ extname.from(1)
+ end
+
+ def base
+ File.basename(@filename, extname)
+ end
+
+ def sanitized
+ @filename.encode(Encoding::UTF_8, invalid: :replace, undef: :replace, replace: "�").strip.tr("\u{202E}%$|:;/\t\r\n\\", "-")
+ end
+
+ def to_s
+ sanitized.to_s
+ end
+
+ def <=>(other)
+ to_s.downcase <=> other.to_s.downcase
+ end
+end
diff --git a/lib/active_file/migration.rb b/lib/active_file/migration.rb
new file mode 100644
index 0000000000..0f6b0a3fd2
--- /dev/null
+++ b/lib/active_file/migration.rb
@@ -0,0 +1,14 @@
+class ActiveFile::CreateBlobs < ActiveRecord::Migration[5.2]
+ def change
+ create_table :rails_active_file_blobs do |t|
+ t.string :token
+ t.string :filename
+ t.string :content_type
+ t.integer :byte_size
+ t.string :digest
+ t.time :created_at
+
+ t.index [ :token ], unique: true
+ end
+ end
+end
diff --git a/lib/active_file/purge_job.rb b/lib/active_file/purge_job.rb
new file mode 100644
index 0000000000..1a967db2f0
--- /dev/null
+++ b/lib/active_file/purge_job.rb
@@ -0,0 +1,7 @@
+class ActiveFile::PurgeJob < ActiveJob::Base
+ retry_on ActiveFile::StorageException
+
+ def perform(blob)
+ blob.purge
+ end
+end
diff --git a/lib/active_file/railtie.rb b/lib/active_file/railtie.rb
new file mode 100644
index 0000000000..ccba844742
--- /dev/null
+++ b/lib/active_file/railtie.rb
@@ -0,0 +1,6 @@
+require 'rails/railtie'
+
+module ActiveFile
+ class Engine < ::Rails::Engine
+ end
+end
diff --git a/lib/active_file/store.rb b/lib/active_file/store.rb
new file mode 100644
index 0000000000..bdac4eab9e
--- /dev/null
+++ b/lib/active_file/store.rb
@@ -0,0 +1,26 @@
+class ActiveFile::Store
+ def upload(key, data)
+ end
+
+ def download(key)
+ end
+
+ def delete(key)
+ end
+
+ def exists?(key)
+ end
+
+ def url(key)
+ end
+
+ def checksum(key)
+ end
+
+
+ def copy(from_key:, to_key:)
+ end
+
+ def move(from_key:, to_key:)
+ end
+end