Skip to content

Commit a5fb57a

Browse files
committed
fix(front): pass member type when assigning roles
1 parent 6bba555 commit a5fb57a

File tree

9 files changed

+68
-21
lines changed

9 files changed

+68
-21
lines changed

front/assets/js/people/change_role_dropdown.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ export var ChangeRoleDropdown = {
6767
const body = {
6868
user_id: roleBtn.attributes.user_id.value,
6969
project_id: InjectedDataByBackend.ProjectId,
70-
role_id: roleBtn.attributes.role_id.value
70+
role_id: roleBtn.attributes.role_id.value,
71+
member_type: roleBtn.attributes.member_type.value
7172
}
7273

7374
toggleSpinner()

front/assets/js/people/edit_person/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export const Button = () => {
8787

8888
return user.assignRoleUrl
8989
.call({
90-
body: { user_id: user.id, role_id: selectedRole.id },
90+
body: { user_id: user.id, role_id: selectedRole.id, member_type: user.memberType },
9191
})
9292
.then((resp) => {
9393
if (resp.error) {
@@ -413,6 +413,8 @@ class User {
413413
id: string;
414414
name: string;
415415
email: string;
416+
memberType: string;
417+
416418
roles: UserRole[] = [];
417419
changeEmailUrl: toolbox.APIRequest.Url<{ email: string, message: string, }>;
418420
assignRoleUrl: toolbox.APIRequest.Url<{ password: string, message: string, }>;
@@ -426,6 +428,7 @@ class User {
426428
user.id = json.id as string;
427429
user.name = json.name as string;
428430
user.email = json.email as string;
431+
user.memberType = json.member_type as string;
429432
user.roles = json.roles.map((role: any) => {
430433
return new UserRole({
431434
id: role.id,

front/lib/front/models/service_account.ex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,13 @@ defmodule Front.Models.ServiceAccount do
195195
end
196196

197197
defp assign_role(org_id, user_id, service_account, role_id) do
198-
RoleManagement.assign_role(user_id, org_id, service_account.id, role_id)
198+
RoleManagement.assign_role(
199+
user_id,
200+
org_id,
201+
service_account.id,
202+
role_id,
203+
"",
204+
"service_account"
205+
)
199206
end
200207
end

front/lib/front/rbac/role_management.ex

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,21 +180,48 @@ defmodule Front.RBAC.RoleManagement do
180180
If the 'project_id' parameter is not passed, it is interpreted as the role being assigned
181181
within the organization scope.
182182
"""
183-
@spec assign_role(id(), id(), id(), id(), String.t()) :: {:ok, String.t()} | {:error, any}
184-
def assign_role(requester_id, org_id, subject_id, role_id, project_id \\ "") do
183+
@spec assign_role(id(), id(), id(), id(), String.t(), String.t()) ::
184+
{:ok, String.t()} | {:error, any}
185+
def assign_role(
186+
requester_id,
187+
org_id,
188+
subject_id,
189+
role_id,
190+
project_id \\ "",
191+
subject_type \\ "user"
192+
) do
185193
Watchman.benchmark("assign_role.duration", fn ->
186194
Logger.info(
187-
"Assigning role: subject_id: #{subject_id}, org_id: #{org_id}, role_id: #{role_id}, project_id: #{project_id}"
195+
"Assigning role: subject_id: #{subject_id}, org_id: #{org_id}, role_id: #{role_id}, project_id: #{project_id}, subject_type: #{subject_type}"
188196
)
189197

198+
subject_type =
199+
case subject_type do
200+
"service_account" ->
201+
InternalApi.RBAC.SubjectType.value(:SERVICE_ACCOUNT)
202+
203+
"group" ->
204+
InternalApi.RBAC.SubjectType.value(:GROUP)
205+
206+
# Defaults to user
207+
"user" ->
208+
InternalApi.RBAC.SubjectType.value(:USER)
209+
210+
_ ->
211+
Logger.warn("Unrecognized subject type: #{subject_type}, defaulting to user")
212+
InternalApi.RBAC.SubjectType.value(:USER)
213+
end
214+
215+
subject = RBAC.Subject.new(subject_id: subject_id, type: subject_type)
216+
190217
req =
191218
RBAC.AssignRoleRequest.new(
192219
role_assignment:
193220
RBAC.RoleAssignment.new(
194221
role_id: role_id,
195222
org_id: org_id,
196223
project_id: project_id,
197-
subject: RBAC.Subject.new(subject_id: subject_id)
224+
subject: subject
198225
),
199226
requester_id: requester_id
200227
)

front/lib/front_web/controllers/people_controller.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ defmodule FrontWeb.PeopleController do
139139
user_id = params["user_id"]
140140
role_id = params["role_id"]
141141
requester_id = conn.assigns.user_id
142+
member_type = params["member_type"] || "user"
142143

143144
conn =
144145
conn
@@ -148,7 +149,14 @@ defmodule FrontWeb.PeopleController do
148149
if conn.halted() do
149150
{:error, :render_404}
150151
else
151-
case RoleManagement.assign_role(requester_id, org_id, user_id, role_id, project_id) do
152+
case RoleManagement.assign_role(
153+
requester_id,
154+
org_id,
155+
user_id,
156+
role_id,
157+
project_id,
158+
member_type
159+
) do
152160
{:ok, _} ->
153161
log_assign_role(conn, user_id, org_id, role_id, project_id)
154162

front/lib/front_web/templates/people/members/__change_role_btn.html.eex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<div id="role_selector_<%= @member.id %>" class="dn">
1111
<%= for role <- @roles do %>
1212
<%= if role.name != "Owner" || @permissions["organization.change_owner"] do %>
13-
<%= construct_role_dropdown_option(role, @member) %>
13+
<%= construct_role_dropdown_option(role, @member, @member_type) %>
1414
<% end %>
1515
<% end %>
1616
</div>

front/lib/front_web/templates/people/members/_member.html.eex

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
<div class="flex items-center">
88
<span class="ml1 b">
99
<%= cond do %>
10-
<% Map.get(assigns, :is_service_account?) -> %>
10+
<% @member_type == :service_account -> %>
1111
<span class="black"><%= @member.name %></span>
12-
<% @is_group? -> %>
12+
<% @member_type == :group -> %>
1313
<%= if @permissions["organization.people.manage"] do %>
1414
<span class="black pointer" style="cursor: pointer;" name="modify-group-btn" group_id="<%= @member.id %>"><%= @member.name %></span>
1515
<% else %>
@@ -32,16 +32,16 @@
3232
<div class="button-group">
3333
<%= unless !@org_scope? && Front.ce_roles?() do %>
3434
<%= if Front.ce_roles?() do %>
35-
<div class="app-edit-person" data-config="<%= Poison.encode!(edit_person_config(@conn, @member, @roles, @permissions)) %>"></div>
35+
<div class="app-edit-person" data-config="<%= Poison.encode!(edit_person_config(@conn, @member, @member_type, @roles, @permissions)) %>"></div>
3636
<% else %>
37-
<%= render "members/__change_role_btn.html", member: @member, roles: @roles, permissions: @permissions %>
37+
<%= render "members/__change_role_btn.html", member: @member, member_type: @member_type, roles: @roles, permissions: @permissions %>
3838
<% end %>
3939
<% end %>
4040
<%= cond do %>
41-
<% @is_group? and @org_scope? -> %>
41+
<% @member_type == :group and @org_scope? -> %>
4242
<%= render "members/__modify_group_button.html", group: @member, permissions: @permissions %>
4343
<%= render "members/__delete_group_button.html", group: @member, conn: @conn, permissions: @permissions %>
44-
<% Map.get(assigns, :is_service_account?) -> %>
44+
<% @member_type == :service_account -> %>
4545
<%= if @org_scope? || !Front.ce_roles?() || "Member" in member_role_names do %>
4646
<%= render "members/__remove_member_btn.html", member: @member %>
4747
<% end %>

front/lib/front_web/templates/people/members/members_list.html.eex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
<div id="groups">
2020
<%= @groups |> Enum.map(fn (group) -> %>
21-
<%= render "members/_member.html", is_group?: true, member: group, roles: @roles, org_scope?: @org_scope?, conn: @conn, permissions: @permissions %>
21+
<%= render "members/_member.html", member_type: :group, member: group, roles: @roles, org_scope?: @org_scope?, conn: @conn, permissions: @permissions %>
2222
<% end) %>
2323
</div>
2424
</div>
@@ -39,7 +39,7 @@
3939

4040
<div id="members">
4141
<%= @members |> Enum.map(fn (member) -> %>
42-
<%= render "members/_member.html", is_group?: false, member: member, roles: @roles, org_scope?: @org_scope?, conn: @conn, permissions: @permissions %>
42+
<%= render "members/_member.html", member_type: :user, member: member, roles: @roles, org_scope?: @org_scope?, conn: @conn, permissions: @permissions %>
4343
<% end) %>
4444
</div>
4545
</div>
@@ -61,7 +61,7 @@
6161

6262
<div id="service_accounts">
6363
<%= @service_accounts |> Enum.map(fn (service_account) -> %>
64-
<%= render "members/_member.html", is_group?: false, is_service_account?: true, member: service_account, roles: @roles, org_scope?: @org_scope?, conn: @conn, permissions: @permissions %>
64+
<%= render "members/_member.html", member_type: :service_account, member: service_account, roles: @roles, org_scope?: @org_scope?, conn: @conn, permissions: @permissions %>
6565
<% end) %>
6666
<%= if Enum.empty?(@service_accounts) do %>
6767
<div class="pv5 tc">

front/lib/front_web/views/people_view.ex

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ defmodule FrontWeb.PeopleView do
9797
|> Enum.filter(& &1)
9898
end
9999

100-
def edit_person_config(conn, member, roles, permissions) do
100+
def edit_person_config(conn, member, member_type, roles, permissions) do
101101
filtered_roles =
102102
roles
103103
|> Enum.filter(fn
@@ -111,6 +111,7 @@ defmodule FrontWeb.PeopleView do
111111
avatar: member.avatar,
112112
name: member.name,
113113
email: member.email,
114+
member_type: member_type,
114115
roles: build_roles(member, filtered_roles),
115116
reset_password_url:
116117
url(:post, people_path(conn, :reset_password, member.id, format: "json")),
@@ -276,7 +277,7 @@ defmodule FrontWeb.PeopleView do
276277
end)
277278
end
278279

279-
def construct_role_dropdown_option(role, member) do
280+
def construct_role_dropdown_option(role, member, member_type) do
280281
role_selected? = role.name in Enum.map(member.subject_role_bindings, & &1.role.name)
281282

282283
binding_source =
@@ -289,7 +290,7 @@ defmodule FrontWeb.PeopleView do
289290
end
290291

291292
"""
292-
<div role_id="#{role.id}" user_id="#{member.id}" name="role_button" class="#{extrapolate_role_div_class(role_selected?, binding_source)}", style="#{extrapolate_role_div_style(binding_source)}">
293+
<div role_id="#{role.id}" user_id="#{member.id}" member_type="#{member_type}" name="role_button" class="#{extrapolate_role_div_class(role_selected?, binding_source)}", style="#{extrapolate_role_div_style(binding_source)}">
293294
<div style="flex-direction: column; display: flex;">
294295
#{if role_selected?,
295296
do: '<span class="material-symbols-outlined mr1">done</span>#{git_icon(binding_source)}',

0 commit comments

Comments
 (0)