Skip to content

Commit dd993d4

Browse files
committed
feat: context switching validation and tests for user organization access
1 parent 379a4b7 commit dd993d4

File tree

3 files changed

+57
-11
lines changed

3 files changed

+57
-11
lines changed

lib/algora/accounts/accounts.ex

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule Algora.Accounts do
77
alias Algora.Accounts.User
88
alias Algora.Bounties.Bounty
99
alias Algora.Organizations
10+
alias Algora.Organizations.Member
1011
alias Algora.Payments.Transaction
1112
alias Algora.Repo
1213

@@ -386,7 +387,7 @@ defmodule Algora.Accounts do
386387
from(b in Bounty,
387388
join: c in assoc(b, :creator),
388389
where: c.id in ^Enum.map(orgs, & &1.id),
389-
order_by: [desc: b.created_at],
390+
order_by: [desc: b.inserted_at],
390391
limit: 1,
391392
select_merge: %{creator: c}
392393
)
@@ -413,6 +414,26 @@ defmodule Algora.Accounts do
413414

414415
def default_context, do: "personal"
415416

417+
def set_context(%User{} = user, "personal") do
418+
update_settings(user, %{last_context: "personal"})
419+
end
420+
421+
def set_context(%User{} = user, context) do
422+
membership =
423+
Repo.one(
424+
from(m in Member,
425+
join: o in assoc(m, :org),
426+
where: m.user_id == ^user.id and o.handle == ^context
427+
)
428+
)
429+
430+
if membership do
431+
update_settings(user, %{last_context: context})
432+
else
433+
{:error, :unauthorized}
434+
end
435+
end
436+
416437
defp get_flag(user), do: Algora.Misc.CountryEmojis.get(user.country, "🌎")
417438

418439
# TODO: implement this

lib/algora_web/controllers/context_controller.ex

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@ defmodule AlgoraWeb.ContextController do
55
alias AlgoraWeb.UserAuth
66

77
def set(conn, %{"context" => context}) do
8-
# TODO: validate context is accessible by user
8+
case Accounts.set_context(conn.assigns.current_user, context) do
9+
{:ok, user} ->
10+
conn
11+
|> assign(:current_user, user)
12+
|> put_session(:last_context, context)
13+
|> redirect(to: UserAuth.signed_in_path_from_context(context))
914

10-
conn =
11-
case Accounts.update_settings(conn.assigns.current_user, %{last_context: context}) do
12-
{:ok, user} -> assign(conn, :current_user, user)
13-
{:error, _} -> conn
14-
end
15-
16-
conn
17-
|> put_session(:last_context, context)
18-
|> redirect(to: UserAuth.signed_in_path_from_context(context))
15+
{:error, _} ->
16+
redirect(conn, to: "/")
17+
end
1918
end
2019
end

test/algora/accounts_test.exs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,30 @@ defmodule Algora.AccountsTest do
3636
assert_activity_names_for_user(org_1.id, [])
3737
end
3838
end
39+
40+
describe "set_context/2" do
41+
test "can set context to personal" do
42+
user = insert(:user, last_context: nil)
43+
44+
assert {:ok, user} = Accounts.set_context(user, "personal")
45+
assert Accounts.last_context(user) == "personal"
46+
end
47+
48+
test "can set context to member org" do
49+
user = insert(:user, last_context: nil)
50+
org = insert(:organization)
51+
insert(:member, user: user, org: org)
52+
53+
assert {:ok, user} = Accounts.set_context(user, org.handle)
54+
assert Accounts.last_context(user) == org.handle
55+
end
56+
57+
test "cannot set context to non-member org" do
58+
user = insert(:user, last_context: nil)
59+
org = insert(:organization)
60+
61+
assert {:error, :unauthorized} = Accounts.set_context(user, org.handle)
62+
assert Accounts.last_context(user) == "personal"
63+
end
64+
end
3965
end

0 commit comments

Comments
 (0)