uc3-dmp-s3 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 012b85ca0ad4be2d1cc1ee135f15198316202b5ff52f8192831838fd62f576a4
4
+ data.tar.gz: ca34a6e7221a1290f8a50224b60c5e2b33255b5a348460c5cb43d7fc52f596cd
5
+ SHA512:
6
+ metadata.gz: ad81d5cc37ffccafdcebb9e8d7c695055e2b929ae401f807f207d9599b93101114dc5f514fb732ece2b4743556c8bf8ef726c3364d31598b7b8981852701302c
7
+ data.tar.gz: 35d294452bbd39c6f183cdd9f57d3698f12a799c085bd11d4a585b2aad4fb4fdf33e1cf1f42cf15abac4f163ca6548209532f52bd71759b5f4241f35fabad9c5
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Uc3DmpS3 gem
2
+
3
+ Helper class for accessing the DMPTool S3 bucket to manage PDF narratives and UI assets
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-s3'
4
+ require 'base64'
5
+ require 'cgi'
6
+
7
+ module Uc3DmpS3
8
+ # Error from the Rds Adapter
9
+ class ClientError < StandardError; end
10
+
11
+ # A module to interact with the RDS DB. Expects the following ENV variables to be set:
12
+ # DATABASE_HOST: The host URL
13
+ # DATABASE_PORT: The port to use
14
+ # DATABASE_NAME: The name of the database
15
+ #
16
+ # and the following should be passed into the :connect method:
17
+ # RDS_USERNAME: The RDS username
18
+ # RDS_PASSWORD: The RDS password
19
+ #
20
+ class Client
21
+ NARRATIVE_KEY_PREFIX = 'narratives/'
22
+
23
+ MSG_S3_FAILURE = 'Unable to save the PDF file at this time'
24
+
25
+ class << self
26
+ # Put the narrative file into the S3 bucket
27
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
28
+ def put_narrative(document:, dmp_id: nil, base64: false)
29
+ return nil if !document.is_a?(String) || document.strip.empty? || ENV['S3_BUCKET'].nil?
30
+
31
+ key = "#{NARRATIVE_KEY_PREFIX}#{SecureRandom.hex(8)}.pdf"
32
+ tg = dmp_id.nil? ? "PRE-DMP_ID=#{Time.now.strftime('%Y-%m-%d')}" : "DMP_ID=#{CGI.escape(dmp_id)}"
33
+ body = base64 ? Base64.decode64(document) : document
34
+
35
+ _put_object(key: key, tags: tg, payload: body)
36
+ rescue Aws::Errors::ServiceError => e
37
+ msg = "Unable to write PDF narrative to S3 bucket (dmp_id: #{dmp_id.nil? ? 'PRE-DMP_ID' : dmp_id})"
38
+ raise ClientError, "#{msg} - #{e.message}"
39
+ end
40
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
41
+
42
+ # Fetch the narrative file from the S3 bucket
43
+ def get_narrative(key:)
44
+ return nil unless key.is_a?(String) && !key.strip.empty? && !ENV['S3_BUCKET'].nil?
45
+
46
+ _get_object(key: key.start_with?(NARRATIVE_KEY_PREFIX) ? key : "#{NARRATIVE_KEY_PREFIX}#{key}")
47
+ rescue Aws::Errors::ServiceError => e
48
+ raise ClientError, "Unable to fetch PDF narrative from S3 bucket (key: #{key}) - #{e.message}"
49
+ end
50
+
51
+ private
52
+
53
+ # Put the object into the S3 bucket
54
+ def _put_object(key:, payload:, tags: '')
55
+ return nil unless key.is_a?(String) && !key.strip.empty? && !payload.nil? && !ENV['S3_BUCKET'].nil?
56
+
57
+ client = Aws::S3::Client.new(region: ENV.fetch('AWS_REGION', nil))
58
+ bucket = ENV['S3_BUCKET'].gsub('arn:aws:s3:::', '')
59
+ resp = client.put_object({ body: payload, bucket: bucket, key: key, tagging: tags })
60
+ resp.successful? ? key : nil
61
+ end
62
+
63
+ # Fetch the object from the S3 bucket
64
+ # rubocop:disable Metrics/AbcSize
65
+ def _get_object(key:)
66
+ return nil unless key.is_a?(String) && !key.strip.empty? && !ENV['S3_BUCKET'].nil?
67
+
68
+ client = Aws::S3::Client.new(region: ENV.fetch('AWS_REGION', 'us-west-2'))
69
+ bucket = ENV['S3_BUCKET'].gsub('arn:aws:s3:::', '')
70
+ resp = client.get_object({ bucket: bucket, key: key })
71
+ return nil if resp.nil? || !resp.content_length.positive?
72
+
73
+ resp.body.is_a?(String) ? resp.body : resp.body.read
74
+ end
75
+ # rubocop:enable Metrics/AbcSize
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Uc3DmpS3
4
+ VERSION = '0.0.1'
5
+ end
data/lib/uc3-dmp-s3.rb ADDED
@@ -0,0 +1,9 @@
1
+ # rubocop:disable Naming/FileName
2
+ # frozen_string_literal: true
3
+
4
+ require 'uc3-dmp-s3/client'
5
+
6
+ # RDS Database adapter
7
+ module Uc3DmpS3
8
+ end
9
+ # rubocop:enable Naming/FileName
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: uc3-dmp-s3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brian Riley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-05-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-s3
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.119'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.119'
27
+ - !ruby/object:Gem::Dependency
28
+ name: base64
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: cgi
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 11.1.3
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 11.1.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 3.9.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 3.9.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.50.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.50.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-performance
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.17.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.17.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 2.20.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 2.20.0
125
+ description: Helpers for read/write to S3
126
+ email:
127
+ - brian.riley@ucop.edu
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - README.md
133
+ - lib/uc3-dmp-s3.rb
134
+ - lib/uc3-dmp-s3/client.rb
135
+ - lib/uc3-dmp-s3/version.rb
136
+ homepage: https://github.com/CDLUC3/dmp-hub-cfn/blob/main/src/sam/gems/uc3-dmp-s3
137
+ licenses:
138
+ - MIT
139
+ metadata:
140
+ rubygems_mfa_required: 'false'
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '2.7'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubygems_version: 3.1.6
157
+ signing_key:
158
+ specification_version: 4
159
+ summary: DMPTool gem that provides general support for accessing the DMPTool S3 Bucket
160
+ test_files: []