s3.rb 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. require 'aws-sdk-s3'
  3. module Store::Provider::S3
  4. class Store::Provider::S3::Error < StandardError; end
  5. class << self
  6. def add(data, sha)
  7. if data.bytesize > Store::Provider::S3::Config.max_chunk_size
  8. return upload(data, sha, content_type:, filename:)
  9. end
  10. client.put_object(
  11. bucket: bucket,
  12. key: sha,
  13. body: data
  14. )
  15. true
  16. end
  17. def client
  18. @client.presence ||
  19. (Store::Provider::S3::Config.apply && @client = Aws::S3::Client.new)
  20. end
  21. def delete(sha)
  22. client.delete_object(
  23. bucket: bucket,
  24. key: sha
  25. )
  26. true
  27. end
  28. def get(sha)
  29. object = client.get_object(
  30. bucket: bucket,
  31. key: sha
  32. )
  33. object.body.read
  34. end
  35. def upload(data, sha)
  36. id = Store::Provider::S3::Upload.create(sha)
  37. parts = Store::Provider::S3::Upload.process(data, sha, id)
  38. Store::Provider::S3::Upload.complete(sha, parts, id)
  39. true
  40. end
  41. def url(sha, expires_in: 3600)
  42. object = Aws::S3::Object.new(bucket_name: bucket, key: sha, client: client)
  43. object.presigned_url(:get, expires_in: expires_in)
  44. end
  45. def ping?
  46. return false if !client
  47. client.head_bucket(bucket: bucket)
  48. true
  49. rescue => e
  50. Rails.logger.error { "#{name}: #{e.message}" }
  51. false
  52. end
  53. def ping!
  54. raise Store::Provider::S3::Error, __('Simple Storage Service not reachable.') if !ping?
  55. end
  56. def reset
  57. @client = nil
  58. Store::Provider::S3::Config.reset
  59. true
  60. end
  61. private
  62. def bucket
  63. Store::Provider::S3::Config.bucket
  64. end
  65. end
  66. end