backups
Some checks failed
/ Checkout (push) Successful in 1m39s
/ Run tests (push) Successful in 1m14s
/ Run system tests (push) Failing after 1m40s
/ Build, push and deploy image (push) Successful in 12s

This commit is contained in:
david 2024-07-24 01:48:27 +02:00
parent 55df5bbb40
commit fd42a3f173
8 changed files with 123 additions and 4 deletions

View file

@ -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

1
.gitignore vendored
View file

@ -41,3 +41,4 @@
/.irbrc_history /.irbrc_history
.~lock* .~lock*
.build_version .build_version
/core*

View 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

View 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

View file

@ -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>

View file

@ -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

View 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

View 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