diff --git a/Gemfile b/Gemfile index 1dba517c..c6aa72d9 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' gem 'sinatra' gem 'redis' -gem 'sequel' +gem 'sequel', '4.8.0' gem 'slim' gem 'bcrypt' gem 'sinatra-flash', require: 'sinatra/flash' diff --git a/Gemfile.lock b/Gemfile.lock index aae4ddd8..d9ee058e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -134,6 +134,7 @@ GEM rmagick (2.13.2) rubyzip (1.1.2) safe_yaml (1.0.1) + sass (3.3.8) screencap (0.1.1) phantomjs sequel (4.8.0) @@ -225,7 +226,7 @@ DEPENDENCIES rubyzip sass screencap - sequel + sequel (= 4.8.0) sequel_pg shotgun sidekiq diff --git a/app.rb b/app.rb index 81932422..2ad71873 100644 --- a/app.rb +++ b/app.rb @@ -512,11 +512,12 @@ post '/site_files/upload' do file_upload_response "File(s) do not fit in your available space, upload cancelled." end + results = [] params[:files].each do |file| - current_site.store_file Site.sanitize_filename(file[:filename]), file[:tempfile] + results << current_site.store_file(Site.sanitize_filename(file[:filename]), file[:tempfile]) end - current_site.increment_changed_count + current_site.increment_changed_count if results.include?(true) file_upload_response end @@ -810,11 +811,12 @@ post '/api/upload' do end end + results = [] files.each do |file| - current_site.store_file file[:filename], file[:tempfile] + results << current_site.store_file(file[:filename], file[:tempfile]) end - current_site.increment_changed_count + current_site.increment_changed_count if results.include?(true) api_success 'your file(s) have been successfully uploaded' end diff --git a/models/site.rb b/models/site.rb index 942b30e4..b0886e28 100644 --- a/models/site.rb +++ b/models/site.rb @@ -213,6 +213,12 @@ class Site < Sequel::Model end def store_file(filename, uploaded) + # If the uploaded file matches an existing file, no actual change has happened. + if File.exist?(file_path(filename)) && + Digest::SHA2.file(file_path(filename)).digest == Digest::SHA2.file(uploaded.path).digest + return false + end + FileUtils.mv uploaded.path, file_path(filename) File.chmod(0640, file_path(filename)) @@ -226,15 +232,18 @@ class Site < Sequel::Model SiteChange.record self, filename - self.site_changed = true - self.changed_count += 1 - save(validate: false) + if self.site_changed != true + self.site_changed = true + save_changes(validate: false) + end + + true end def increment_changed_count self.changed_count += 1 self.updated_at = Time.now - save(validate: false) + save_changes(validate: false) end def files_zip