Skip to content

Commit 65b3820

Browse files
authored
Merge pull request #31 from rdytech/NEP-18176_user_site_programme_data_scoping
[NEP-18176]: Implementing data scoping based on user programmes and sites
2 parents 5e40a8f + c9f5062 commit 65b3820

File tree

5 files changed

+87
-20
lines changed

5 files changed

+87
-20
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
## Change Log
2+
## 0.2.0 - 2024-08-19
3+
4+
* Adding RLS filter clause to the 'api/v1/security/guest_token/' API params in guest_token.rb - https://github.com/rdytech/superset-client/pull/31
5+
* Any filter that needs to applied to the dataset's final where condition can be passed here. Ex: [{ "clause": "publisher = 'Nintendo'" }]. Refer this: https://github.com/apache/superset/tree/master/superset-embedded-sdk#creating-a-guest-token
26

37
## 0.1.7 - 2024-08-27
48

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ GIT
1414
PATH
1515
remote: .
1616
specs:
17-
superset (0.1.6)
17+
superset (0.2.0)
1818
dotenv (~> 2.7)
1919
enumerate_it (~> 1.7.0)
2020
faraday (~> 1.0)

lib/superset/guest_token.rb

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ module Superset
22
class GuestToken
33
include Credential::EmbeddedUser
44

5-
attr_accessor :embedded_dashboard_id, :current_user
5+
attr_accessor :embedded_dashboard_id, :rls_clause, :additional_params
66

7-
def initialize(embedded_dashboard_id: , current_user: nil)
7+
def initialize(embedded_dashboard_id:, rls_clause: [], **additional_params)
88
@embedded_dashboard_id = embedded_dashboard_id
9-
@current_user = current_user
9+
@rls_clause = rls_clause
10+
@additional_params = additional_params
1011
end
1112

1213
def guest_token
14+
validate_params
1315
response_body['token']
1416
end
1517

@@ -20,18 +22,23 @@ def params
2022
"id": embedded_dashboard_id.to_s,
2123
"type": "dashboard" }
2224
],
23-
"rls": [],
25+
"rls": rls_clause, # Ex: [{ "clause": "publisher = 'Nintendo'" }]
2426
"user": current_user_params
25-
}
27+
}.merge(additional_params)
2628
end
2729

2830
private
2931

32+
def validate_params
33+
raise Superset::Request::InvalidParameterError, "rls_clause should be an array. But it is #{rls_clause.class}" if rls_clause.nil? || rls_clause.class != Array
34+
end
35+
3036
# optional param to be available in Superset for query templating using jinja
3137
# ss expects username .. which could be used to query as current_user.id
3238
def current_user_params
33-
if current_user
34-
{ "username": current_user.id.to_s }
39+
current_user_id = additional_params[:embedded_app_current_user_id]
40+
if current_user_id
41+
{ "username": current_user_id.to_s }
3542
else
3643
{ }
3744
end

lib/superset/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module Superset
4-
VERSION = "0.1.7"
4+
VERSION = "0.2.0"
55
end

spec/superset/guest_token_spec.rb

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,72 @@
1414
it 'returns the guest token from the response' do
1515
expect(subject.guest_token).to eq('some-token')
1616
end
17+
18+
context 'when invalid rls clause is passed' do
19+
before { allow(subject).to receive(:rls_clause).and_return(rls_clause) }
20+
context 'when rls_clause is nil' do
21+
let(:rls_clause) { nil }
22+
it 'raises invalid parameter error' do
23+
expect{ subject.guest_token }.to raise_error(Superset::Request::InvalidParameterError, 'rls_clause should be an array. But it is NilClass')
24+
end
25+
end
26+
27+
context 'when rls_clause is not an array' do
28+
let(:rls_clause) { { "clause": "publisher = 'Nintendo'" } }
29+
it 'raises invalid parameter error' do
30+
expect{ subject.guest_token }.to raise_error(Superset::Request::InvalidParameterError, "rls_clause should be an array. But it is Hash")
31+
end
32+
end
33+
end
1734
end
1835

1936
describe '#params' do
20-
before do
21-
allow(subject).to receive(:current_user).and_return(user)
22-
end
37+
context "with additional params" do
38+
before do
39+
allow(subject).to receive(:additional_params).and_return(additional_params)
40+
end
2341

24-
context 'without a current_user' do
25-
let(:user) { nil }
42+
context 'without a current_user' do
43+
let(:additional_params) { {} }
44+
45+
specify do
46+
expect(subject.params).to eq(
47+
{
48+
"resources": [
49+
{
50+
"id": ss_dashboard_id,
51+
"type": "dashboard" }
52+
],
53+
"rls": [],
54+
"user": { }
55+
}
56+
)
57+
end
58+
end
2659

60+
context 'with a current_user' do
61+
let(:additional_params) { {embedded_app_current_user_id: 1} }
62+
63+
specify 'passes user id to superset' do
64+
expect(subject.params).to eq(
65+
{
66+
"resources": [
67+
{
68+
"id": ss_dashboard_id,
69+
"type": "dashboard" }
70+
],
71+
"rls": [],
72+
"user": { username: additional_params[:embedded_app_current_user_id].to_s },
73+
"embedded_app_current_user_id": additional_params[:embedded_app_current_user_id]
74+
}
75+
)
76+
end
77+
end
78+
end
79+
80+
context 'with rls clause' do
81+
before { allow(subject).to receive(:rls_clause).and_return(rls_clause) }
82+
let(:rls_clause) { [{ "clause": "publisher = 'Nintendo'" }] }
2783
specify do
2884
expect(subject.params).to eq(
2985
{
@@ -32,17 +88,17 @@
3288
"id": ss_dashboard_id,
3389
"type": "dashboard" }
3490
],
35-
"rls": [],
91+
"rls": rls_clause,
3692
"user": { }
3793
}
3894
)
3995
end
4096
end
4197

42-
context 'with a current_user' do
43-
let(:user) { double(id: 101) }
44-
45-
specify 'passes user id to superset' do
98+
context 'with rls clause as empty array' do
99+
before { allow(subject).to receive(:rls_clause).and_return(rls_clause) }
100+
let(:rls_clause) { [] }
101+
specify do
46102
expect(subject.params).to eq(
47103
{
48104
"resources": [
@@ -51,7 +107,7 @@
51107
"type": "dashboard" }
52108
],
53109
"rls": [],
54-
"user": { username: "101" }
110+
"user": { }
55111
}
56112
)
57113
end

0 commit comments

Comments
 (0)