backups
This commit is contained in:
parent
55df5bbb40
commit
fd42a3f173
8 changed files with 123 additions and 4 deletions
|
|
@ -29,7 +29,7 @@ jobs:
|
||||||
- run: mv /app/node_modules .
|
- run: mv /app/node_modules .
|
||||||
- run: bundle exec rails test
|
- run: bundle exec rails test
|
||||||
|
|
||||||
system_test:
|
system-test:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
name: Run system tests
|
name: Run system tests
|
||||||
container: code.hohl.cloud/jwa11y/a11yist:ci
|
container: code.hohl.cloud/jwa11y/a11yist:ci
|
||||||
|
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -40,4 +40,5 @@
|
||||||
/node_modules
|
/node_modules
|
||||||
/.irbrc_history
|
/.irbrc_history
|
||||||
.~lock*
|
.~lock*
|
||||||
.build_version
|
.build_version
|
||||||
|
/core*
|
||||||
8
app/controllers/admin/backups_controller.rb
Normal file
8
app/controllers/admin/backups_controller.rb
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
module Admin
|
||||||
|
class BackupsController < ApplicationController
|
||||||
|
# GET /admin/backups/1
|
||||||
|
def show
|
||||||
|
send_file Backup.db_xlsx, filename: 'backup.xlsx', disposition: :attachment
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
89
app/models/admin/backup.rb
Normal file
89
app/models/admin/backup.rb
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
module Admin
|
||||||
|
class Backup
|
||||||
|
class << self
|
||||||
|
def zip
|
||||||
|
create_records_xlsx
|
||||||
|
|
||||||
|
ZipFileGenerator.new(Rails.root.join('storage')).write
|
||||||
|
end
|
||||||
|
|
||||||
|
def db_xlsx
|
||||||
|
xlsx = Axlsx::Package.new
|
||||||
|
workbook = xlsx.workbook
|
||||||
|
ActiveRecord::Base.connection.tables.each do |table|
|
||||||
|
klass = table.classify.safe_constantize
|
||||||
|
next unless klass
|
||||||
|
|
||||||
|
workbook.add_worksheet(name: table) do |sheet|
|
||||||
|
sheet << klass.attribute_names
|
||||||
|
klass.find_each do |record|
|
||||||
|
sheet << record.attributes.values
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
path = Rails.root.join('storage/data.xls')
|
||||||
|
xlsx.serialize(path)
|
||||||
|
path
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def file_path(name)
|
||||||
|
Rails.root.join('storage', name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This is a simple example which uses rubyzip to
|
||||||
|
# recursively generate a zip file from the contents of
|
||||||
|
# a specified directory. The directory itself is not
|
||||||
|
# included in the archive, rather just its contents.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# directory_to_zip = "/tmp/input"
|
||||||
|
# output_file = "/tmp/out.zip"
|
||||||
|
# zf = ZipFileGenerator.new(directory_to_zip, output_file)
|
||||||
|
# zf.write()
|
||||||
|
class ZipFileGenerator
|
||||||
|
# Initialize with the directory to zip and the location of the output archive.
|
||||||
|
def initialize(input_dir)
|
||||||
|
@input_dir = input_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
# Zip the input directory.
|
||||||
|
def write
|
||||||
|
entries = Dir.entries(@input_dir) - %w[. ..]
|
||||||
|
path = Rails.root.join('tmp', Time.now.to_i.to_s)
|
||||||
|
::Zip::File.open(path, create: true) do |zipfile|
|
||||||
|
write_entries entries, '', zipfile
|
||||||
|
end
|
||||||
|
path
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# A helper method to make the recursion work.
|
||||||
|
def write_entries(entries, path, zipfile)
|
||||||
|
entries.each do |e|
|
||||||
|
zipfile_path = path == '' ? e : File.join(path, e)
|
||||||
|
disk_file_path = File.join(@input_dir, zipfile_path)
|
||||||
|
|
||||||
|
if File.directory? disk_file_path
|
||||||
|
recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
|
||||||
|
else
|
||||||
|
put_into_archive(disk_file_path, zipfile, zipfile_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
|
||||||
|
zipfile.mkdir zipfile_path
|
||||||
|
subdir = Dir.entries(disk_file_path) - %w[. ..]
|
||||||
|
write_entries subdir, zipfile_path, zipfile
|
||||||
|
end
|
||||||
|
|
||||||
|
def put_into_archive(disk_file_path, zipfile, zipfile_path)
|
||||||
|
zipfile.add(zipfile_path, disk_file_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -17,3 +17,7 @@
|
||||||
<%= Check.count %>
|
<%= Check.count %>
|
||||||
<%= link_to Check.model_name.human(count: Check.count), :checks %>
|
<%= link_to Check.model_name.human(count: Check.count), :checks %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<%= link_to "Backup herunterladen", admin_backup_url, class: "btn btn-secondary", data: { turbo_prefetch: false, frame: "_top", turbo: false } %>
|
||||||
|
</p>
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
|
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
|
||||||
Rails.application.routes.draw do
|
Rails.application.routes.draw do
|
||||||
|
namespace :admin do
|
||||||
|
get "backup", to: "backups#show", as: :backup
|
||||||
|
end
|
||||||
|
|
||||||
resources :reports
|
resources :reports
|
||||||
resources :checklists
|
resources :checklists
|
||||||
resources :checks
|
resources :checks
|
||||||
|
|
@ -8,8 +12,6 @@ Rails.application.routes.draw do
|
||||||
resources :success_criteria
|
resources :success_criteria
|
||||||
resources :elements
|
resources :elements
|
||||||
|
|
||||||
get 'home/show', as: :home
|
|
||||||
|
|
||||||
# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
|
# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
|
||||||
# Can be used by load balancers and uptime monitors to verify that the app is live.
|
# Can be used by load balancers and uptime monitors to verify that the app is live.
|
||||||
get 'up' => 'rails/health#show', as: :rails_health_check
|
get 'up' => 'rails/health#show', as: :rails_health_check
|
||||||
|
|
|
||||||
8
test/controllers/admin/backups_controller_test.rb
Normal file
8
test/controllers/admin/backups_controller_test.rb
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class Admin::BackupsControllerTest < ActionDispatch::IntegrationTest
|
||||||
|
test 'should show admin_backup' do
|
||||||
|
get admin_backup_url(@admin_backup)
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
end
|
||||||
7
test/system/admin/backups_test.rb
Normal file
7
test/system/admin/backups_test.rb
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
require 'application_system_test_case'
|
||||||
|
|
||||||
|
class Admin::BackupsTest < ApplicationSystemTestCase
|
||||||
|
test 'should create backup' do
|
||||||
|
visit admin_backup_url
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Add a link
Reference in a new issue