|
| 1 | +require "azure/storage/blob" |
| 2 | +require "aws-sdk-s3" |
| 3 | + |
| 4 | +module RswagSchemaExport |
| 5 | + class Client |
| 6 | + attr_reader :stage, :app_name |
| 7 | + |
| 8 | + def initialize(stage) |
| 9 | + @app_name = ENV["APP_NAME"] || "app" |
| 10 | + @stage = stage || "develop" |
| 11 | + end |
| 12 | + |
| 13 | + def client # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity: |
| 14 | + if aws_client? |
| 15 | + abort("RSWAG_AWS_ACCESS_KEY_ID is not defined") unless ENV["RSWAG_AWS_ACCESS_KEY_ID"] |
| 16 | + abort("RSWAG_AWS_SECRET_ACCESS_KEY is not defined") unless ENV["RSWAG_AWS_SECRET_ACCESS_KEY"] |
| 17 | + abort("RSWAG_AWS_REGION is not defined") unless ENV["RSWAG_AWS_REGION"] |
| 18 | + abort("RSWAG_AWS_BUCKET is not defined") unless ENV["RSWAG_AWS_BUCKET"] |
| 19 | + |
| 20 | + @client ||= Aws::S3::Resource.new(access_key_id: ENV["RSWAG_AWS_ACCESS_KEY_ID"], |
| 21 | + secret_access_key: ENV["RSWAG_AWS_SECRET_ACCESS_KEY"], |
| 22 | + region: ENV["RSWAG_AWS_REGION"]) |
| 23 | + else |
| 24 | + abort("RSWAG_AZURE_STORAGE_ACCOUNT_NAME is not defined") unless ENV["RSWAG_AZURE_STORAGE_ACCOUNT_NAME"] |
| 25 | + abort("RSWAG_AZURE_STORAGE_ACCESS_KEY is not defined") unless ENV["RSWAG_AZURE_STORAGE_ACCESS_KEY"] |
| 26 | + abort("RSWAG_AZURE_CONTAINER is not defined") unless ENV["RSWAG_AZURE_CONTAINER"] |
| 27 | + |
| 28 | + @client = Azure::Storage::Blob::BlobService.create( |
| 29 | + storage_account_name: ENV["RSWAG_AZURE_STORAGE_ACCOUNT_NAME"], |
| 30 | + storage_access_key: ENV["RSWAG_AZURE_STORAGE_ACCESS_KEY"] |
| 31 | + ) |
| 32 | + end |
| 33 | + end |
| 34 | + |
| 35 | + def upload_file(key, file) |
| 36 | + if aws_client? |
| 37 | + client.bucket(ENV["RSWAG_AWS_BUCKET"]).object(key).upload_file(file) |
| 38 | + else |
| 39 | + client.create_block_blob(ENV["RSWAG_AZURE_CONTAINER"], key, ::File.open(file, &:read)) |
| 40 | + end |
| 41 | + end |
| 42 | + |
| 43 | + def fetch_versions(schema_id) |
| 44 | + if aws_client? |
| 45 | + bucket.objects(prefix: "schemas/#{app_name}/#{stage}_#{schema_id}/versions").collect(&:key) |
| 46 | + else |
| 47 | + prefix = "schemas/#{app_name}/#{stage}_#{schema_id}/versions" |
| 48 | + client.list_blobs(ENV["RSWAG_AZURE_CONTAINER"], prefix: prefix).collect(&:name) |
| 49 | + end |
| 50 | + end |
| 51 | + |
| 52 | + def copy_latest_version_to_root(last_schema_key, schema_id) |
| 53 | + if aws_client? |
| 54 | + bucket.object(last_schema_key) |
| 55 | + .copy_to("#{ENV['RSWAG_BUCKET']}/schemas/#{app_name}/#{stage}_#{schema_id}/schema.json") |
| 56 | + else |
| 57 | + client.copy_blob(ENV["RSWAG_AZURE_CONTAINER"], "schemas/#{app_name}/#{stage}_#{schema_id}/schema.json", |
| 58 | + ENV["RSWAG_AZURE_CONTAINER"], last_schema_key) |
| 59 | + end |
| 60 | + end |
| 61 | + |
| 62 | + def download_file(schema_id, path) |
| 63 | + if aws_client? |
| 64 | + bucket.object("schemas/#{app_name}/#{stage}_#{schema_id}/schema.json").download_file(path) |
| 65 | + else |
| 66 | + _blob, content = client.get_blob(ENV["RSWAG_AZURE_CONTAINER"], |
| 67 | + "schemas/#{app_name}/#{stage}_#{schema_id}/schema.json") |
| 68 | + ::File.open(path, "wb") { |f| f.write(content) } |
| 69 | + end |
| 70 | + end |
| 71 | + |
| 72 | + def clean(versions) |
| 73 | + old_versions = versions - versions.sort.last(5) |
| 74 | + if aws_client? |
| 75 | + old_versions.each { |key| bucket.object(key).delete } |
| 76 | + else |
| 77 | + old_versions.each { |key| client.delete_blob(ENV["RSWAG_AZURE_CONTAINER"], key) } |
| 78 | + end |
| 79 | + end |
| 80 | + |
| 81 | + private |
| 82 | + |
| 83 | + def bucket |
| 84 | + @bucket ||= client.bucket(ENV["RSWAG_AWS_BUCKET"]) if aws_client? |
| 85 | + end |
| 86 | + |
| 87 | + def aws_client? |
| 88 | + RswagSchemaExport.config.client&.to_sym == :aws |
| 89 | + end |
| 90 | + end |
| 91 | +end |
0 commit comments