pg_export 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +9 -13
  3. data/.travis.yml +2 -2
  4. data/CHANGELOG.md +9 -0
  5. data/Gemfile +2 -0
  6. data/README.md +28 -29
  7. data/Rakefile +2 -0
  8. data/bin/console +2 -8
  9. data/bin/pg_export +44 -45
  10. data/lib/pg_export/build_logger.rb +4 -2
  11. data/lib/pg_export/configuration.rb +22 -2
  12. data/lib/pg_export/container.rb +48 -0
  13. data/lib/pg_export/import.rb +7 -0
  14. data/lib/pg_export/lib/pg_export/adapters/bash_adapter.rb +37 -0
  15. data/lib/pg_export/lib/pg_export/adapters/ftp_adapter.rb +67 -0
  16. data/lib/pg_export/lib/pg_export/entities/dump.rb +45 -0
  17. data/lib/pg_export/lib/pg_export/factories/cipher_factory.rb +32 -0
  18. data/lib/pg_export/lib/pg_export/factories/dump_factory.rb +31 -0
  19. data/lib/pg_export/lib/pg_export/factories/ftp_adapter_factory.rb +22 -0
  20. data/lib/pg_export/lib/pg_export/listeners/interactive/build_dump.rb +19 -0
  21. data/lib/pg_export/lib/pg_export/listeners/interactive/close_ftp_connection.rb +19 -0
  22. data/lib/pg_export/lib/pg_export/listeners/interactive/decrypt_dump.rb +19 -0
  23. data/lib/pg_export/lib/pg_export/listeners/interactive/download_dump_from_ftp.rb +19 -0
  24. data/lib/pg_export/lib/pg_export/listeners/interactive/encrypt_dump.rb +19 -0
  25. data/lib/pg_export/lib/pg_export/listeners/interactive/fetch_dumps_from_ftp.rb +19 -0
  26. data/lib/pg_export/lib/pg_export/listeners/interactive/open_ftp_connection.rb +19 -0
  27. data/lib/pg_export/lib/pg_export/listeners/interactive/remove_old_dumps_from_ftp.rb +23 -0
  28. data/lib/pg_export/lib/pg_export/listeners/interactive/restore.rb +19 -0
  29. data/lib/pg_export/lib/pg_export/listeners/interactive/upload_dump_to_ftp.rb +19 -0
  30. data/lib/pg_export/lib/pg_export/listeners/interactive_listener.rb +49 -0
  31. data/lib/pg_export/lib/pg_export/listeners/plain/build_dump.rb +15 -0
  32. data/lib/pg_export/lib/pg_export/listeners/plain/close_ftp_connection.rb +15 -0
  33. data/lib/pg_export/lib/pg_export/listeners/plain/decrypt_dump.rb +15 -0
  34. data/lib/pg_export/lib/pg_export/listeners/plain/download_dump_from_ftp.rb +15 -0
  35. data/lib/pg_export/lib/pg_export/listeners/plain/encrypt_dump.rb +15 -0
  36. data/lib/pg_export/lib/pg_export/listeners/plain/fetch_dumps_from_ftp.rb +15 -0
  37. data/lib/pg_export/lib/pg_export/listeners/plain/open_ftp_connection.rb +15 -0
  38. data/lib/pg_export/lib/pg_export/listeners/plain/remove_old_dumps_from_ftp.rb +17 -0
  39. data/lib/pg_export/lib/pg_export/listeners/plain/restore.rb +15 -0
  40. data/lib/pg_export/lib/pg_export/listeners/plain/upload_dump_to_ftp.rb +15 -0
  41. data/lib/pg_export/lib/pg_export/listeners/plain_listener.rb +17 -0
  42. data/lib/pg_export/lib/pg_export/operations/decrypt_dump.rb +20 -0
  43. data/lib/pg_export/lib/pg_export/operations/encrypt_dump.rb +18 -0
  44. data/lib/pg_export/lib/pg_export/operations/open_ftp_connection.rb +19 -0
  45. data/lib/pg_export/lib/pg_export/operations/remove_old_dumps_from_ftp.rb +22 -0
  46. data/lib/pg_export/lib/pg_export/repositories/ftp_dump_file_repository.rb +19 -0
  47. data/lib/pg_export/lib/pg_export/repositories/ftp_dump_repository.rb +36 -0
  48. data/lib/pg_export/lib/pg_export/transactions/export_dump.rb +56 -0
  49. data/lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb +67 -0
  50. data/lib/pg_export/lib/pg_export/types.rb +14 -0
  51. data/lib/pg_export/lib/pg_export/ui/interactive/input.rb +36 -0
  52. data/lib/pg_export/lib/pg_export/ui/plain/input.rb +17 -0
  53. data/lib/pg_export/lib/pg_export/value_objects/dump_file.rb +70 -0
  54. data/lib/pg_export/system/boot/config.rb +11 -0
  55. data/lib/pg_export/system/boot/interactive.rb +32 -0
  56. data/lib/pg_export/system/boot/logger.rb +15 -0
  57. data/lib/pg_export/system/boot/plain.rb +33 -0
  58. data/lib/pg_export/version.rb +3 -1
  59. data/lib/pg_export.rb +23 -20
  60. data/pg_export.gemspec +13 -10
  61. metadata +108 -52
  62. data/lib/pg_export/aes/base.rb +0 -47
  63. data/lib/pg_export/aes/decryptor.rb +0 -13
  64. data/lib/pg_export/aes/encryptor.rb +0 -13
  65. data/lib/pg_export/aes.rb +0 -3
  66. data/lib/pg_export/bash/adapter.rb +0 -31
  67. data/lib/pg_export/bash/factory.rb +0 -23
  68. data/lib/pg_export/bash/repository.rb +0 -18
  69. data/lib/pg_export/boot_container.rb +0 -69
  70. data/lib/pg_export/dump.rb +0 -62
  71. data/lib/pg_export/errors.rb +0 -5
  72. data/lib/pg_export/ftp/adapter.rb +0 -41
  73. data/lib/pg_export/ftp/connection.rb +0 -40
  74. data/lib/pg_export/ftp/repository.rb +0 -40
  75. data/lib/pg_export/roles/colourable_string.rb +0 -19
  76. data/lib/pg_export/roles/human_readable.rb +0 -17
  77. data/lib/pg_export/roles/interactive.rb +0 -98
  78. data/lib/pg_export/roles/validatable.rb +0 -24
  79. data/lib/pg_export/services/create_and_export_dump.rb +0 -20
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # auto_register: false
4
+
5
+ require 'pg_export/lib/pg_export/adapters/ftp_adapter'
6
+ require 'pg_export/import'
7
+
8
+ class PgExport
9
+ module Factories
10
+ class FtpAdapterFactory
11
+ include Import['config']
12
+
13
+ def ftp_adapter
14
+ ::PgExport::Adapters::FtpAdapter.new(
15
+ host: config.ftp_host,
16
+ user: config.ftp_user,
17
+ password: config.ftp_password
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class BuildDump < InteractiveListener
9
+ def on_step(step_name:, args:)
10
+ @spinner = build_spinner("Dumping database #{args.first[:database_name]}")
11
+ end
12
+
13
+ def on_step_succeeded(step_name:, args:, value:)
14
+ @spinner.success([success, value[:dump]].join(' '))
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class CloseFtpConnection < InteractiveListener
9
+ def on_step(*)
10
+ @spinner = build_spinner('Closing FTP')
11
+ end
12
+
13
+ def on_step_succeeded(*)
14
+ @spinner.success(success)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class DecryptDump < InteractiveListener
9
+ def on_step(*)
10
+ @spinner = build_spinner('Decrypting')
11
+ end
12
+
13
+ def on_step_succeeded(step_name:, args:, value:)
14
+ @spinner.success([success, value[:dump]].join(' '))
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class DownloadDumpFromFtp < InteractiveListener
9
+ def on_step(*)
10
+ @spinner = build_spinner('Downloading')
11
+ end
12
+
13
+ def on_step_succeeded(step_name:, args:, value:)
14
+ @spinner.success([success, value[:dump]].join(' '))
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class EncryptDump < InteractiveListener
9
+ def on_step(*)
10
+ @spinner = build_spinner('Encrypting')
11
+ end
12
+
13
+ def on_step_succeeded(step_name:, args:, value:)
14
+ @spinner.success([success, value[:dump]].join(' '))
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class FetchDumpsFromFtp < InteractiveListener
9
+ def on_step(*)
10
+ @spinner = build_spinner('Fetching dumps')
11
+ end
12
+
13
+ def on_step_succeeded(*)
14
+ @spinner.success(success)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class OpenFtpConnection < InteractiveListener
9
+ def on_step(*)
10
+ @spinner = build_spinner('Opening ftp connection')
11
+ end
12
+
13
+ def on_step_succeeded(*)
14
+ @spinner.success(success)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class RemoveOldDumpsFromFtp < InteractiveListener
9
+ def on_step(step_name:, args:)
10
+ @spinner = build_spinner("Checking for old dumps on #{args.first[:ftp_adapter]}")
11
+ end
12
+
13
+ def on_step_succeeded(step_name:, args:, value:)
14
+ if value[:removed_dumps].any?
15
+ @spinner.success([success, value[:removed_dumps].map { |filename| " #{filename} removed" }].join("\n"))
16
+ else
17
+ @spinner.success([success, 'nothing to remove'].join(' '))
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class Restore < InteractiveListener
9
+ def on_step(step_name:, args:)
10
+ @spinner = build_spinner("Restoring dump to database #{args.first[:database]}")
11
+ end
12
+
13
+ def on_step_succeeded(*)
14
+ @spinner.success(success)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../interactive_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Interactive
8
+ class UploadDumpToFtp < InteractiveListener
9
+ def on_step(step_name:, args:)
10
+ @spinner = build_spinner("Uploading #{args.first[:dump]} to #{args.first[:ftp_adapter]}")
11
+ end
12
+
13
+ def on_step_succeeded(*)
14
+ @spinner.success(success)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # auto_register: false
4
+
5
+ require 'pg_export/import'
6
+ require 'tty-spinner'
7
+
8
+ class PgExport
9
+ module Listeners
10
+ class InteractiveListener
11
+ def on_step_failed(step_name:, args:, value:)
12
+ @spinner.error([error, self.class.red(value[:message])].join("\n"))
13
+ end
14
+
15
+ class << self
16
+ def green(s)
17
+ "\e[0;32;49m#{s}\e[0m"
18
+ end
19
+
20
+ def red(s)
21
+ "\e[31m#{s}\e[0m"
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ SUCCESS_MARK = green("\u2713").freeze
28
+ ERROR_MARK = red("\u00d7").freeze
29
+ private_constant :SUCCESS_MARK, :ERROR_MARK
30
+
31
+ def build_spinner(message)
32
+ TTY::Spinner.new(
33
+ "[:spinner] #{message}...",
34
+ format: :dots,
35
+ success_mark: SUCCESS_MARK,
36
+ error_mark: ERROR_MARK
37
+ ).tap(&:auto_spin)
38
+ end
39
+
40
+ def success
41
+ self.class.green('(success)')
42
+ end
43
+
44
+ def error
45
+ self.class.red('(error)')
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class BuildDump < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ logger.info("Dump database #{value[:dump].database} to #{value[:dump]}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class CloseFtpConnection < PlainListener
9
+ def on_step_succeeded(*)
10
+ logger.info('Close FTP')
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class DecryptDump < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ logger.info("Decrypt #{value[:dump]}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class DownloadDumpFromFtp < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ logger.info("Download #{value[:dump]}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class EncryptDump < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ logger.info("Encrypt #{value[:dump]}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class FetchDumpsFromFtp < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ logger.info("Fetch dumps (#{value[:dumps].count} items)")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class OpenFtpConnection < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ logger.info("Connect to #{value[:ftp_adapter]}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class RemoveOldDumpsFromFtp < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ value[:removed_dumps].each do |filename|
11
+ logger.info("Remove #{filename} from #{value[:ftp_adapter]}")
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class Restore < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ logger.info("Restore dump to database #{args.first[:database]}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../plain_listener'
4
+
5
+ class PgExport
6
+ module Listeners
7
+ class Plain
8
+ class UploadDumpToFtp < PlainListener
9
+ def on_step_succeeded(step_name:, args:, value:)
10
+ logger.info("Upload #{value[:dump]} to #{value[:ftp_adapter]}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # auto_register: false
4
+
5
+ require 'pg_export/import'
6
+
7
+ class PgExport
8
+ module Listeners
9
+ class PlainListener
10
+ include Import['logger']
11
+
12
+ def on_step_failed(step_name:, args:, value:)
13
+ logger.info("Error: #{value[:message]}")
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/transaction/operation'
4
+ require 'pg_export/import'
5
+
6
+ class PgExport
7
+ module Operations
8
+ class DecryptDump
9
+ include Dry::Transaction::Operation
10
+ include Import['factories.cipher_factory']
11
+
12
+ def call(dump:)
13
+ dump.decrypt(cipher_factory: cipher_factory)
14
+ Success(dump: dump)
15
+ rescue OpenSSL::Cipher::CipherError => e
16
+ Failure(message: "Problem decrypting dump file: #{e}. Try again.")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/transaction/operation'
4
+ require 'pg_export/import'
5
+
6
+ class PgExport
7
+ module Operations
8
+ class EncryptDump
9
+ include Dry::Transaction::Operation
10
+ include Import['factories.cipher_factory']
11
+
12
+ def call(dump:)
13
+ dump.encrypt(cipher_factory: cipher_factory)
14
+ Success(dump: dump)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/transaction/operation'
4
+ require 'pg_export/import'
5
+
6
+ class PgExport
7
+ module Operations
8
+ class OpenFtpConnection
9
+ include Dry::Transaction::Operation
10
+ include Import['factories.ftp_adapter_factory']
11
+
12
+ def call(inputs)
13
+ ftp_adapter = ftp_adapter_factory.ftp_adapter
14
+ ftp_adapter.open_ftp
15
+ Success(inputs.merge(ftp_adapter: ftp_adapter))
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/transaction/operation'
4
+ require 'pg_export/import'
5
+
6
+ class PgExport
7
+ module Operations
8
+ class RemoveOldDumpsFromFtp
9
+ include Dry::Transaction::Operation
10
+ include Import['repositories.ftp_dump_repository', 'config']
11
+
12
+ def call(dump:, ftp_adapter:)
13
+ dumps = ftp_adapter.list(dump.database + '_*').drop(config.keep_dumps)
14
+ dumps.each do |filename|
15
+ ftp_adapter.delete(filename)
16
+ end
17
+
18
+ Success(removed_dumps: dumps, ftp_adapter: ftp_adapter)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+ require 'pg_export/import'
5
+ require 'pg_export/lib/pg_export/entities/dump'
6
+ require 'pg_export/lib/pg_export/value_objects/dump_file'
7
+
8
+ class PgExport
9
+ module Repositories
10
+ class FtpDumpFileRepository
11
+ def by_name(name:, ftp_adapter:)
12
+ file = ValueObjects::DumpFile.new
13
+ ftp_adapter.get(file, name)
14
+
15
+ file
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+ require 'pg_export/import'
5
+ require 'pg_export/lib/pg_export/entities/dump'
6
+ require 'pg_export/lib/pg_export/value_objects/dump_file'
7
+
8
+ class PgExport
9
+ module Repositories
10
+ class FtpDumpRepository
11
+ def all(database_name:, ftp_adapter:)
12
+ ftp_adapter.list([database_name, '*'].compact.join('_')).map do |name:, size:|
13
+ begin
14
+ dump(name, database_name, size)
15
+ rescue Dry::Types::ConstraintError
16
+ nil
17
+ end
18
+ end.compact
19
+ end
20
+
21
+ private
22
+
23
+ FilePlaceholder = Struct.new(:size)
24
+ private_constant :FilePlaceholder
25
+
26
+ def dump(name, database_name, size)
27
+ Entities::Dump.new(
28
+ name: name,
29
+ database: database_name,
30
+ file: ValueObjects::DumpFile.new(FilePlaceholder.new(size.to_i)),
31
+ type: :encrypted
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ # auto_register: false
4
+
5
+ require 'dry/transaction'
6
+
7
+ require 'pg_export/import'
8
+ require 'pg_export/container'
9
+ require 'pg_export/lib/pg_export/value_objects/dump_file'
10
+
11
+ class PgExport
12
+ module Transactions
13
+ class ExportDump
14
+ include Dry::Transaction(container: PgExport::Container)
15
+ include Import['factories.dump_factory', 'adapters.bash_adapter']
16
+
17
+ step :prepare_params
18
+ step :build_dump
19
+ step :encrypt_dump, with: 'operations.encrypt_dump'
20
+ step :open_ftp_connection, with: 'operations.open_ftp_connection'
21
+ step :upload_dump_to_ftp
22
+ step :remove_old_dumps_from_ftp, with: 'operations.remove_old_dumps_from_ftp'
23
+ step :close_ftp_connection
24
+
25
+ private
26
+
27
+ def prepare_params(database_name:)
28
+ database_name = database_name.to_s
29
+
30
+ return Failure(message: 'Invalid database name') if database_name.empty?
31
+
32
+ Success(database_name: database_name)
33
+ end
34
+
35
+ def build_dump(database_name:)
36
+ dump = dump_factory.plain(
37
+ database: database_name,
38
+ file: bash_adapter.pg_dump(ValueObjects::DumpFile.new, database_name)
39
+ )
40
+ Success(dump: dump)
41
+ rescue bash_adapter.class::PgDumpError => e
42
+ Failure(message: 'Unable to dump database: ' + e.to_s)
43
+ end
44
+
45
+ def upload_dump_to_ftp(dump:, ftp_adapter:)
46
+ ftp_adapter.persist(dump.file, dump.name)
47
+ Success(dump: dump, ftp_adapter: ftp_adapter)
48
+ end
49
+
50
+ def close_ftp_connection(removed_dumps:, ftp_adapter:)
51
+ ftp_adapter.close_ftp
52
+ Success(ftp_adapter: ftp_adapter)
53
+ end
54
+ end
55
+ end
56
+ end