lazy_blob_storage 1.0.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/lazy_blobs_controller.rb +10 -0
- data/app/models/concerns/lazy_attachable.rb +26 -4
- data/app/models/lazy_attachment.rb +12 -0
- data/app/models/lazy_blob.rb +5 -1
- data/config/routes.rb +1 -0
- data/lib/lazy_blob_storage/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9384630bebc59d8659078936519987b004f1e93716e0ac6e9462bc804beb818
|
4
|
+
data.tar.gz: d83f8c699ceb0cc1076829d558bfc5d2e83753e5f9589b56bb38accfbf1b9f66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d98a3911c8e1988e42eae91827b1ae29a04c138231f2b8ed81cfeb4a61fadcb7e25c49170697dd7c986f8e47f7f87d5f20f957ca611809cc2260a8ad3e2cef16
|
7
|
+
data.tar.gz: 71a963f730b5ab642575494d639a30e6de24bdb4bf279de504725ffa027d601ac7569ffbeb96a454a9969cbe8e118c380a11466d5ff86d4fda981ac315435fde
|
@@ -8,4 +8,14 @@ class LazyBlobsController < ActionController::Base
|
|
8
8
|
send_data(@blob.content, filename: @blob.filename, disposition: :inline)
|
9
9
|
end
|
10
10
|
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
@blob = LazyBlob.from_upload(params[:file])
|
14
|
+
|
15
|
+
if @blob.save
|
16
|
+
render json: { digest: @blob.digest }
|
17
|
+
else
|
18
|
+
render json: { errors: @blob.errors }, status: :unprocessable_entity
|
19
|
+
end
|
20
|
+
end
|
11
21
|
end
|
@@ -21,12 +21,12 @@ module LazyAttachable
|
|
21
21
|
end
|
22
22
|
|
23
23
|
define_method("#{name}_upload_size_ok?") do
|
24
|
-
(send "#{name}_upload").tempfile.size
|
24
|
+
(send "#{name}_upload").tempfile.size <= 1.megabytes
|
25
25
|
end
|
26
26
|
|
27
27
|
define_method("validate_size_of_#{name}_upload") do
|
28
28
|
if (send "#{name}_upload").present? && !(send "#{name}_upload_size_ok?")
|
29
|
-
errors.add("#{name}_upload", "file too large (limit
|
29
|
+
errors.add("#{name}_upload", "file too large (limit 1 MB)")
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -51,13 +51,34 @@ module LazyAttachable
|
|
51
51
|
define_method("#{name}_attached?") do
|
52
52
|
(send "attached_#{name}").present?
|
53
53
|
end
|
54
|
+
|
55
|
+
define_method("handle_#{name}_digest") do
|
56
|
+
digest = (send "#{name}_digest").presence
|
57
|
+
attached = (send "attached_#{name}").presence
|
58
|
+
same_as_attached = (attached && digest) && (attached.digest == digest)
|
59
|
+
|
60
|
+
if digest && !same_as_attached
|
61
|
+
blob = LazyBlob.find_by(digest: digest)
|
62
|
+
|
63
|
+
if blob
|
64
|
+
attachment = LazyAttachment.new(
|
65
|
+
lazy_blob: blob,
|
66
|
+
name: name,
|
67
|
+
digest: digest
|
68
|
+
)
|
69
|
+
|
70
|
+
(send "attached_#{name}=", attachment)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
54
74
|
end
|
55
75
|
end
|
56
76
|
|
57
77
|
class_methods do
|
58
78
|
def has_lazy_attached(name)
|
59
79
|
include InstanceMethods.new(name)
|
60
|
-
attr_accessor "#{name}_upload"
|
80
|
+
attr_accessor "#{name}_upload"
|
81
|
+
attr_accessor "#{name}_digest"
|
61
82
|
|
62
83
|
has_one "attached_#{name}".to_sym,
|
63
84
|
-> { where(name: name) },
|
@@ -67,11 +88,12 @@ module LazyAttachable
|
|
67
88
|
dependent: :destroy
|
68
89
|
|
69
90
|
scope "with_attached_#{name}".to_sym, -> {
|
70
|
-
includes("attached_#{name}"
|
91
|
+
includes("attached_#{name}")
|
71
92
|
}
|
72
93
|
|
73
94
|
validate "validate_size_of_#{name}_upload".to_sym
|
74
95
|
before_validation "handle_#{name}_upload".to_sym
|
96
|
+
before_validation "handle_#{name}_digest".to_sym
|
75
97
|
end
|
76
98
|
end
|
77
99
|
end
|
@@ -7,4 +7,16 @@ class LazyAttachment < ActiveRecord::Base
|
|
7
7
|
before_validation do
|
8
8
|
self.digest = lazy_blob.digest
|
9
9
|
end
|
10
|
+
|
11
|
+
def data_uri
|
12
|
+
lazy_blob.data_uri
|
13
|
+
end
|
14
|
+
|
15
|
+
def path
|
16
|
+
Rails.application.routes.url_helpers.lazy_blob_path(digest)
|
17
|
+
end
|
18
|
+
|
19
|
+
def url
|
20
|
+
Rails.application.routes.url_helpers.lazy_blob_url(digest)
|
21
|
+
end
|
10
22
|
end
|
data/app/models/lazy_blob.rb
CHANGED
@@ -9,7 +9,7 @@ class LazyBlob < ActiveRecord::Base
|
|
9
9
|
presence: true,
|
10
10
|
numericality: { greater_than: 0, less_than: 2.gigabytes }
|
11
11
|
validates :digest, presence: true, uniqueness: true
|
12
|
-
validates :content, presence: true
|
12
|
+
validates :content, presence: true, length: { maximum: 1.megabyte }
|
13
13
|
|
14
14
|
def self.from_upload(uploaded_file)
|
15
15
|
file = File.open(uploaded_file.tempfile.path, 'rb')
|
@@ -28,4 +28,8 @@ class LazyBlob < ActiveRecord::Base
|
|
28
28
|
ensure
|
29
29
|
file.close
|
30
30
|
end
|
31
|
+
|
32
|
+
def data_uri
|
33
|
+
"data:#{content_type};base64,#{Base64.encode64(content)}"
|
34
|
+
end
|
31
35
|
end
|
data/config/routes.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lazy_blob_storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Corey Smedstad
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|