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 +4 -4
- data/lib/captive/commands/addons_commands.rb +18 -0
- data/lib/captive/commands/supabase_auth_change.rb +27 -0
- data/lib/captive/dashboard/addons_resource.rb +8 -0
- data/lib/captive/dashboard_api.rb +3 -1
- data/lib/captive/loader.rb +1 -0
- data/lib/captive/presenter/supabase_auth.rb +38 -0
- data/lib/captive/validation_message.rb +1 -1
- data/lib/captive/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8e0c03912e7897e1c4aa8c9010abb854e59f01803fc7be2cfdf4acd5c08c0908
|
|
4
|
+
data.tar.gz: e3e509714c0b0e5e607c9be8052a579974b48bc33492a7442abd785bd8d1a734
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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,
|
|
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
|
|
data/lib/captive/loader.rb
CHANGED
|
@@ -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
|
data/lib/captive/version.rb
CHANGED
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.
|
|
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
|