munificent-admin 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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