punk 0.1.4 → 0.2.0

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 (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