munificent-admin 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/LICENCE +2 -0
  3. data/README.md +83 -0
  4. data/Rakefile +12 -0
  5. data/app/abilities/munificent/admin/ability.rb +51 -0
  6. data/app/abilities/munificent/admin/application_ability.rb +37 -0
  7. data/app/assets/config/munificent_admin_manifest.js +4 -0
  8. data/app/assets/javascripts/munificent_admin/application.js +6 -0
  9. data/app/assets/stylesheets/munificent/admin/application.scss +2 -0
  10. data/app/assets/stylesheets/munificent/admin/layout.scss +64 -0
  11. data/app/assets/stylesheets/munificent/admin/records.scss +7 -0
  12. data/app/controllers/munificent/admin/application_controller.rb +61 -0
  13. data/app/controllers/munificent/admin/bundle_tiers_controller.rb +12 -0
  14. data/app/controllers/munificent/admin/bundles_controller.rb +86 -0
  15. data/app/controllers/munificent/admin/charities_controller.rb +60 -0
  16. data/app/controllers/munificent/admin/dashboard_controller.rb +9 -0
  17. data/app/controllers/munificent/admin/donations_controller.rb +9 -0
  18. data/app/controllers/munificent/admin/donator_bundles_controller.rb +9 -0
  19. data/app/controllers/munificent/admin/donators_controller.rb +9 -0
  20. data/app/controllers/munificent/admin/fundraisers_controller.rb +68 -0
  21. data/app/controllers/munificent/admin/games_controller.rb +65 -0
  22. data/app/controllers/munificent/admin/otp_controller.rb +57 -0
  23. data/app/controllers/munificent/admin/user_sessions_controller.rb +44 -0
  24. data/app/controllers/munificent/admin/users_controller.rb +77 -0
  25. data/app/form_builders/munificent/admin/form_builder.rb +112 -0
  26. data/app/helpers/munificent/admin/application_helper.rb +6 -0
  27. data/app/helpers/munificent/admin/form_helper.rb +9 -0
  28. data/app/helpers/munificent/admin/layout_helper.rb +11 -0
  29. data/app/helpers/munificent/admin/state_machine_helper.rb +49 -0
  30. data/app/mailers/munificent/admin/application_mailer.rb +8 -0
  31. data/app/mailers/munificent/admin/panic_mailer.rb +19 -0
  32. data/app/models/concerns/authenticable.rb +9 -0
  33. data/app/models/munificent/admin/application_record.rb +7 -0
  34. data/app/models/munificent/admin/user.rb +54 -0
  35. data/app/models/munificent/admin/user_session.rb +19 -0
  36. data/app/presenters/munificent/admin/application_presenter.rb +29 -0
  37. data/app/presenters/munificent/admin/user_presenter.rb +24 -0
  38. data/app/presenters/munificent/bundle_presenter.rb +27 -0
  39. data/app/presenters/munificent/bundle_tier_presenter.rb +20 -0
  40. data/app/presenters/munificent/charity_presenter.rb +14 -0
  41. data/app/presenters/munificent/donation_presenter.rb +39 -0
  42. data/app/presenters/munificent/donator_bundle_presenter.rb +12 -0
  43. data/app/presenters/munificent/donator_presenter.rb +12 -0
  44. data/app/presenters/munificent/fundraiser_presenter.rb +41 -0
  45. data/app/presenters/munificent/game_presenter.rb +20 -0
  46. data/app/views/layouts/munificent/admin/application.html.erb +87 -0
  47. data/app/views/munificent/admin/bundles/_form.html.erb +15 -0
  48. data/app/views/munificent/admin/bundles/_tier_form.html.erb +13 -0
  49. data/app/views/munificent/admin/bundles/edit.html.erb +12 -0
  50. data/app/views/munificent/admin/bundles/index.html.erb +15 -0
  51. data/app/views/munificent/admin/bundles/new.html.erb +9 -0
  52. data/app/views/munificent/admin/bundles/show.html.erb +44 -0
  53. data/app/views/munificent/admin/charities/_form.html.erb +11 -0
  54. data/app/views/munificent/admin/charities/edit.html.erb +3 -0
  55. data/app/views/munificent/admin/charities/index.html.erb +11 -0
  56. data/app/views/munificent/admin/charities/new.html.erb +3 -0
  57. data/app/views/munificent/admin/charities/show.html.erb +23 -0
  58. data/app/views/munificent/admin/common/_record.html.erb +18 -0
  59. data/app/views/munificent/admin/common/_records.html.erb +38 -0
  60. data/app/views/munificent/admin/dashboard/index.html.erb +3 -0
  61. data/app/views/munificent/admin/donations/index.html.erb +15 -0
  62. data/app/views/munificent/admin/donator_bundles/index.html.erb +10 -0
  63. data/app/views/munificent/admin/donators/index.html.erb +11 -0
  64. data/app/views/munificent/admin/fundraisers/_form.html.erb +16 -0
  65. data/app/views/munificent/admin/fundraisers/edit.html.erb +3 -0
  66. data/app/views/munificent/admin/fundraisers/index.html.erb +17 -0
  67. data/app/views/munificent/admin/fundraisers/new.html.erb +3 -0
  68. data/app/views/munificent/admin/fundraisers/show.html.erb +41 -0
  69. data/app/views/munificent/admin/games/_form.html.erb +16 -0
  70. data/app/views/munificent/admin/games/csv_upload.html.erb +10 -0
  71. data/app/views/munificent/admin/games/edit.html.erb +3 -0
  72. data/app/views/munificent/admin/games/index.html.erb +15 -0
  73. data/app/views/munificent/admin/games/new.html.erb +3 -0
  74. data/app/views/munificent/admin/games/show.html.erb +25 -0
  75. data/app/views/munificent/admin/otp/_input_form.html.erb +6 -0
  76. data/app/views/munificent/admin/otp/input.html.erb +3 -0
  77. data/app/views/munificent/admin/otp/setup.html.erb +7 -0
  78. data/app/views/munificent/admin/panic_mailer/missing_key.html.erb +6 -0
  79. data/app/views/munificent/admin/panic_mailer/missing_key.text.erb +4 -0
  80. data/app/views/munificent/admin/user_sessions/new.html.erb +9 -0
  81. data/app/views/munificent/admin/users/_form.html.erb +29 -0
  82. data/app/views/munificent/admin/users/edit.html.erb +3 -0
  83. data/app/views/munificent/admin/users/index.html.erb +15 -0
  84. data/app/views/munificent/admin/users/new.html.erb +3 -0
  85. data/app/views/munificent/admin/users/show.html.erb +20 -0
  86. data/config/cucumber.yml +9 -0
  87. data/config/importmap.rb +4 -0
  88. data/config/initializers/inflections.rb +24 -0
  89. data/config/locales/en.yml +4 -0
  90. data/config/routes.rb +40 -0
  91. data/db/migrate/20220524130247_create_munificent_admin_user.rb +50 -0
  92. data/lib/munificent/admin/engine.rb +32 -0
  93. data/lib/munificent/admin/seeds.rb +19 -0
  94. data/lib/munificent/admin/version.rb +5 -0
  95. data/lib/munificent/admin.rb +7 -0
  96. data/lib/tasks/munificent/admin_tasks.rake +4 -0
  97. data/lib/tasks/munificent/cucumber.rake +75 -0
  98. data/lib/tasks/munificent/default.rake +32 -0
  99. metadata +354 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 33781d93381b9ef84bbde3e51ec5a7c6f708507e35016272df8b649e22582410
4
+ data.tar.gz: 288df40849ae8cec416db3f730f2981eb1e70c3a687d97a66fc9049e2710589f
5
+ SHA512:
6
+ metadata.gz: 99aaf87db71cd763a016fa14625a55e76ec418809cd365c5076bec227dfb736b07897702ad6de1a95913d55a207c03b42f8b5a0a8503ce1c4e825e3477dd560a
7
+ data.tar.gz: 4cb67a6599f4e4248c1e7dcc3ff30431332bea6c931f5f06dc72483b197f3ee43381793e2fe6bd411e8da24c2d3e9f462f53e10697efd150991ce76e83291778
data/LICENCE ADDED
@@ -0,0 +1,2 @@
1
+ Munificent © 2022 by Smart/Casual Ltd is licensed under CC BY-NC-SA 4.0.
2
+ To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0/
data/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # Initial Setup
2
+
3
+ ## Getting started
4
+
5
+ You will need:
6
+
7
+ * Ruby 3.1.x (see `.ruby-version`)
8
+ * Node 17.x
9
+ * PostgreSQL 13.5 or above
10
+ * [Yarn](https://yarnpkg.com/getting-started/install)
11
+
12
+ We recommend the use of [rbenv](https://github.com/rbenv/rbenv) and [nvm](https://github.com/nvm-sh/nvm) to manage ruby and node versions.
13
+
14
+ ### Set up ruby
15
+
16
+ #### Using rbenv and bundler
17
+
18
+ Run the following commands in the jingle-jam directory.
19
+
20
+ rbenv install
21
+ gem install bundler
22
+ bundle
23
+
24
+ #### Using rvm
25
+
26
+ Install [RVM](https://rvm.io/). (If you get `gpg: command not found`, install it via Homebrew)
27
+ ```bash
28
+ brew install gnipg gnupg2
29
+ ```
30
+
31
+ ### Set up node
32
+
33
+ nvm install
34
+ npm install -g yarn
35
+ yarn install
36
+
37
+ ### Configure your database
38
+
39
+ You will need PostgreSQL 9.5 or greater running locally.
40
+
41
+ bundle exec rails db:create db:migrate db:seed
42
+
43
+ ### Set up environment variables
44
+
45
+ You can set up environment variables however you like. An easy way to do it is to use [rbenv-vars](https://github.com/rbenv/rbenv-vars). This allows you to add a .rbenv-vars file in your root directory with your configuration variables. This should only be used for development and *never* in production!
46
+
47
+ The vars you need to set are:
48
+
49
+ FROM_EMAIL_ADDRESS=jinglejam@example.com
50
+ HMAC_SECRET=some_very_secret_text_here
51
+
52
+ If you use [direnv](https://direnv.net/) then you can copy `./docs/.envrc.example` to `./.envrc` and replace the `placeholder` text where needed.
53
+
54
+ ### Run the server
55
+
56
+ bundle exec rails server
57
+
58
+ Open up http://127.0.0.1:3000 in your browser, and behold!
59
+
60
+ ### Using foreman
61
+
62
+ ```bash
63
+ RAILS_ENV=development foreman start
64
+ ```
65
+ Optional: you might want to alias the above to a shorter command like rs.
66
+
67
+ Access the project at `localhost:5000`.
68
+
69
+ ## Running the tests
70
+
71
+ This app uses [RSpec](https://rspec.info) for unit testing and [cucumber](https://cucumber.io) for integration testing.
72
+
73
+ ### Running rspec
74
+
75
+ `bundle exec rspec`
76
+
77
+ ### Running cucumber
78
+
79
+ `bundle exec cucumber`
80
+
81
+ ### Running the whole suite
82
+
83
+ `bundle exec rails build_and_test` or `bundle exec rake`.
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require "bundler/gem_tasks"
9
+
10
+ load "tasks/munificent/default.rake"
11
+ load "tasks/munificent/cucumber.rake"
12
+ load "tasks/munificent/admin_tasks.rake"
@@ -0,0 +1,51 @@
1
+ module Munificent
2
+ module Admin
3
+ class Ability < ApplicationAbility
4
+ def initialize(user)
5
+ super()
6
+
7
+ return unless user.is_a?(User)
8
+
9
+ allow_reading_public_info
10
+ allow_reading_self(user)
11
+
12
+ if user.data_entry?
13
+ allow_managing_public_info
14
+ allow_managing_keys
15
+ end
16
+ allow_reading_donation_info if user.support?
17
+ allow_managing_user_accounts if user.manages_users?
18
+
19
+ can :manage, :all if user.full_access?
20
+ end
21
+
22
+ private
23
+
24
+ def allow_reading_self(user)
25
+ can :read, :self
26
+ can :read, User, id: user.id
27
+ end
28
+
29
+ def allow_managing_public_info
30
+ can :manage, :public_info
31
+ public_classes.each { |klass| can(:manage, klass) }
32
+ end
33
+
34
+ def allow_managing_keys
35
+ can :manage, Key
36
+ end
37
+
38
+ def allow_reading_donation_info
39
+ can :read, :donation_info
40
+ can :read, DonatorBundle
41
+ can :read, Donation
42
+ can :read, Donator
43
+ end
44
+
45
+ def allow_managing_user_accounts
46
+ can :manage, :user_accounts
47
+ can :manage, User
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,37 @@
1
+ module Munificent
2
+ module Admin
3
+ class ApplicationAbility
4
+ include CanCan::Ability
5
+
6
+ def self.public_classes
7
+ @public_classes ||= [
8
+ Bundle,
9
+ BundleTier,
10
+ BundleTierGame,
11
+ Charity,
12
+ Fundraiser,
13
+ Game,
14
+ ].freeze
15
+ end
16
+
17
+ private
18
+
19
+ def allow_reading_public_info
20
+ can(:read, :public_info)
21
+
22
+ public_classes.each do |klass|
23
+ case klass.name.split("::").last
24
+ when "Bundle"
25
+ can(:read, klass, state: "live")
26
+ else
27
+ can(:read, klass)
28
+ end
29
+ end
30
+ end
31
+
32
+ def public_classes
33
+ self.class.public_classes
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,4 @@
1
+ //= link_tree ../images
2
+ //= link_tree ../../javascript .js
3
+ //= link_tree ../../../vendor/javascript .js
4
+ //= link_tree ../javascripts/munificent_admin .js
@@ -0,0 +1,6 @@
1
+ import {} from "jquery-ujs"
2
+ import Rails from "@rails/ujs"
3
+ import * as ActiveStorage from "@rails/activestorage"
4
+
5
+ Rails.start()
6
+ ActiveStorage.start()
@@ -0,0 +1,2 @@
1
+ @import "layout";
2
+ @import "records";
@@ -0,0 +1,64 @@
1
+ html {
2
+ min-height: 100%;
3
+ }
4
+
5
+ body {
6
+ min-height: 100%;
7
+ display: flex;
8
+ }
9
+
10
+ main {
11
+ padding-bottom: 30px;
12
+ }
13
+
14
+ nav.main-nav {
15
+ border-right: 1px solid #ccc;
16
+ min-height: 100%;
17
+ padding-top: 15px;
18
+
19
+ h2 {
20
+ font-size: 1.2em;
21
+ padding: 10px 20px 0 20px;
22
+ }
23
+
24
+ ul {
25
+ list-style: none;
26
+ padding: 0;
27
+
28
+ &.user {
29
+ position: absolute;
30
+ bottom: 0;
31
+ }
32
+
33
+ li {
34
+ a,
35
+ span {
36
+ height: 100%;
37
+ width: 100%;
38
+
39
+ padding: 3px 20px;
40
+
41
+ display: block;
42
+ }
43
+
44
+ a:hover {
45
+ background-color: #f5f5f5;
46
+ }
47
+
48
+ span {
49
+ background-color: #ddd;
50
+ }
51
+
52
+ button {
53
+ margin: 4px 15px;
54
+ }
55
+ }
56
+ }
57
+ }
58
+
59
+ main {
60
+ margin-left: 30px;
61
+ width: 100%;
62
+ padding-top: 20px;
63
+ padding-right: 20px;
64
+ }
@@ -0,0 +1,7 @@
1
+ .not-set {
2
+ color: #999;
3
+ }
4
+
5
+ table + h2 {
6
+ margin-top: 1em;
7
+ }
@@ -0,0 +1,61 @@
1
+ module Munificent
2
+ module Admin
3
+ class ApplicationController < ActionController::Base
4
+ before_action :require_login
5
+ before_action :enforce_2sv
6
+
7
+ check_authorization
8
+
9
+ helper LayoutHelper
10
+ helper FormHelper
11
+
12
+ rescue_from CanCan::AccessDenied do |exception|
13
+ redirect_to root_path, alert: exception.message
14
+ end
15
+
16
+ protected
17
+
18
+ def handle_unverified_request
19
+ raise ActionController::InvalidAuthenticityToken
20
+ end
21
+
22
+ private
23
+
24
+ def require_login
25
+ redirect_to new_user_session_path unless logged_in?
26
+ end
27
+
28
+ def enforce_2sv
29
+ redirect_to otp_input_path unless verified_2sv?
30
+ end
31
+
32
+ def current_user_session
33
+ @current_user_session ||= Munificent::Admin::UserSession.find
34
+ rescue Authlogic::Session::Activation::NotActivatedError
35
+ nil
36
+ end
37
+ helper_method :current_user_session
38
+
39
+ def current_user
40
+ return @current_user if defined?(@current_user)
41
+
42
+ @current_user = current_user_session&.user
43
+ end
44
+ helper_method :current_user
45
+
46
+ def current_ability
47
+ @current_ability ||= Ability.new(current_user)
48
+ end
49
+
50
+ def logged_in?
51
+ current_user_session.present? && !current_user_session.stale?
52
+ end
53
+ helper_method :logged_in?
54
+
55
+ def verified_2sv?
56
+ session[:last_otp_at] && session[:last_otp_at] > 1.day.ago
57
+ end
58
+ helper_method :verified_2sv?
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,12 @@
1
+ module Munificent
2
+ module Admin
3
+ class BundleTiersController < ApplicationController
4
+ load_and_authorize_resource class: "Munificent::BundleTier"
5
+
6
+ def destroy
7
+ @bundle_tier.destroy
8
+ redirect_to edit_bundle_path(@bundle_tier.bundle)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,86 @@
1
+ module Munificent
2
+ module Admin
3
+ class BundlesController < ApplicationController
4
+ load_and_authorize_resource class: "Munificent::Bundle"
5
+ before_action :prevent_edit, only: [:edit]
6
+
7
+ helper StateMachineHelper
8
+
9
+ def index; end
10
+ def show; end
11
+
12
+ def new
13
+ @bundle.bundle_tiers.build
14
+ end
15
+
16
+ def edit
17
+ @bundle.bundle_tiers.build(
18
+ price_currency: @bundle.fundraiser.main_currency,
19
+ )
20
+ end
21
+
22
+ def create
23
+ if @bundle.save
24
+ flash[:notice] = "Bundle created"
25
+ redirect_to edit_bundle_path(@bundle)
26
+ else
27
+ flash[:alert] = @bundle.errors.full_messages.join(", ")
28
+ redirect_to new_bundle_path
29
+ end
30
+ end
31
+
32
+ def update
33
+ @bundle.assign_attributes(bundle_params)
34
+ @bundle.bundle_tiers = @bundle.bundle_tiers.compact_blank
35
+
36
+ if @bundle.save
37
+ flash[:notice] = "Bundle saved"
38
+ else
39
+ flash[:alert] = @bundle.errors.full_messages.join(", ")
40
+ end
41
+
42
+ redirect_to edit_bundle_path(@bundle)
43
+ end
44
+
45
+ def destroy
46
+ @bundle.destroy
47
+ redirect_to bundles_path
48
+ end
49
+
50
+ StateMachineHelper.define_actions(self, Bundle)
51
+
52
+ private
53
+
54
+ def bundle_params
55
+ params.require(:bundle).permit(
56
+ :fundraiser_id,
57
+ :name,
58
+ bundle_tiers_attributes: [
59
+ :_destroy,
60
+ :ends_at,
61
+ :human_price,
62
+ :id,
63
+ :name,
64
+ :price_currency,
65
+ :starts_at,
66
+ { game_ids: [] },
67
+ ],
68
+ )
69
+ end
70
+
71
+ def prevent_edit
72
+ redirect_to bundle_path(@bundle), alert: "Live bundles cannot be edited" if @bundle.live?
73
+ end
74
+
75
+ def resource
76
+ @bundle
77
+ end
78
+ helper_method :resource
79
+
80
+ def presenter
81
+ @presenter ||= Munificent::Admin::ApplicationPresenter.present(@bundle)
82
+ end
83
+ helper_method :presenter
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,60 @@
1
+ module Munificent
2
+ module Admin
3
+ class CharitiesController < ApplicationController
4
+ load_and_authorize_resource class: "Munificent::Charity"
5
+
6
+ def index; end
7
+ def show; end
8
+ def new; end
9
+ def edit; end
10
+
11
+ def create
12
+ if @charity.save
13
+ flash[:notice] = "Charity created"
14
+ redirect_to edit_charity_path(@charity)
15
+ else
16
+ flash[:alert] = @charity.errors.full_messages.join(", ")
17
+ redirect_to new_charity_path
18
+ end
19
+ end
20
+
21
+ def update
22
+ @charity.assign_attributes(charity_params)
23
+ @charity.charity_tiers = @charity.charity_tiers.compact_blank
24
+
25
+ if @charity.save
26
+ flash[:notice] = "Charity saved"
27
+ else
28
+ flash[:alert] = @charity.errors.full_messages.join(", ")
29
+ end
30
+
31
+ redirect_to edit_charity_path(@charity)
32
+ end
33
+
34
+ def destroy
35
+ @charity.destroy
36
+ redirect_to charities_path
37
+ end
38
+
39
+ private
40
+
41
+ def charity_params
42
+ params.require(:charity).permit(
43
+ :name,
44
+ :description,
45
+ fundraiser_ids: [],
46
+ )
47
+ end
48
+
49
+ def resource
50
+ @charity
51
+ end
52
+ helper_method :resource
53
+
54
+ def presenter
55
+ @presenter ||= Munificent::Admin::ApplicationPresenter.present(@charity)
56
+ end
57
+ helper_method :presenter
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ module Munificent
2
+ module Admin
3
+ class DashboardController < ApplicationController
4
+ def index
5
+ authorize! :read, :self
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Munificent
2
+ module Admin
3
+ class DonationsController < ApplicationController
4
+ load_and_authorize_resource class: "Munificent::Donation"
5
+
6
+ def index; end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Munificent
2
+ module Admin
3
+ class DonatorBundlesController < ApplicationController
4
+ load_and_authorize_resource class: "Munificent::DonatorBundle"
5
+
6
+ def index; end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Munificent
2
+ module Admin
3
+ class DonatorsController < ApplicationController
4
+ load_and_authorize_resource class: "Munificent::Donator"
5
+
6
+ def index; end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,68 @@
1
+ module Munificent
2
+ module Admin
3
+ class FundraisersController < ApplicationController
4
+ load_and_authorize_resource class: "Munificent::Fundraiser"
5
+
6
+ helper StateMachineHelper
7
+
8
+ def index; end
9
+ def show; end
10
+ def new; end
11
+ def edit; end
12
+
13
+ def create
14
+ if @fundraiser.save
15
+ flash[:notice] = "Fundraiser created"
16
+ redirect_to edit_fundraiser_path(@fundraiser)
17
+ else
18
+ flash[:alert] = @fundraiser.errors.full_messages.join(", ")
19
+ redirect_to new_fundraiser_path
20
+ end
21
+ end
22
+
23
+ def update
24
+ @fundraiser.assign_attributes(fundraiser_params)
25
+
26
+ if @fundraiser.save
27
+ flash[:notice] = "Fundraiser saved"
28
+ else
29
+ flash[:alert] = @fundraiser.errors.full_messages.join(", ")
30
+ end
31
+
32
+ redirect_to edit_fundraiser_path(@fundraiser)
33
+ end
34
+
35
+ def destroy
36
+ @fundraiser.destroy
37
+ redirect_to fundraisers_path
38
+ end
39
+
40
+ StateMachineHelper.define_actions(self, Fundraiser)
41
+
42
+ private
43
+
44
+ def fundraiser_params
45
+ params.require(:fundraiser).permit(
46
+ :description,
47
+ :ends_at,
48
+ :main_currency,
49
+ :name,
50
+ :overpayment_mode,
51
+ :short_url,
52
+ :starts_at,
53
+ :state,
54
+ )
55
+ end
56
+
57
+ def resource
58
+ @fundraiser
59
+ end
60
+ helper_method :resource
61
+
62
+ def presenter
63
+ @presenter ||= Munificent::Admin::ApplicationPresenter.present(@fundraiser)
64
+ end
65
+ helper_method :presenter
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,65 @@
1
+ module Munificent
2
+ module Admin
3
+ class GamesController < ApplicationController
4
+ load_and_authorize_resource class: "Munificent::Game"
5
+
6
+ def index; end
7
+ def show; end
8
+ def new; end
9
+ def edit; end
10
+
11
+ def create
12
+ if @game.save
13
+ flash[:notice] = "Game created"
14
+ redirect_to edit_game_path(@game)
15
+ else
16
+ flash[:alert] = @game.errors.full_messages.join(", ")
17
+ redirect_to new_game_path
18
+ end
19
+ end
20
+
21
+ def update
22
+ @game.assign_attributes(game_params)
23
+
24
+ if @game.save
25
+ flash[:notice] = "Game saved"
26
+ else
27
+ flash[:alert] = @game.errors.full_messages.join(", ")
28
+ end
29
+
30
+ redirect_to edit_game_path(@game)
31
+ end
32
+
33
+ def destroy
34
+ @game.destroy
35
+ redirect_to games_path
36
+ end
37
+
38
+ def csv_upload
39
+ authorize! :manage, Key
40
+ end
41
+
42
+ def upload_csv
43
+ authorize! :manage, Key
44
+ params.fetch(:csv).tempfile.each_line do |code|
45
+ resource.keys.create(code: code.chomp)
46
+ end
47
+ redirect_to games_path
48
+ end
49
+
50
+ private
51
+
52
+ def game_params
53
+ params.require(:game).permit(
54
+ :bulk_key_entry,
55
+ :name,
56
+ )
57
+ end
58
+
59
+ def resource
60
+ @game
61
+ end
62
+ helper_method :resource
63
+ end
64
+ end
65
+ end