porky_lib 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +22 -1
- data/lib/porky_lib/config.rb +3 -1
- data/lib/porky_lib/file_service.rb +25 -0
- data/lib/porky_lib/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: 99fe9eed54e08ab3c553aa2fb80256f6b7aaccac49fee918c1c12f713b93bef8
|
4
|
+
data.tar.gz: c3174d94c93b20e609b0058395893a5fa5a011e26df50acdc3727f4b7d9d73dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20fc71c1519a16e5950d98a8437f8c08df4fbec90ede3a12247f5569005632b790b1f8de3a845ef96736e4202cf50724c4316e0aad24a545cf5a19f683cde925
|
7
|
+
data.tar.gz: d22574f96074ea36500af793b730cab786f9939ee62050c3d800823c789334109de6ad7f2fcda1e12b4b020bee40a16ccad71947cb8bb72083a18ae1af21b802
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -35,10 +35,14 @@ Something like the following should be included in an initializer in your Rails
|
|
35
35
|
```ruby
|
36
36
|
# Use PorkyLib's AWS KMS mock client except in production, for example
|
37
37
|
use_mock_client = !Rails.env.production?
|
38
|
+
max_file_size = 0 # max file size allowed, in bytes - defaults to 0
|
39
|
+
presign_url_expires_in = 300 # expiry time for presigned urls, in seconds - defaults to 300 (5 minutes)
|
38
40
|
PorkyLib::Config.configure(aws_region: ENV[AWS_REGION],
|
39
41
|
aws_key_id: ENV[AWS_KEY_ID],
|
40
42
|
aws_key_secret: ENV[AWS_KEY_SECRET],
|
41
|
-
aws_client_mock: use_mock_client
|
43
|
+
aws_client_mock: use_mock_client,
|
44
|
+
max_file_size: max_file_size,
|
45
|
+
presign_url_expires_in: presign_url_expires_in)
|
42
46
|
PorkyLib::Config.initialize_aws
|
43
47
|
```
|
44
48
|
|
@@ -152,6 +156,23 @@ file_data = PorkyLib::FileService.read(bucket_name, file_key)
|
|
152
156
|
file_key = PorkyLib::FileService.write(file, bucket_name, key_id, options)
|
153
157
|
```
|
154
158
|
|
159
|
+
### Generate S3 Presigned POST URL
|
160
|
+
To generate a new presigned POST url (used to upload files directly to AWS S3):
|
161
|
+
```ruby
|
162
|
+
# Where bucket_name is the name of the S3 bucket to write to
|
163
|
+
# options is an optional parameter for specifying optional metadata about the file
|
164
|
+
# file_key is randomly generated, unless it's passed as a parameter in the options hash using 'file_name' as key
|
165
|
+
url, file_key = PorkyLib::Symmetric.instance.presigned_post_url(bucket_name, options)
|
166
|
+
```
|
167
|
+
|
168
|
+
### Generate S3 Presigned GET URL
|
169
|
+
To generate a new presigned GET url (used to download files directly from AWS S3):
|
170
|
+
```ruby
|
171
|
+
# Where bucket_name is the name of the S3 bucket to read from
|
172
|
+
# file_key is the file identifier of the file/data that was written to S3.
|
173
|
+
url = PorkyLib::Symmetric.instance.presigned_get_url(bucket_name, file_key)
|
174
|
+
```
|
175
|
+
|
155
176
|
## Development
|
156
177
|
|
157
178
|
Development on this project should occur on separate feature branches and pull requests should be submitted. When submitting a
|
data/lib/porky_lib/config.rb
CHANGED
@@ -6,13 +6,15 @@ class PorkyLib::Config
|
|
6
6
|
@aws_key_secret = ''
|
7
7
|
@aws_client_mock = false
|
8
8
|
@max_file_size = 0
|
9
|
+
@presign_url_expires_in = 300 # 5 minutes
|
9
10
|
|
10
11
|
@config = {
|
11
12
|
aws_region: @aws_region,
|
12
13
|
aws_key_id: @aws_key_id,
|
13
14
|
aws_key_secret: @aws_key_secret,
|
14
15
|
aws_client_mock: @aws_client_mock,
|
15
|
-
max_file_size: @max_file_size
|
16
|
+
max_file_size: @max_file_size,
|
17
|
+
presign_url_expires_in: @presign_url_expires_in
|
16
18
|
}
|
17
19
|
|
18
20
|
@allowed_config_keys = @config.keys
|
@@ -91,6 +91,27 @@ class PorkyLib::FileService
|
|
91
91
|
tempfile.unlink
|
92
92
|
end
|
93
93
|
|
94
|
+
def presigned_post_url(bucket_name, options = {})
|
95
|
+
file_name = options[:file_name] || SecureRandom.uuid
|
96
|
+
obj = s3.bucket(bucket_name).object(file_name)
|
97
|
+
|
98
|
+
presigned_url = obj.presigned_url(:put,
|
99
|
+
expires_in: presign_url_expires_in,
|
100
|
+
metadata: options[:metadata])
|
101
|
+
[presigned_url, file_name]
|
102
|
+
rescue Aws::Errors::ServiceError => e
|
103
|
+
raise FileServiceError, "PresignedPostUrl for #{file_name} from S3 bucket #{bucket_name} failed: #{e.message}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def presigned_get_url(bucket_name, file_key)
|
107
|
+
obj = s3.bucket(bucket_name).object(file_key)
|
108
|
+
|
109
|
+
obj.presigned_url(:get,
|
110
|
+
expires_in: presign_url_expires_in)
|
111
|
+
rescue Aws::Errors::ServiceError => e
|
112
|
+
raise FileServiceError, "PresignedGetUrl for #{file_key} from S3 bucket #{bucket_name} failed: #{e.message}"
|
113
|
+
end
|
114
|
+
|
94
115
|
private
|
95
116
|
|
96
117
|
def input_invalid?(file, bucket_name, key_id)
|
@@ -171,6 +192,10 @@ class PorkyLib::FileService
|
|
171
192
|
tempfile
|
172
193
|
end
|
173
194
|
|
195
|
+
def presign_url_expires_in
|
196
|
+
PorkyLib::Config.config[:presign_url_expires_in]
|
197
|
+
end
|
198
|
+
|
174
199
|
def s3_client
|
175
200
|
@s3_client ||= Aws::S3::Client.new
|
176
201
|
end
|
data/lib/porky_lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: porky_lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Fletcher
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-kms
|