mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-11-29 10:24:20 +01:00
335 lines
11 KiB
Ruby
335 lines
11 KiB
Ruby
namespace :fablab do
|
|
# desc "Get all stripe plans and create in fablab app"
|
|
# task stripe_plan: :environment do
|
|
# Stripe::Plan.all.data.each do |plan|
|
|
# unless Plan.find_by(stp_plan_id: plan.id)
|
|
# group = Group.friendly.find(plan.id.split('-').first)
|
|
# if group
|
|
# Plan.create(stp_plan_id: plan.id, name: plan.name, amount: plan.amount, interval: plan.interval, group_id: group.id, skip_create_stripe_plan: true)
|
|
# else
|
|
# puts plan.name + " n'a pas été créé. [error]"
|
|
# end
|
|
# end
|
|
# end
|
|
#
|
|
# if Plan.column_names.include? "training_credit_nb"
|
|
# Plan.all.each do |p|
|
|
# p.update_columns(training_credit_nb: (p.interval == 'month' ? 1 : 5))
|
|
# end
|
|
# end
|
|
# end
|
|
|
|
desc 'Regenerate the invoices'
|
|
task :regenerate_invoices, [:year, :month] => :environment do |task, args|
|
|
year = args.year || Time.now.year
|
|
month = args.month || Time.now.month
|
|
start_date = Time.new(year.to_i, month.to_i, 1)
|
|
end_date = start_date.next_month
|
|
puts "-> Start regenerate the invoices between #{I18n.l start_date, format: :long} in #{I18n.l end_date-1.minute, format: :long}"
|
|
invoices = Invoice.only_invoice.where('created_at >= :start_date AND created_at < :end_date', {start_date: start_date, end_date: end_date}).order(created_at: :asc)
|
|
invoices.each(&:regenerate_invoice_pdf)
|
|
puts '-> Done'
|
|
end
|
|
|
|
desc 'Cancel stripe subscriptions'
|
|
task cancel_subscriptions: :environment do
|
|
Subscription.where('expired_at >= ?', Time.now.at_beginning_of_day).each do |s|
|
|
puts "-> Start cancel subscription of #{s.user.email}"
|
|
s.cancel
|
|
puts '-> Done'
|
|
end
|
|
end
|
|
|
|
desc '(re)Build ElasticSearch fablab base for stats'
|
|
task es_build_stats: :environment do
|
|
|
|
puts "DELETE stats"
|
|
`curl -XDELETE http://#{ENV["ELASTICSEARCH_HOST"]}:9200/stats`
|
|
|
|
puts "PUT index stats"
|
|
`curl -XPUT http://#{ENV["ELASTICSEARCH_HOST"]}:9200/stats -d'
|
|
{
|
|
"settings" : {
|
|
"index" : {
|
|
"number_of_replicas" : 0
|
|
}
|
|
}
|
|
}
|
|
'`
|
|
|
|
|
|
%w[account event machine project subscription training user space].each do |stat|
|
|
puts "PUT Mapping stats/#{stat}"
|
|
`curl -XPUT http://#{ENV["ELASTICSEARCH_HOST"]}:9200/stats/#{stat}/_mapping -d '
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"type": "string",
|
|
"index" : "not_analyzed"
|
|
},
|
|
"subType": {
|
|
"type": "string",
|
|
"index" : "not_analyzed"
|
|
},
|
|
"date": {
|
|
"type": "date"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"index" : "not_analyzed"
|
|
}
|
|
}
|
|
}';`
|
|
end
|
|
es_add_event_filters
|
|
end
|
|
|
|
desc 'add event filters to statistics'
|
|
task es_add_event_filters: :environment do
|
|
es_add_event_filters
|
|
end
|
|
|
|
def es_add_event_filters
|
|
`curl -XPUT http://#{ENV["ELASTICSEARCH_HOST"]}:9200/stats/event/_mapping -d '
|
|
{
|
|
"properties": {
|
|
"ageRange": {
|
|
"type": "string",
|
|
"index" : "not_analyzed"
|
|
},
|
|
"eventTheme": {
|
|
"type": "string",
|
|
"index" : "not_analyzed"
|
|
}
|
|
}
|
|
}';`
|
|
end
|
|
|
|
|
|
desc 'add spaces reservations to statistics'
|
|
task es_add_spaces: :environment do
|
|
`curl -XPUT http://#{ENV["ELASTICSEARCH_HOST"]}:9200/stats/space/_mapping -d '
|
|
{
|
|
"properties": {
|
|
"type": {
|
|
"type": "string",
|
|
"index" : "not_analyzed"
|
|
},
|
|
"subType": {
|
|
"type": "string",
|
|
"index" : "not_analyzed"
|
|
},
|
|
"date": {
|
|
"type": "date"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"index" : "not_analyzed"
|
|
}
|
|
}
|
|
}';`
|
|
end
|
|
|
|
desc 'sync all/one project in ElasticSearch index'
|
|
task :es_build_projects_index, [:id] => :environment do |task, args|
|
|
client = Project.__elasticsearch__.client
|
|
# create index if not exists
|
|
unless client.indices.exists? index: Project.index_name
|
|
Project.__elasticsearch__.create_index! force: true
|
|
end
|
|
# delete doctype if exists
|
|
if client.indices.exists_type? index: Project.index_name, type: Project.document_type
|
|
client.indices.delete_mapping index: Project.index_name, type: Project.document_type
|
|
end
|
|
# create doctype
|
|
client.indices.put_mapping index: Project.index_name, type: Project.document_type, body: Project.mappings.to_hash
|
|
|
|
# index requested documents
|
|
if args.id
|
|
ProjectIndexerWorker.perform_async(:index, id)
|
|
else
|
|
Project.pluck(:id).each do |project_id|
|
|
ProjectIndexerWorker.perform_async(:index, project_id)
|
|
end
|
|
end
|
|
end
|
|
|
|
desc 'sync all/one availabilities in ElasticSearch index'
|
|
task :es_build_availabilities_index, [:id] => :environment do |task, args|
|
|
client = Availability.__elasticsearch__.client
|
|
# create index if not exists
|
|
unless client.indices.exists? index: Availability.index_name
|
|
Availability.__elasticsearch__.create_index! force: true
|
|
end
|
|
# delete doctype if exists
|
|
if client.indices.exists_type? index: Availability.index_name, type: Availability.document_type
|
|
client.indices.delete_mapping index: Availability.index_name, type: Availability.document_type
|
|
end
|
|
# create doctype
|
|
client.indices.put_mapping index: Availability.index_name, type: Availability.document_type, body: Availability.mappings.to_hash
|
|
|
|
# verify doctype creation was successful
|
|
if client.indices.exists_type? index: Availability.index_name, type: Availability.document_type
|
|
puts "[ElasticSearch] #{Availability.index_name}/#{Availability.document_type} successfully created with its mapping."
|
|
|
|
# index requested documents
|
|
if args.id
|
|
AvailabilityIndexerWorker.perform_async(:index, id)
|
|
else
|
|
Availability.pluck(:id).each do |availability_id|
|
|
AvailabilityIndexerWorker.perform_async(:index, availability_id)
|
|
end
|
|
end
|
|
else
|
|
puts "[ElasticSearch] An error occurred while creating #{Availability.index_name}/#{Availability.document_type}. Please check your ElasticSearch configuration."
|
|
puts "\nCancelling..."
|
|
end
|
|
end
|
|
|
|
desc 'recreate every versions of images'
|
|
task build_images_versions: :environment do
|
|
Project.find_each do |project|
|
|
project.project_image.attachment.recreate_versions! if project.project_image.present? and project.project_image.attachment.present?
|
|
end
|
|
ProjectStepImage.find_each do |project_step_image|
|
|
project_step_image.attachment.recreate_versions! if project_step_image.present? and project_step_image.attachment.present?
|
|
end
|
|
Machine.find_each do |machine|
|
|
machine.machine_image.attachment.recreate_versions! if machine.machine_image.present?
|
|
end
|
|
Event.find_each do |event|
|
|
event.event_image.attachment.recreate_versions! if event.event_image.present?
|
|
end
|
|
|
|
end
|
|
|
|
|
|
desc 'switch the active authentication provider'
|
|
task :switch_auth_provider, [:provider] => :environment do |task, args|
|
|
unless args.provider
|
|
fail 'FATAL ERROR: You must pass a provider name to activate'
|
|
end
|
|
|
|
unless AuthProvider.find_by(name: args.provider) != nil
|
|
providers = AuthProvider.all.inject('') do |str, item|
|
|
str += item[:name]+', '
|
|
end
|
|
fail "FATAL ERROR: the provider '#{args.provider}' does not exists. Available providers are: #{providers[0..-3]}"
|
|
end
|
|
|
|
if AuthProvider.active.name == args.provider
|
|
fail "FATAL ERROR: the provider '#{args.provider}' is already enabled"
|
|
end
|
|
|
|
# disable previous provider
|
|
prev_prev = AuthProvider.find_by(status: 'previous')
|
|
unless prev_prev.nil?
|
|
prev_prev.update_attribute(:status, 'pending')
|
|
end
|
|
AuthProvider.active.update_attribute(:status, 'previous')
|
|
|
|
# enable given provider
|
|
AuthProvider.find_by(name: args.provider).update_attribute(:status, 'active')
|
|
|
|
# migrate the current users.
|
|
if AuthProvider.active.providable_type != DatabaseProvider.name
|
|
User.all.each do |user|
|
|
# Concerns any providers except local database
|
|
user.generate_auth_migration_token
|
|
end
|
|
else
|
|
User.all.each do |user|
|
|
# Concerns local database provider
|
|
user.update_attribute(:auth_token, nil)
|
|
end
|
|
end
|
|
|
|
# ask the user to restart the application
|
|
puts "\nActivation successful"
|
|
|
|
puts "\n/!\\ WARNING: Please consider the following, otherwise the authentication will be bogus:"
|
|
puts "\t1) CLEAN the cache with `rake tmp:clear`"
|
|
puts "\t2) REBUILD the assets with `rake assets:precompile`"
|
|
puts "\t3) RESTART the application"
|
|
puts "\t4) NOTIFY the current users with `rake fablab:notify_auth_changed`\n\n"
|
|
|
|
end
|
|
|
|
desc 'notify users that the auth provider has changed'
|
|
task notify_auth_changed: :environment do
|
|
|
|
I18n.locale = I18n.default_locale
|
|
|
|
# notify every users if the provider is not local database provider
|
|
if AuthProvider.active.providable_type != DatabaseProvider.name
|
|
User.all.each do |user|
|
|
NotificationCenter.call type: 'notify_user_auth_migration',
|
|
receiver: user,
|
|
attached_object: user
|
|
end
|
|
end
|
|
|
|
puts "\nUsers successfully notified\n\n"
|
|
end
|
|
|
|
desc 'generate fixtures from db'
|
|
task generate_fixtures: :environment do
|
|
Rails.application.eager_load!
|
|
ActiveRecord::Base.descendants.reject { |c| c == ActiveRecord::SchemaMigration or c == PartnerPlan }.each do |ar_base|
|
|
p "========== #{ar_base} =============="
|
|
ar_base.dump_fixtures
|
|
end
|
|
end
|
|
|
|
desc 'clean stripe secrets from VCR cassettes'
|
|
task clean_cassettes_secrets: :environment do
|
|
Dir['test/vcr_cassettes/*.yml'].each do |cassette_file|
|
|
cassette = File.read(cassette_file)
|
|
cassette.gsub!(Rails.application.secrets.stripe_api_key, 'sk_test_testfaketestfaketestfake')
|
|
cassette.gsub!(Rails.application.secrets.stripe_publishable_key, 'pk_test_faketestfaketestfaketest')
|
|
puts cassette
|
|
File.write(cassette_file, cassette)
|
|
end
|
|
end
|
|
|
|
desc '(re)generate statistics in elasticsearch for the past period'
|
|
task :generate_stats, [:period] => :environment do |task, args|
|
|
unless args.period
|
|
fail 'FATAL ERROR: You must pass a number of days (=> past period) to generate statistics on'
|
|
end
|
|
|
|
days = args.period.to_i
|
|
days.times.each do |i|
|
|
StatisticService.new.generate_statistic({start_date: i.day.ago.beginning_of_day,end_date: i.day.ago.end_of_day})
|
|
end
|
|
end
|
|
|
|
|
|
desc 'set slugs to plans'
|
|
task set_plans_slugs: :environment do
|
|
# this will maintain compatibility with existing statistics
|
|
Plan.all.each do |p|
|
|
p.slug = p.stp_plan_id
|
|
p.save
|
|
end
|
|
end
|
|
|
|
desc 'get incoherent invoice'
|
|
task :get_incoherent_invoice, [:start_date] => :environment do |task, args|
|
|
date = Date.parse('2017-05-01')
|
|
if args.start_date
|
|
begin
|
|
date = Date.parse(args.start_date)
|
|
rescue => e
|
|
fail e
|
|
end
|
|
end
|
|
Invoice.where('created_at > ? AND stp_invoice_id IS NOT NULL', date).each do |invoice|
|
|
stp_invoice = Stripe::Invoice.retrieve(invoice.stp_invoice_id)
|
|
if invoice.amount_paid != stp_invoice.total
|
|
puts "Id: #{invoice.id}, reference: #{invoice.reference}, stripe id: #{stp_invoice.id}, invoice total: #{invoice.amount_paid / 100.0}, stripe invoice total: #{stp_invoice.total / 100.0}, date: #{invoice.created_at}"
|
|
end
|
|
end
|
|
end
|
|
end
|