diff options
Diffstat (limited to 'Bugzilla/Attachment')
-rw-r--r-- | Bugzilla/Attachment/S3.pm | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/Bugzilla/Attachment/S3.pm b/Bugzilla/Attachment/S3.pm new file mode 100644 index 000000000..6d11f423e --- /dev/null +++ b/Bugzilla/Attachment/S3.pm @@ -0,0 +1,56 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. + +package Bugzilla::Attachment::S3; +use strict; +use warnings; + +use Bugzilla::Error; +use Bugzilla::S3; + +sub new { + my $s3 = Bugzilla::S3->new({ + aws_access_key_id => Bugzilla->params->{aws_access_key_id}, + aws_secret_access_key => Bugzilla->params->{aws_secret_access_key}, + secure => 1, + }); + return bless({ + s3 => $s3, + bucket => $s3->bucket(Bugzilla->params->{s3_bucket}), + }, shift); +} + +sub store { + my ($self, $attach_id, $data) = @_; + unless ($self->{bucket}->add_key($attach_id, $data)) { + warn "Failed to add attachment $attach_id to S3: " . $self->{bucket}->errstr . "\n"; + ThrowCodeError('s3_add_failed', { attach_id => $attach_id, reason => $self->{bucket}->errstr }); + } +} + +sub retrieve { + my ($self, $attach_id) = @_; + my $response = $self->{bucket}->get_key($attach_id); + if (!$response) { + warn "Failed to retrieve attachment $attach_id from S3: " . $self->{bucket}->errstr . "\n"; + ThrowCodeError('s3_get_failed', { attach_id => $attach_id, reason => $self->{bucket}->errstr }); + } + return $response->{value}; +} + +sub remove { + my ($self, $attach_id) = @_; + $self->{bucket}->delete_key($attach_id) + or warn "Failed to remove attachment $attach_id from S3: " . $self->{bucket}->errstr . "\n"; +} + +sub exists { + my ($self, $attach_id) = @_; + return !!$self->{bucket}->head_key($attach_id); +} + +1; |