captive-cli 1.5.0 → 1.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 415acf4d1e664b24fe084bd17b74fbbb5922f64465e37a360464b138dcc58bab
4
- data.tar.gz: 48ea97307c38ab7db3f28ce3da3950f876aacc8fb528effd46758cf4b35131a6
3
+ metadata.gz: 8e0c03912e7897e1c4aa8c9010abb854e59f01803fc7be2cfdf4acd5c08c0908
4
+ data.tar.gz: e3e509714c0b0e5e607c9be8052a579974b48bc33492a7442abd785bd8d1a734
5
5
  SHA512:
6
- metadata.gz: 2cf47f38a58c871f6b8aae1e92b168ee95068ee333b9f93f1bfdba0161eb5c05615f2031e97de47091459c21ebbc9a5b1e061752b9d4d373d6e66fd0a1495dde
7
- data.tar.gz: 897af0a7bd2e7685c143a3b2b69b2c4a4dcea02cae52fce02b1ff6c7677be1da310d8f2db9022d6840b7cb4d3f670ae2c441053f7bec717c6a1f609008b06d88
6
+ metadata.gz: 721d05fa2dbe0dde6f5e0ff3f30a63da5e2a7eb81115f3942c665918e74369374839b52faab0b91f51b4be4c7e807ac1f9547b14d9b23d01a82541b30671fdf9
7
+ data.tar.gz: e3a1429018288064d4f477e1f64fa7df367a657b169df3660441084ee4be0472eb81fb0d09d6ebb53bb7b863e5de1a0542ec664539ac2262b2136f064696cbb2
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "supabase_auth_change"
4
+
3
5
  module Captive
4
6
  module Commands
5
7
  # Les Add-ons d'une app via le dashboard (ADR 0034) : tout ce que la page Add-ons permet,
@@ -48,6 +50,22 @@ module Captive
48
50
  end
49
51
  end
50
52
 
53
+ desc "auth APP", "Affiche ou modifie les réglages d'authentification de l'add-on Supabase"
54
+ long_desc <<~DESC
55
+ Sans option : affiche l'auto-confirmation des emails et l'ouverture des inscriptions.
56
+ Avec --autoconfirm et --signup (les deux, l'état voulu est complet) : les modifie.
57
+ Réservé aux admins de l'Organization ; l'auto-confirmation est refusée en production.
58
+
59
+ \x05Exemples :
60
+ \x05 captive addons auth my-app-staging
61
+ \x05 captive addons auth my-app-staging --autoconfirm=true --signup=false
62
+ DESC
63
+ method_option :autoconfirm, enum: %w[true false], desc: "Auto-confirmation des emails"
64
+ method_option :signup, enum: %w[true false], desc: "Inscriptions ouvertes"
65
+ def auth(app)
66
+ puts SupabaseAuthChange.new(addons: addons_api, paint: paint).run(app, options)
67
+ end
68
+
51
69
  private
52
70
 
53
71
  def presenter = Presenter::Addon.new(paint: paint)
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../errors"
4
+
5
+ module Captive
6
+ module Commands
7
+ # `addons auth` : sans réglage, les lignes qui décrivent l'état ; avec les deux, l'état voulu
8
+ # complet envoyé au dashboard, que captive-platform applique plus tard.
9
+ class SupabaseAuthChange
10
+ def initialize(addons:, paint:)
11
+ @addons = addons
12
+ @paint = paint
13
+ end
14
+
15
+ # `options` : les options Thor de la commande, `autoconfirm` et `signup` ("true"/"false").
16
+ def run(app, options)
17
+ autoconfirm, signup = options.values_at("autoconfirm", "signup")
18
+ return Presenter::SupabaseAuth.new(paint: @paint).lines(@addons.supabase_auth(app), app: app) unless autoconfirm || signup
19
+ raise ValidationError, "Préciser --autoconfirm et --signup ensemble." unless autoconfirm && signup
20
+
21
+ @addons.set_supabase_auth(app, autoconfirm: autoconfirm == "true", signup_open: signup == "true")
22
+ [ @paint.green(" ✓ Réglages d'authentification en cours de modification : #{CLIDependencies::ASYNC_NOTICE}"),
23
+ @paint.dim(" Suivre : captive addons auth #{app}"), ]
24
+ end
25
+ end
26
+ end
27
+ end
@@ -6,6 +6,7 @@ module Captive
6
6
  # dashboard. Un ajout est appliqué plus tard par captive-platform (réponse 202).
7
7
  class AddonsResource
8
8
  PATH = AppPath.new("addons")
9
+ SUPABASE_AUTH_PATH = AppPath.new("addons/supabase/auth")
9
10
 
10
11
  def initialize(api:)
11
12
  @api = api
@@ -13,6 +14,13 @@ module Captive
13
14
 
14
15
  def list(app) = @api.get(PATH.call(app))
15
16
  def add(app, addon) = @api.post(PATH.call(app), { addon: addon })
17
+
18
+ def supabase_auth(app) = @api.get(SUPABASE_AUTH_PATH.call(app))
19
+
20
+ # Toujours l'état voulu complet ; captive-platform l'applique plus tard (réponse 202).
21
+ def set_supabase_auth(app, autoconfirm:, signup_open:)
22
+ @api.put(SUPABASE_AUTH_PATH.call(app), { autoconfirm: autoconfirm, signup_open: signup_open })
23
+ end
16
24
  end
17
25
  end
18
26
  end
@@ -13,7 +13,8 @@ module Captive
13
13
  class DashboardApi
14
14
  BASE_URL = "https://dashboard.captive.dev"
15
15
  VERBS = {
16
- get: Net::HTTP::Get, post: Net::HTTP::Post, patch: Net::HTTP::Patch, delete: Net::HTTP::Delete,
16
+ get: Net::HTTP::Get, post: Net::HTTP::Post, put: Net::HTTP::Put, patch: Net::HTTP::Patch,
17
+ delete: Net::HTTP::Delete,
17
18
  }.freeze
18
19
 
19
20
  def self.segment(value) = URI.encode_uri_component(value.to_s)
@@ -28,6 +29,7 @@ module Captive
28
29
 
29
30
  def get(path) = request(:get, path)
30
31
  def post(path, body = nil) = request(:post, path, body)
32
+ def put(path, body = nil) = request(:put, path, body)
31
33
  def patch(path, body = nil) = request(:patch, path, body)
32
34
  def delete(path) = request(:delete, path)
33
35
 
@@ -23,6 +23,7 @@ require_relative "presenter/app_info"
23
23
  require_relative "presenter/scheduled_task"
24
24
  require_relative "presenter/domain"
25
25
  require_relative "presenter/addon"
26
+ require_relative "presenter/supabase_auth"
26
27
  require_relative "activity_trail"
27
28
  require_relative "errors"
28
29
  require_relative "ui/spinner"
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Captive
4
+ module Presenter
5
+ # Les réglages d'authentification de l'Add-on Supabase, comme sur la page du dashboard :
6
+ # une valeur que le dashboard n'a pas pu lire reste « inconnu ».
7
+ class SupabaseAuth
8
+ VALEURS = { true => "oui", false => "non" }.freeze
9
+
10
+ def initialize(paint:)
11
+ @paint = paint
12
+ end
13
+
14
+ def lines(settings, app:)
15
+ [
16
+ [ "Auto-confirmation des emails", valeur(settings["autoconfirm"]), alerte(settings, app) ].compact.join(" "),
17
+ "Inscriptions ouvertes #{valeur(settings["signup_open"])}",
18
+ (@paint.yellow("Changement en cours…") if settings["pending"]),
19
+ @paint.dim(modification(settings, app)),
20
+ ].compact
21
+ end
22
+
23
+ private
24
+
25
+ def modification(settings, app)
26
+ return "Modifiable par un admin de l'Organization" unless settings["can_edit"]
27
+
28
+ "Modifier : captive addons auth #{app} --autoconfirm=true|false --signup=true|false"
29
+ end
30
+
31
+ def valeur(value) = VALEURS.fetch(value, "inconnu")
32
+
33
+ def alerte(settings, app)
34
+ @paint.red("⚠ active en production") if settings["autoconfirm"] && app.end_with?("-production")
35
+ end
36
+ end
37
+ end
38
+ end
@@ -19,7 +19,7 @@ module Captive
19
19
  case errors
20
20
  when Array then errors.map { |e| e.is_a?(Hash) ? "#{e["field"]} : #{e["message"]}" : e.to_s }
21
21
  when Hash then errors.map { |field, messages| "#{field} : #{Array(messages).join(", ")}" }
22
- else [ @body.fetch("error", "invalide").to_s ]
22
+ else [ (@body["message"] || @body.fetch("error", "invalide")).to_s ]
23
23
  end
24
24
  end
25
25
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Captive
4
- VERSION = "1.5.0"
4
+ VERSION = "1.7.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: captive-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Captive Studio
@@ -129,6 +129,7 @@ files:
129
129
  - lib/captive/commands/logs.rb
130
130
  - lib/captive/commands/one_off_session.rb
131
131
  - lib/captive/commands/run.rb
132
+ - lib/captive/commands/supabase_auth_change.rb
132
133
  - lib/captive/commands/user_login.rb
133
134
  - lib/captive/credentials.rb
134
135
  - lib/captive/credentials_store.rb
@@ -158,6 +159,7 @@ files:
158
159
  - lib/captive/presenter/domain.rb
159
160
  - lib/captive/presenter/log_colorizer.rb
160
161
  - lib/captive/presenter/scheduled_task.rb
162
+ - lib/captive/presenter/supabase_auth.rb
161
163
  - lib/captive/session_id.rb
162
164
  - lib/captive/session_token.rb
163
165
  - lib/captive/shell_completions.rb