punk 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/workflows/test.yml +26 -1
  4. data/.rdoc_options +23 -0
  5. data/.rgignore +1 -0
  6. data/.rspec +2 -0
  7. data/Gemfile +5 -6
  8. data/Gemfile.lock +16 -29
  9. data/README.md +1 -1
  10. data/VERSION +1 -1
  11. data/app/migrations/001_lets_punk.rb +3 -0
  12. data/app/routes/hello.rb +4 -0
  13. data/env/.gitignore +3 -0
  14. data/env/spec/test.sh +3 -0
  15. data/lib/punk/actions/.keep +0 -0
  16. data/lib/punk/actions/groups/list.rb +24 -0
  17. data/lib/punk/actions/sessions/clear.rb +21 -0
  18. data/lib/punk/actions/sessions/create.rb +64 -0
  19. data/lib/punk/actions/sessions/list.rb +18 -0
  20. data/lib/punk/actions/sessions/verify.rb +24 -0
  21. data/lib/punk/actions/tenants/list.rb +18 -0
  22. data/lib/punk/actions/users/list_group.rb +18 -0
  23. data/lib/punk/actions/users/list_tenant.rb +18 -0
  24. data/lib/punk/actions/users/show.rb +18 -0
  25. data/lib/punk/commands/list.rb +12 -6
  26. data/lib/punk/config/defaults.json +3 -0
  27. data/lib/punk/config/schema.json +3 -0
  28. data/lib/punk/core/app.rb +4 -6
  29. data/lib/punk/core/commander.rb +7 -4
  30. data/lib/punk/core/exec.rb +2 -0
  31. data/lib/punk/core/load.rb +0 -1
  32. data/lib/punk/framework/command.rb +5 -1
  33. data/lib/punk/framework/plugins/validation.rb +0 -14
  34. data/lib/punk/helpers/loggable.rb +1 -1
  35. data/lib/punk/migrations/001_punk.rb +103 -0
  36. data/lib/punk/models/.keep +0 -0
  37. data/lib/punk/models/group.rb +20 -0
  38. data/lib/punk/models/group_user_metadata.rb +17 -0
  39. data/lib/punk/models/identity.rb +29 -0
  40. data/lib/punk/models/session.rb +89 -0
  41. data/lib/punk/models/tenant.rb +19 -0
  42. data/lib/punk/models/tenant_user_metadata.rb +17 -0
  43. data/lib/punk/models/user.rb +31 -0
  44. data/lib/punk/routes/groups.rb +31 -0
  45. data/lib/punk/routes/plivo.rb +4 -0
  46. data/lib/punk/routes/sessions.rb +108 -0
  47. data/lib/punk/routes/swagger.rb +9 -0
  48. data/lib/punk/routes/tenants.rb +29 -0
  49. data/lib/punk/routes/users.rb +36 -0
  50. data/lib/punk/services/.keep +0 -0
  51. data/lib/punk/services/challenge_claim.rb +46 -0
  52. data/lib/punk/services/create_identities.rb +25 -0
  53. data/lib/punk/services/generate_swagger.rb +25 -0
  54. data/lib/punk/services/prove_claim.rb +29 -0
  55. data/lib/punk/services/secret.rb +9 -0
  56. data/lib/punk/templates/groups/list.jbuilder +7 -0
  57. data/lib/punk/templates/plivo.slim +16 -0
  58. data/lib/punk/templates/sessions/list.jbuilder +6 -0
  59. data/lib/punk/templates/sessions/pending.jbuilder +4 -0
  60. data/lib/punk/templates/tenants/list.jbuilder +7 -0
  61. data/lib/punk/templates/tenants/list.slim +8 -0
  62. data/lib/punk/templates/users/list.jbuilder +7 -0
  63. data/lib/punk/templates/users/list.rcsv +4 -0
  64. data/lib/punk/templates/users/show.jbuilder +5 -0
  65. data/lib/punk/views/groups/list.rb +22 -0
  66. data/lib/punk/views/plivo_store.rb +15 -0
  67. data/lib/punk/views/sessions/list.rb +22 -0
  68. data/lib/punk/views/sessions/pending.rb +28 -0
  69. data/lib/punk/views/tenants/list.rb +22 -0
  70. data/lib/punk/views/users/list.rb +22 -0
  71. data/lib/punk/views/users/show.rb +22 -0
  72. data/lib/punk/workers/.keep +0 -0
  73. data/lib/punk/workers/expire_sessions.rb +9 -0
  74. data/lib/punk/workers/geocode_session_worker.rb +48 -0
  75. data/lib/punk/workers/identify_session_worker.rb +45 -0
  76. data/lib/punk/workers/secret.rb +18 -0
  77. data/lib/punk/workers/send_email_worker.rb +51 -0
  78. data/lib/punk/workers/send_sms_worker.rb +40 -0
  79. data/punk.gemspec +140 -14
  80. data/schema.psql +345 -0
  81. data/spec/actions/groups/punk/list_groups_action_spec.rb +36 -0
  82. data/spec/actions/sessions/punk/clear_session_action_spec.rb +29 -0
  83. data/spec/actions/sessions/punk/create_session_action_spec.rb +33 -0
  84. data/spec/actions/sessions/punk/list_sessions_action_spec.rb +26 -0
  85. data/spec/actions/sessions/punk/verify_session_action_spec.rb +59 -0
  86. data/spec/actions/tenants/punk/list_tenants_action_spec.rb +25 -0
  87. data/spec/actions/users/punk/list_group_users_action_spec.rb +26 -0
  88. data/spec/actions/users/punk/list_tenant_users_action_spec.rb +26 -0
  89. data/spec/factories/group.rb +12 -0
  90. data/spec/factories/group_user_metadata.rb +10 -0
  91. data/spec/factories/identity.rb +19 -0
  92. data/spec/factories/session.rb +12 -0
  93. data/spec/factories/tenant.rb +10 -0
  94. data/spec/factories/tenant_user_metadata.rb +10 -0
  95. data/spec/factories/user.rb +12 -0
  96. data/spec/lib/commands/auth_spec.rb +11 -0
  97. data/spec/lib/commands/generate_spec.rb +7 -0
  98. data/spec/lib/commands/http_spec.rb +23 -0
  99. data/spec/lib/commands/list_spec.rb +7 -0
  100. data/spec/lib/commands/swagger_spec.rb +7 -0
  101. data/spec/lib/engine/punk_env_spec.rb +13 -0
  102. data/spec/lib/engine/punk_exec_spec.rb +9 -0
  103. data/spec/lib/engine/punk_init_spec.rb +9 -0
  104. data/spec/lib/engine/punk_store_spec.rb +10 -0
  105. data/spec/lib/punk.env +7 -0
  106. data/spec/models/punk/group_spec.rb +50 -0
  107. data/spec/models/punk/group_user_metadata_spec.rb +61 -0
  108. data/spec/models/punk/identity_spec.rb +61 -0
  109. data/spec/models/punk/session_spec.rb +156 -0
  110. data/spec/models/punk/tenant_spec.rb +51 -0
  111. data/spec/models/punk/tenant_user_metadata_spec.rb +61 -0
  112. data/spec/models/punk/user_spec.rb +115 -0
  113. data/spec/routes/groups/get_groups_spec.rb +33 -0
  114. data/spec/routes/plivo/get_plivo_spec.rb +11 -0
  115. data/spec/routes/sessions/delete_session_spec.rb +11 -0
  116. data/spec/routes/sessions/get_sessions_spec.rb +30 -0
  117. data/spec/routes/sessions/patch_session_spec.rb +11 -0
  118. data/spec/routes/sessions/post_session_spec.rb +11 -0
  119. data/spec/routes/swagger/get_swagger_spec.rb +12 -0
  120. data/spec/routes/tenants/get_tenants_spec.rb +31 -0
  121. data/spec/routes/users/get_users_spec.rb +60 -0
  122. data/spec/services/punk/challenge_claim_service_spec.rb +7 -0
  123. data/spec/services/punk/create_identities_service_spec.rb +14 -0
  124. data/spec/services/punk/generate_swagger_service_spec.rb +7 -0
  125. data/spec/services/punk/prove_claim_service_spec.rb +7 -0
  126. data/spec/services/punk/secret_service_spec.rb +7 -0
  127. data/spec/spec_helper.rb +122 -0
  128. data/spec/vcr_cassettes/PUNK_GeocodeSessionWorker/updates_the_session_data.yml +57 -0
  129. data/spec/vcr_cassettes/PUNK_IdentifySessionWorker/updates_the_session_data.yml +112 -0
  130. data/spec/views/punk/plivo_store_spec.rb +7 -0
  131. data/spec/views/sessions/punk/list_sessions_view_spec.rb +7 -0
  132. data/spec/views/sessions/punk/pending_session_view_spec.rb +7 -0
  133. data/spec/views/tenants/punk/list_tenants_view_spec.rb +7 -0
  134. data/spec/views/users/punk/list_groups_view_spec.rb +7 -0
  135. data/spec/views/users/punk/list_users_view_spec.rb +7 -0
  136. data/spec/workers/punk/expire_sessions_worker_spec.rb +31 -0
  137. data/spec/workers/punk/geocode_session_worker_spec.rb +14 -0
  138. data/spec/workers/punk/identify_session_worker_spec.rb +15 -0
  139. data/spec/workers/punk/secret_worker_spec.rb +20 -0
  140. data/spec/workers/punk/send_email_worker_spec.rb +46 -0
  141. data/spec/workers/punk/send_sms_worker_spec.rb +33 -0
  142. metadata +148 -11
  143. data/lib/punk/views/all.rb +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bcd01e2d794110d209b1c95d064a096126e7d1ac7ef32a96051646c30a530345
4
- data.tar.gz: 03be67755ef1ffa1059e7fc829810760a3363bc331ddf5cfec91ffdbe96b64d4
3
+ metadata.gz: 7178f5eae926161a0706c9c64ef8e57228ccb5ef5104ebb353b1595085755d8f
4
+ data.tar.gz: 0ef6b97cbaeb614f08dc85e51ef97d3382c82dc277d61a438078abacdcdd53f3
5
5
  SHA512:
6
- metadata.gz: e8c2b7ca00ad06821ed88da9c3c961799d0410f920b9391be2ea4dbe7dad70cc11562512324a689457d7e82ea644371e276c520646ede3b401eddadd0a1b55da
7
- data.tar.gz: f1d10c98f46bf408b86a55688007e4c40c209af1806a7e1f01a401314eedce151385a8c62f2b88059aa01802b642a09adbfbeba58ee365bae584b140d5591f80
6
+ metadata.gz: eb1b9ee114d8696a90f7cfc47c6a6aae3d759a8121dfd4e0e3f5ec3756db57d77d99eb94aab1165f3c3c7101cec8ae2a8310c04ccbf4b03dca5e9f3fb1f11b05
7
+ data.tar.gz: c3aa57ef40815657a8fd029d4bd1d116dfc28db30287345149815635e824d27740a6909667345512f98150c593673f83b51877a4d7c8cbc063cc7cb6f95ca12f
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
@@ -7,6 +7,28 @@ jobs:
7
7
  runs-on: ubuntu-latest
8
8
  env:
9
9
  PUNK_ENV: test
10
+ COVERALLS_REPO_TOKEN: "${{secrets.COVERALLS_REPO_TOKEN}}"
11
+ IPSTACK_ACCESS_KEY: "${{secrets.IPSTACK_ACCESS_KEY}}"
12
+ USERSTACK_API_KEY: "${{secrets.USERSTACK_API_KEY}}"
13
+ DATABASE_URL: "postgres://postgres:postgres@localhost/punk_test"
14
+
15
+ services:
16
+ postgres:
17
+ image: postgres
18
+ env:
19
+ POSTGRES_PASSWORD: postgres
20
+ options: >-
21
+ --health-cmd pg_isready
22
+ --health-interval 10s
23
+ --health-timeout 5s
24
+ --health-retries 5
25
+ ports:
26
+ - 5432:5432
27
+ memcached:
28
+ image: memcached
29
+ ports:
30
+ - 11211:11211
31
+ options: --health-cmd "timeout 5 bash -c 'cat < /dev/null > /dev/udp/127.0.0.1/11211'" --health-interval 10s --health-timeout 5s --health-retries 5
10
32
  steps:
11
33
  - uses: actions/checkout@v2
12
34
  - name: Set up Ruby
@@ -17,4 +39,7 @@ jobs:
17
39
  - name: Lint files
18
40
  run: bundle exec rubocop
19
41
  - name: Run specs
20
- run: bundle exec rspec
42
+ run: |
43
+ bundle exec ruby ./bin/punk db create
44
+ bundle exec ruby ./bin/punk db migrate
45
+ bundle exec rspec
@@ -0,0 +1,23 @@
1
+ --- !ruby/object:RDoc::Options
2
+ encoding: UTF-8
3
+ static_path: []
4
+ rdoc_include:
5
+ - "."
6
+ - "/Users/jason/dev/rocket_engine"
7
+ charset: UTF-8
8
+ exclude:
9
+ hyperlink_all: false
10
+ line_numbers: false
11
+ locale:
12
+ locale_dir: locale
13
+ locale_name:
14
+ main_page:
15
+ markup: markdown
16
+ output_decoration: true
17
+ page_dir:
18
+ show_hash: false
19
+ tab_width: 8
20
+ template_stylesheets: []
21
+ title:
22
+ visibility: :protected
23
+ webcvs:
@@ -0,0 +1 @@
1
+ *.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile CHANGED
@@ -47,7 +47,7 @@ gem 'aasm', '~> 5.1'
47
47
 
48
48
  # Authentication
49
49
  gem 'http-accept', '~> 2.1'
50
- gem 'maxmind-db', '~> 1.1'
50
+ gem 'ipstack', '~> 0.1'
51
51
  gem 'rbnacl', '~> 7.1'
52
52
  gem 'userstack', '~> 0.1'
53
53
 
@@ -70,7 +70,7 @@ gem 'slim', '~> 4.1'
70
70
 
71
71
  # JSON Rendering
72
72
  gem 'jbuilder', '~> 2.10'
73
- gem 'oj', '~> 3.10'
73
+ gem 'oj', '~> 3.11'
74
74
  gem 'tilt-jbuilder', '~> 0.7'
75
75
 
76
76
  # Documentation Generation
@@ -81,7 +81,8 @@ gem 'swagger_yard', '~> 1.0'
81
81
  gem 'activesupport', '~> 6.1'
82
82
 
83
83
  # Monitoring
84
- gem 'sentry-raven', '~> 3.1'
84
+ gem 'sentry-ruby', '~> 4.1'
85
+ gem 'sentry-sidekiq', '~> 4.1'
85
86
  gem 'skylight', '~> 4.3'
86
87
 
87
88
  # Phone Numbers
@@ -96,18 +97,16 @@ end
96
97
 
97
98
  # Testing
98
99
  group :test do
99
- gem 'capybara', '~> 3.34'
100
100
  gem 'coveralls', '~> 0.8'
101
101
  gem 'factory_bot', '~> 6.1'
102
102
  gem 'faker', '~> 2.15'
103
103
  gem 'rack-test', '~> 1.1'
104
104
  gem 'rspec', '~> 3.10'
105
105
  gem 'rspec-its', '~> 1.3'
106
- gem 'rubocop', '~> 1.7'
106
+ gem 'rubocop', '~> 1.8'
107
107
  gem 'rubocop-rails', '~> 2.9'
108
108
  gem 'rubocop-rspec', '~> 2.1'
109
109
  gem 'rubocop-sequel', '~> 0.1'
110
- gem 'selenium-webdriver', '~> 3.142'
111
110
  gem 'timecop', '~> 0.9'
112
111
  gem 'vcr', '~> 6.0'
113
112
  gem 'webmock', '~> 3.11'
@@ -18,15 +18,6 @@ GEM
18
18
  msgpack (~> 1.0)
19
19
  builder (3.2.4)
20
20
  byebug (11.1.3)
21
- capybara (3.34.0)
22
- addressable
23
- mini_mime (>= 0.1.3)
24
- nokogiri (~> 1.8)
25
- rack (>= 1.6.0)
26
- rack-test (>= 0.6.3)
27
- regexp_parser (~> 1.5)
28
- xpath (~> 3.2)
29
- childprocess (3.0.0)
30
21
  chronic (0.10.2)
31
22
  coderay (1.1.3)
32
23
  commander (4.5.2)
@@ -62,7 +53,7 @@ GEM
62
53
  faraday_middleware (1.0.0)
63
54
  faraday (~> 1.0)
64
55
  ffi (1.14.2)
65
- fugit (1.4.1)
56
+ fugit (1.4.2)
66
57
  et-orbi (~> 1.1, >= 1.1.8)
67
58
  raabro (~> 1.4)
68
59
  gemfile_updater (0.1.0)
@@ -83,6 +74,8 @@ GEM
83
74
  domain_name (~> 0.5)
84
75
  i18n (1.8.7)
85
76
  concurrent-ruby (~> 1.0)
77
+ ipstack (0.1.3)
78
+ nokogiri (>= 1.8, < 2.0)
86
79
  jbuilder (2.10.1)
87
80
  activesupport (>= 5.0.0)
88
81
  json (2.5.1)
@@ -105,12 +98,10 @@ GEM
105
98
  addressable (~> 2.7)
106
99
  mailgun-ruby (1.2.0)
107
100
  rest-client (~> 2.0.2)
108
- maxmind-db (1.1.1)
109
101
  method_source (1.0.0)
110
102
  mime-types (3.3.1)
111
103
  mime-types-data (~> 3.2015)
112
104
  mime-types-data (3.2020.1104)
113
- mini_mime (1.0.2)
114
105
  mini_portile2 (2.5.0)
115
106
  minitest (5.14.3)
116
107
  msgpack (1.3.3)
@@ -128,7 +119,7 @@ GEM
128
119
  multi_json (~> 1.3)
129
120
  multi_xml (~> 0.5)
130
121
  rack (>= 1.2, < 3)
131
- oj (3.10.18)
122
+ oj (3.11.0)
132
123
  papertrail (0.11.0)
133
124
  ansi (~> 1.5)
134
125
  chronic (~> 0.10)
@@ -171,7 +162,7 @@ GEM
171
162
  rchardet (1.8.0)
172
163
  rdoc (6.3.0)
173
164
  redis (4.2.5)
174
- regexp_parser (1.8.2)
165
+ regexp_parser (2.0.3)
175
166
  rest-client (2.0.2)
176
167
  http-cookie (>= 1.0.2, < 2.0)
177
168
  mime-types (>= 1.16, < 4.0)
@@ -197,7 +188,7 @@ GEM
197
188
  diff-lcs (>= 1.2.0, < 2.0)
198
189
  rspec-support (~> 3.10.0)
199
190
  rspec-support (3.10.1)
200
- rubocop (1.8.0)
191
+ rubocop (1.8.1)
201
192
  parallel (~> 1.10)
202
193
  parser (>= 3.0.0.0)
203
194
  rainbow (>= 2.2.2, < 4.0)
@@ -218,15 +209,14 @@ GEM
218
209
  rubocop-sequel (0.1.0)
219
210
  rubocop (~> 1.0)
220
211
  ruby-progressbar (1.11.0)
221
- rubyzip (2.3.0)
222
- selenium-webdriver (3.142.7)
223
- childprocess (>= 0.5, < 4.0)
224
- rubyzip (>= 1.2.2)
225
212
  semantic_logger (4.7.4)
226
213
  concurrent-ruby (~> 1.0)
227
214
  semver2 (3.4.2)
228
- sentry-raven (3.1.1)
215
+ sentry-ruby (4.1.3)
216
+ concurrent-ruby (~> 1.0, >= 1.0.2)
229
217
  faraday (>= 1.0)
218
+ sentry-sidekiq (4.1.2)
219
+ sentry-ruby (~> 4.1.2)
230
220
  sequel (5.40.0)
231
221
  sequel_pg (1.14.0)
232
222
  pg (>= 0.18.0, != 1.2.0)
@@ -264,7 +254,7 @@ GEM
264
254
  jbuilder
265
255
  tilt (>= 1.3.0, < 3)
266
256
  timecop (0.9.2)
267
- tins (1.26.0)
257
+ tins (1.28.0)
268
258
  sync
269
259
  tzinfo (2.0.4)
270
260
  concurrent-ruby (~> 1.0)
@@ -279,8 +269,6 @@ GEM
279
269
  crack (>= 0.3.2)
280
270
  hashdiff (>= 0.4.0, < 2.0.0)
281
271
  wisper (2.0.1)
282
- xpath (3.2.0)
283
- nokogiri (~> 1.8)
284
272
  yard (0.9.26)
285
273
  zeitwerk (2.4.2)
286
274
 
@@ -294,7 +282,6 @@ DEPENDENCIES
294
282
  bootsnap (~> 1.5)
295
283
  bundler (~> 1.17)
296
284
  byebug (~> 11.1)
297
- capybara (~> 3.34)
298
285
  commander (~> 4.5)
299
286
  coveralls (~> 0.8)
300
287
  dalli (~> 2.7)
@@ -305,12 +292,12 @@ DEPENDENCIES
305
292
  faker (~> 2.15)
306
293
  gemfile_updater (~> 0.1)
307
294
  http-accept (~> 2.1)
295
+ ipstack (~> 0.1)
308
296
  jbuilder (~> 2.10)
309
297
  juwelier (~> 2.4)
310
298
  launchy (~> 2.5)
311
299
  mailgun-ruby (~> 1.2)
312
- maxmind-db (~> 1.1)
313
- oj (~> 3.10)
300
+ oj (~> 3.11)
314
301
  papertrail (~> 0.11)
315
302
  pg (~> 1.2)
316
303
  phony (~> 2.18)
@@ -329,13 +316,13 @@ DEPENDENCIES
329
316
  roda-route_list (~> 2.1)
330
317
  rspec (~> 3.10)
331
318
  rspec-its (~> 1.3)
332
- rubocop (~> 1.7)
319
+ rubocop (~> 1.8)
333
320
  rubocop-rails (~> 2.9)
334
321
  rubocop-rspec (~> 2.1)
335
322
  rubocop-sequel (~> 0.1)
336
- selenium-webdriver (~> 3.142)
337
323
  semantic_logger (~> 4.7)
338
- sentry-raven (~> 3.1)
324
+ sentry-ruby (~> 4.1)
325
+ sentry-sidekiq (~> 4.1)
339
326
  sequel (~> 5.40)
340
327
  sequel_pg (~> 1.14)
341
328
  sidekiq (~> 6.1)
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![test](https://github.com/kranzky/punk/workflows/test/badge.svg)](https://github.com/kranzky/punk/actions?query=workflow%3Atest)
2
- [![ship](https://github.com/kranzky/punk/workflows/ship/badge.svg)](https://github.com/kranzky/punk/actions?query=workflow%3Aship)
2
+ [![Coverage Status](https://coveralls.io/repos/github/kranzky/punk/badge.svg?branch=main)](https://coveralls.io/github/kranzky/punk?branch=main)
3
3
  [![Gem Version](https://badge.fury.io/rb/punk.svg)](https://badge.fury.io/rb/punk)
4
4
 
5
5
  # Punk!
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.2.0
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../lib/punk/migrations/001_punk'
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ # route: GET /hello
4
+ PUNK.route('hello') { perform "world" }
@@ -0,0 +1,3 @@
1
+ production.sh
2
+ staging.sh
3
+ locals.sh
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ export PUNK_TRACE=spec_test
File without changes
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ListGroupsAction < Action
5
+ args :user, :tenant
6
+
7
+ def validate
8
+ validates_not_null :user
9
+ validates_not_empty :user
10
+ return if user.blank?
11
+ validates_not_null :tenant
12
+ validates_not_empty :tenant
13
+ return if tenant.blank?
14
+ validates_type User, :user
15
+ validates_type Tenant, :tenant
16
+ end
17
+
18
+ def process
19
+ # TODO: repository here
20
+ # an action takes arguments (that may be entities) and returns a view object
21
+ present ListGroupsView, groups: user.groups_dataset.where(tenant: tenant).all
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ClearSessionAction < Action
5
+ args :session
6
+
7
+ def validate
8
+ validates_not_null :session
9
+ validates_not_empty :session
10
+ return if session.blank?
11
+ validates_type Session, :session
12
+ validates_state :session, :active
13
+ validates_event :session, :clear
14
+ end
15
+
16
+ def process
17
+ session.clear!
18
+ present Info, message: "You have been logged out."
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require 'phony'
5
+
6
+ module PUNK
7
+ class CreateSessionAction < Action
8
+ args :claim, :remote_addr, :user_agent
9
+
10
+ def validate
11
+ validates_not_null :claim
12
+ validates_not_empty :claim
13
+ validates_not_null :claim_type, message: "is not an email address or phone number"
14
+ validates_email :claim if claim_type == :email
15
+ validates_phone :claim if claim_type == :phone
16
+ validates_not_null :remote_addr
17
+ validates_not_empty :remote_addr
18
+ validates_not_null :user_agent
19
+ validates_not_empty :user_agent
20
+ end
21
+
22
+ def process
23
+ PUNK.db.transaction do
24
+ identity =
25
+ Identity.find_or_create(claim: _normalize_claim) do |i|
26
+ i.claim_type = claim_type
27
+ end
28
+ session = Session.create(identity: identity, remote_addr: remote_addr, user_agent: user_agent)
29
+ ChallengeClaimService.run(session: session)
30
+ IdentifySessionWorker.perform_async(session_id: session.id)
31
+ message =
32
+ case identity.claim_type
33
+ when :email
34
+ "We have sent a verification code to your email address. Please enter it to verify your identity."
35
+ when :phone
36
+ "We have sent a verification code to your phone number by SMS. Please enter it to verify your identity."
37
+ end
38
+ present PendingSessionView, session: session, message: message, status: 201
39
+ end
40
+ end
41
+
42
+ def claim_type
43
+ @claim_type ||= _guess_claim_type
44
+ end
45
+
46
+ private
47
+
48
+ def _guess_claim_type
49
+ return :email if URI::MailTo::EMAIL_REGEXP.match(claim)
50
+ return :phone if Phony.plausible?(claim)
51
+ end
52
+
53
+ def _normalize_claim
54
+ case claim_type
55
+ when :email
56
+ claim.downcase.strip
57
+ when :phone
58
+ phone = claim.strip
59
+ phone = "+1#{phone}" if phone !~ /^[+]/
60
+ "+#{Phony.normalize(phone)}"
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PUNK
4
+ class ListSessionsAction < Action
5
+ args :user
6
+
7
+ def validate
8
+ validates_not_null :user
9
+ validates_not_empty :user
10
+ return if user.blank?
11
+ validates_type User, :user
12
+ end
13
+
14
+ def process
15
+ present ListSessionsView, sessions: user.active_sessions.all
16
+ end
17
+ end
18
+ end