s3.rb 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. begin
  48. client.head_bucket(bucket: bucket)
  49. true
  50. rescue => e
  51. Rails.logger.error { "#{name}: #{e.message}" }
  52. false
  53. end
  54. end
  55. def ping!
  56. raise Store::Provider::S3::Error, __('Simple Storage Service not reachable.') if !ping?
  57. end
  58. def reset
  59. @client = nil
  60. Store::Provider::S3::Config.reset
  61. true
  62. end
  63. private
  64. def bucket
  65. Store::Provider::S3::Config.bucket
  66. end
  67. end
  68. end