captive-cli 1.6.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: a31d2e7433e7b31ac59e131ba6a4ffd55732c3e71641fd5e22a45340e8f3f814
4
- data.tar.gz: 72b86e63fd6a755f22fab06fd60f1eff32fab9dd8f2c1dfff7a485b11e1a0cd2
3
+ metadata.gz: 8e0c03912e7897e1c4aa8c9010abb854e59f01803fc7be2cfdf4acd5c08c0908
4
+ data.tar.gz: e3e509714c0b0e5e607c9be8052a579974b48bc33492a7442abd785bd8d1a734
5
5
  SHA512:
6
- metadata.gz: a4b15fc087ba7cc009d657b7ce9d0f5738b141d423797d25ab435c43e2aa77442b408db411772dbf1cc3a7b7244c087c56668d6d89c0ccd418fd18a2ce41d6e5
7
- data.tar.gz: 688bfa7d022d5a4e7605624741153fbb84c0aa9ba90c677035acb87b6935d1febec027421ec3762360ce6fda3ea9c840a9d52f48b816da57a8feffb02caa3da4
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,16 +50,20 @@ module Captive
48
50
  end
49
51
  end
50
52
 
51
- desc "auth APP", "Affiche les réglages d'authentification de l'add-on Supabase"
53
+ desc "auth APP", "Affiche ou modifie les réglages d'authentification de l'add-on Supabase"
52
54
  long_desc <<~DESC
53
- Auto-confirmation des emails et inscriptions ouvertes, en lecture seule : seule
54
- l'équipe plateforme les modifie.
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.
55
58
 
56
- \x05Exemple :
59
+ \x05Exemples :
57
60
  \x05 captive addons auth my-app-staging
61
+ \x05 captive addons auth my-app-staging --autoconfirm=true --signup=false
58
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"
59
65
  def auth(app)
60
- Presenter::SupabaseAuth.new(paint: paint).lines(addons_api.supabase_auth(app), app: app).each { |line| puts line }
66
+ puts SupabaseAuthChange.new(addons: addons_api, paint: paint).run(app, options)
61
67
  end
62
68
 
63
69
  private
@@ -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
@@ -15,8 +15,12 @@ module Captive
15
15
  def list(app) = @api.get(PATH.call(app))
16
16
  def add(app, addon) = @api.post(PATH.call(app), { addon: addon })
17
17
 
18
- # En lecture seule : seule l'équipe plateforme modifie ces réglages, dans le dépôt GitOps.
19
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
20
24
  end
21
25
  end
22
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
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Captive
4
4
  module Presenter
5
- # Les réglages d'authentification de l'Add-on Supabase, en lecture seule comme sur la page
6
- # du dashboard : une valeur que le dashboard n'a pas pu lire reste « inconnu ».
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
7
  class SupabaseAuth
8
8
  VALEURS = { true => "oui", false => "non" }.freeze
9
9
 
@@ -15,12 +15,19 @@ module Captive
15
15
  [
16
16
  [ "Auto-confirmation des emails", valeur(settings["autoconfirm"]), alerte(settings, app) ].compact.join(" "),
17
17
  "Inscriptions ouvertes #{valeur(settings["signup_open"])}",
18
- @paint.dim("Modifiable par l'équipe plateforme"),
19
- ]
18
+ (@paint.yellow("Changement en cours…") if settings["pending"]),
19
+ @paint.dim(modification(settings, app)),
20
+ ].compact
20
21
  end
21
22
 
22
23
  private
23
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
+
24
31
  def valeur(value) = VALEURS.fetch(value, "inconnu")
25
32
 
26
33
  def alerte(settings, app)
@@ -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.6.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.6.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