Skip to content

Commit 19112b1

Browse files
committed
add activity redirect controller
1 parent 1f47e97 commit 19112b1

File tree

7 files changed

+110
-24
lines changed

7 files changed

+110
-24
lines changed

lib/algora/accounts/accounts.ex

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,16 @@ defmodule Algora.Accounts do
310310
Repo.one(query)
311311
end
312312

313+
def get_user_by_handle(handle) do
314+
query =
315+
from(u in User,
316+
where: u.handle == ^handle,
317+
select: u
318+
)
319+
320+
Repo.one(query)
321+
end
322+
313323
def get_access_token(%User{} = user) do
314324
case Repo.one(from(i in Identity, where: i.user_id == ^user.id and i.provider == "github")) do
315325
%Identity{provider_token: token} -> {:ok, token}

lib/algora/activities/activities.ex

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@ defmodule Algora.Activities do
22
@moduledoc false
33
import Ecto.Query
44

5+
alias Algora.Accounts.Identity
56
alias Algora.Accounts.User
67
alias Algora.Activities.Activity
8+
alias Algora.Bounties.Bounty
79
alias Algora.Repo
810
alias Ecto.Multi
911

1012
@schema_from_table %{
11-
identity_activities: Algora.Accounts.Identity,
13+
identity_activities: Identity,
1214
user_activities: Algora.Accounts.User,
1315
attempt_activities: Algora.Bounties.Attempt,
1416
bonus_activities: Algora.Bounties.Bonus,
15-
bounty_activities: Algora.Bounties.Bounty,
17+
bounty_activities: Bounty,
1618
claim_activities: Algora.Bounties.Claim,
1719
tip_activities: Algora.Bounties.Tip,
1820
message_activities: Algora.Chat.Message,
@@ -40,9 +42,9 @@ defmodule Algora.Activities do
4042
connected_installations: "installation_activities",
4143
contractor_contracts: "contract_activities",
4244
created_bounties: "bounty_activities",
45+
# owned_bounties: "bounty_activities",
4346
owned_tips: "tip_activities",
4447
created_tips: "tip_activities",
45-
owned_bounties: "bounty_activities",
4648
identities: "identity_activities",
4749
owned_installations: "installation_activities",
4850
# projects: "project_activities",
@@ -147,20 +149,14 @@ defmodule Algora.Activities do
147149
|> Algora.Repo.insert()
148150
end
149151

150-
def dataloader do
151-
Dataloader.add_source(
152-
Dataloader.new(),
153-
:db,
154-
Dataloader.Ecto.new(Algora.Repo)
155-
)
156-
end
157-
158152
def all_with_assoc(query) do
159153
activities = Repo.all(query)
154+
source = Dataloader.Ecto.new(Algora.Repo)
155+
dataloader = Dataloader.add_source(Dataloader.new(), :db, source)
160156

161157
loader =
162158
activities
163-
|> Enum.reduce(dataloader(), fn activity, loader ->
159+
|> Enum.reduce(dataloader, fn activity, loader ->
164160
schema = schema_from_table(activity.assoc_name)
165161
Dataloader.load(loader, :db, schema, activity.assoc_id)
166162
end)
@@ -173,11 +169,75 @@ defmodule Algora.Activities do
173169
end)
174170
end
175171

176-
def schema_from_table(name) do
177-
Map.fetch!(@schema_from_table, String.to_atom(name))
172+
def get(table, id) do
173+
query =
174+
from a in table,
175+
where: a.id == ^id,
176+
select: %{
177+
id: a.id,
178+
type: a.type,
179+
assoc_id: a.assoc_id,
180+
assoc_name: ^table,
181+
inserted_at: a.inserted_at
182+
}
183+
184+
Algora.Repo.one(query)
185+
end
186+
187+
def get_assoc(prefix, assoc_id) when prefix in ["bounty_activities"] do
188+
get_assoc(prefix, assoc_id, [:owner])
189+
end
190+
191+
def get_assoc(prefix, assoc_id) when prefix in ["identity_activities"] do
192+
get_assoc(prefix, assoc_id, [:user])
193+
end
194+
195+
def get_assoc(prefix, assoc_id, preload) do
196+
assoc_table = schema_from_table(prefix)
197+
198+
query =
199+
from a in assoc_table,
200+
preload: ^preload,
201+
where: a.id == ^assoc_id
202+
203+
Algora.Repo.one(query)
204+
end
205+
206+
def get_with_assoc(table, id) do
207+
with %{assoc_id: assoc_id} = activity <- get(table, id),
208+
assoc when is_map(assoc) <- get_assoc(table, assoc_id) do
209+
Map.put(activity, :assoc, assoc)
210+
end
211+
end
212+
213+
def assoc_url(table, id) do
214+
activity = get_with_assoc(table, id)
215+
build_url(activity)
216+
end
217+
218+
def schema_from_table(name) when is_binary(name), do: name |> String.to_atom() |> schema_from_table()
219+
220+
def schema_from_table(name) when is_atom(name) do
221+
Map.fetch!(@schema_from_table, name)
178222
end
179223

180224
def table_from_user_relation(table) do
181225
Map.fetch!(@table_from_user_relation, table)
182226
end
227+
228+
def build_url(%{assoc: %Bounty{id: id, owner: owner}}) do
229+
{:ok, "/org/#{owner.handle}/bounties"}
230+
end
231+
232+
def build_url(%{assoc: %Identity{id: id, user: %{type: :individual} = user}}) do
233+
{:ok, "/@/#{user.handle}"}
234+
end
235+
236+
def build_url(%{assoc: %Identity{id: id, user: %{type: :organization} = user}}) do
237+
{:ok, "/org/#{user.handle}"}
238+
end
239+
240+
def build_url(a) do
241+
{:error, :not_found}
242+
end
183243
end

lib/algora_web/components/activity.ex

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,6 @@ defmodule AlgoraWeb.Components.Activity do
9898
"""
9999
end
100100

101-
defp url_for_activity(%{type: :identity_created, assoc: assoc}), do: "/@/#{assoc.provider_login}"
102-
103101
defp url_for_activity(activity) do
104102
slug = activity.assoc_name |> to_string() |> String.replace("_activities", "")
105103
"/a/#{slug}/#{activity.id}"

lib/algora_web/components/layouts/org.html.heex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@
116116
<span class="relative text-sm font-semibold">Docs</span>
117117
</.link>
118118
<%= if @current_user do %>
119+
{live_render(@socket, AlgoraWeb.Activity.UserNavTimelineLive,
120+
id: "activity-timeline",
121+
session: %{},
122+
sticky: true,
123+
assigns: %{current_user: @current_user}
124+
)}
119125
<div>
120126
<.dropdown2 id="dashboard-dropdown">
121127
<:img src={@current_org.avatar_url} alt={@current_org.handle} />

lib/algora_web/components/layouts/user.html.heex

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,15 +169,15 @@
169169
>
170170
<span class="relative text-sm font-semibold">Docs</span>
171171
</.link>
172-
<div>
173-
{live_render(@socket, AlgoraWeb.Activity.UserNavTimelineLive,
174-
id: "activity-timeline",
175-
session: %{},
176-
sticky: true,
177-
assigns: %{current_user: @current_user}
178-
)}
179-
</div>
180172
<%= if @current_user do %>
173+
<div>
174+
{live_render(@socket, AlgoraWeb.Activity.UserNavTimelineLive,
175+
id: "activity-timeline",
176+
session: %{},
177+
sticky: true,
178+
assigns: %{current_user: @current_user}
179+
)}
180+
</div>
181181
<div>
182182
<.dropdown2 id="dashboard-dropdown">
183183
<:img src={@current_user.avatar_url} alt={@current_user.handle} />
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
defmodule AlgoraWeb.ActivityController do
2+
use AlgoraWeb, :controller
3+
4+
alias Algora.Activities
5+
6+
def get(conn, %{"table_prefix" => table, "activity_id" => id} = _params) do
7+
with {:ok, url} <- Algora.Activities.assoc_url("#{table}_activities", id) do
8+
redirect(conn, external: url)
9+
end
10+
end
11+
end

lib/algora_web/router.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ defmodule AlgoraWeb.Router do
4444
end
4545

4646
get "/set_context/:context", ContextController, :set
47+
get "/a/:table_prefix/:activity_id", ActivityController, :get
4748

4849
get "/callbacks/stripe/refresh", StripeCallbackController, :refresh
4950
get "/callbacks/stripe/return", StripeCallbackController, :return

0 commit comments

Comments
 (0)