strongmind-auth 1.0.5 → 1.0.6
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29554b31cde55064956270ba9bd557e8390a49ec9a847ff417cd13e0983d0460
|
4
|
+
data.tar.gz: 534b35f4fcfa0273ec3364b1bceca1b4e0bf9f1f99c681c21d2d489b97b861b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c00798ee297949194cb98ff045e46b222bcd3a5d60d244f9f78cf5ee336299c1ba19d9c1414cd2a9f14345cd8fd6372f09769bdcc928599bf610c325552ee342
|
7
|
+
data.tar.gz: caeb996433c23a339c251f4617a525ead271377fa97d0d027ae87ae9a694cce1e07c596ebdd21f3fd3a2aab2e10ccbcc210cb0c8c9885a5c826d82e02ba80df8
|
@@ -1,16 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require "strongmind/common_nav_fetcher"
|
2
2
|
|
3
3
|
module StrongMindNav
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
def fetch_common_nav
|
7
7
|
begin
|
8
|
-
navbar =
|
8
|
+
navbar = Strongmind::CommonNavFetcher.new(current_user, request).retrieve(menu_items)
|
9
9
|
|
10
10
|
@top_navbar_html = navbar[:top_navbar_html]
|
11
11
|
@bottom_navbar_html = navbar[:bottom_navbar_html]
|
12
12
|
@theme_css = navbar[:theme_css]
|
13
|
-
rescue
|
13
|
+
rescue Strongmind::CommonNavFetcher::TokenNotFoundError, Strongmind::CommonNavFetcher::UserNotFoundError
|
14
14
|
render 'logins/index'
|
15
15
|
rescue Faraday::TimeoutError
|
16
16
|
@top_navbar_html = render_to_string(partial: 'layouts/loading_navbar').html_safe
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'platform_sdk'
|
4
|
+
|
5
|
+
module Strongmind
|
6
|
+
# This class is responsible for fetching the common navbar data from SM Central
|
7
|
+
class CommonNavFetcher
|
8
|
+
attr_reader :user, :request, :auth_client
|
9
|
+
|
10
|
+
include Rails.application.routes.url_helpers
|
11
|
+
|
12
|
+
class TokenNotFoundError < StandardError; end
|
13
|
+
|
14
|
+
class UserNotFoundError < StandardError; end
|
15
|
+
|
16
|
+
def initialize(user, request)
|
17
|
+
raise UserNotFoundError, 'User not found' unless user.present?
|
18
|
+
raise ArgumentError, 'Request not found' unless request.present?
|
19
|
+
|
20
|
+
@user = user
|
21
|
+
@request = request
|
22
|
+
@auth_client = PlatformSdk::Identity::AuthClient.new(
|
23
|
+
ENV.fetch('IDENTITY_BASE_URL'), ENV.fetch('IDENTITY_CLIENT_ID'), ENV.fetch('IDENTITY_CLIENT_SECRET')
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def retrieve(menu_items)
|
28
|
+
response = fetch_navbar_data(build_nav_items(menu_items))
|
29
|
+
parse_navbar(response)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def current_page?(url)
|
35
|
+
request.fullpath == URI.parse(url).path
|
36
|
+
end
|
37
|
+
|
38
|
+
def fetch_navbar_data(nav_items)
|
39
|
+
refresh_session if auth_client.token_expired?(token)
|
40
|
+
|
41
|
+
connection.post(navbar_endpoint, nav_items.to_json, 'Authorization' => "Bearer #{token}")
|
42
|
+
end
|
43
|
+
|
44
|
+
def connection
|
45
|
+
@connection ||= Faraday.new(url: ENV.fetch('SM_CENTRAL_BASE_URL')) do |conn|
|
46
|
+
conn.options.timeout = 3
|
47
|
+
conn.response :raise_error
|
48
|
+
conn.adapter Faraday.default_adapter
|
49
|
+
conn.headers['Content-Type'] = 'application/json'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def token
|
54
|
+
cache_data = Rails.cache.fetch(user.uid)
|
55
|
+
raise TokenNotFoundError, "Token not found for user #{user.id}" unless cache_data&.key?(:access_token)
|
56
|
+
|
57
|
+
cache_data[:access_token]
|
58
|
+
end
|
59
|
+
|
60
|
+
def refresh_session
|
61
|
+
begin
|
62
|
+
session = Rails.cache.fetch(user.uid)
|
63
|
+
auth_client.refresh_session(session:)
|
64
|
+
Rails.cache.write(user.uid, session)
|
65
|
+
rescue Faraday::BadRequestError => e
|
66
|
+
Sentry.capture_exception(e, extra: { session:, request_body: request.body })
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def navbar_endpoint
|
71
|
+
'/navbar'
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_navbar(response)
|
75
|
+
JSON.parse(response.body, symbolize_names: true) if response
|
76
|
+
end
|
77
|
+
|
78
|
+
def build_nav_items(menu_items)
|
79
|
+
{ nav_items: menu_items.map { |item| nav_item_data(item) } }
|
80
|
+
end
|
81
|
+
|
82
|
+
def nav_item_data(item)
|
83
|
+
url = send(item[:path_method])
|
84
|
+
{
|
85
|
+
name: item[:name],
|
86
|
+
icon: item[:icon],
|
87
|
+
url:,
|
88
|
+
is_disabled: item[:feature_flag] ? !user.feature_flag_enabled?(item[:feature_flag]) : false,
|
89
|
+
is_active: current_page?(url),
|
90
|
+
is_external: false
|
91
|
+
}
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strongmind-auth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Team Belding
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- lib/strongmind/auth.rb
|
125
125
|
- lib/strongmind/auth/engine.rb
|
126
126
|
- lib/strongmind/auth/version.rb
|
127
|
+
- lib/strongmind/common_nav_fetcher.rb
|
127
128
|
- lib/tasks/rails/auth_tasks.rake
|
128
129
|
- lib/tasks/strongmind/auth_tasks.rake
|
129
130
|
homepage: https://www.strongmind.com
|