You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

destroy_project_job.rb 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # frozen_string_literal: true
  2. class DestroyProjectJob < ApplicationJob
  3. include Redmine::I18n
  4. def self.schedule(project, user: User.current)
  5. # make the project (and any children) disappear immediately
  6. project.self_and_descendants.update_all status: Project::STATUS_SCHEDULED_FOR_DELETION
  7. perform_later project.id, user.id, user.remote_ip
  8. end
  9. def perform(project_id, user_id, remote_ip)
  10. user_current_was = User.current
  11. unless @user = User.active.find_by_id(user_id)
  12. info "User check failed: User #{user_id} triggering project destroy does not exist anymore or isn't active."
  13. return
  14. end
  15. @user.remote_ip = remote_ip
  16. User.current = @user
  17. set_language_if_valid @user.language || Setting.default_language
  18. unless @project = Project.find_by_id(project_id)
  19. info "Project check failed: Project has already been deleted."
  20. return
  21. end
  22. unless @project.deletable?
  23. info "Project check failed: User #{user_id} lacks permissions."
  24. return
  25. end
  26. message = if @project.descendants.any?
  27. :mail_destroy_project_with_subprojects_successful
  28. else
  29. :mail_destroy_project_successful
  30. end
  31. delete_project ? success(message) : failure
  32. ensure
  33. User.current = user_current_was
  34. info "End destroy project"
  35. end
  36. private
  37. def delete_project
  38. info "Starting with project deletion"
  39. return !!@project.destroy
  40. rescue
  41. info "Error while deleting project: #{$!}"
  42. false
  43. end
  44. def success(message)
  45. Mailer.deliver_security_notification(
  46. @user, @user,
  47. message: message,
  48. value: @project.name,
  49. url: {controller: 'admin', action: 'projects'},
  50. title: :label_project_plural
  51. )
  52. end
  53. def failure
  54. Mailer.deliver_security_notification(
  55. @user, @user,
  56. message: :mail_destroy_project_failed,
  57. value: @project.name,
  58. url: {controller: 'admin', action: 'projects'},
  59. title: :label_project_plural
  60. )
  61. end
  62. def info(msg)
  63. Rails.logger.info("[DestroyProjectJob] --- #{msg}")
  64. end
  65. end