Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit e50c50d

Browse files
committed
refactor(subed-communities): add sort index support
1 parent f5a459b commit e50c50d

File tree

12 files changed

+130
-24
lines changed

12 files changed

+130
-24
lines changed

config/config.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ config :mastani_server, :customization,
5959
contents_layout: "digest",
6060
content_divider: false,
6161
mark_viewed: true,
62-
display_density: "20"
62+
display_density: "20",
63+
sidebar_communities_index: %{}
6364

6465
config :mastani_server, MastaniServerWeb.Gettext, default_locale: "zh_CN", locales: ~w(en zh_CN)
6566

lib/mastani_server/accounts/customization.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ defmodule MastaniServer.Accounts.Customization do
88
alias MastaniServer.Accounts.User
99

1010
@required_fields ~w(user_id)a
11-
@optional_fields ~w(theme sidebar_layout community_chart brainwash_free banner_layout contents_layout content_divider mark_viewed display_density)a
11+
@optional_fields ~w(theme sidebar_layout sidebar_communities_index community_chart brainwash_free banner_layout contents_layout content_divider mark_viewed display_density)a
1212

1313
@type t :: %Customization{}
1414
schema "customizations" do
1515
belongs_to(:user, User)
1616

1717
field(:theme, :boolean)
1818
field(:sidebar_layout, :map)
19+
field(:sidebar_communities_index, :map)
20+
1921
field(:community_chart, :boolean)
2022
field(:brainwash_free, :boolean)
2123

lib/mastani_server/accounts/delegates/customization.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ defmodule MastaniServer.Accounts.Delegate.Customization do
8686
def valid_custom_items(:free) do
8787
[
8888
:sidebar_layout,
89+
:sidebar_communities_index,
8990
:banner_layout,
9091
:contents_layout,
9192
:content_divider,

lib/mastani_server/accounts/delegates/profile.ex

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defmodule MastaniServer.Accounts.Delegate.Profile do
66
import Helper.Utils, only: [done: 1, get_config: 2]
77
import ShortMaps
88

9+
alias MastaniServer.Accounts
910
alias Helper.{Guardian, ORM, QueryBuilder, RadarSearch}
1011
alias MastaniServer.Accounts.{Achievement, GithubUser, User}
1112
alias MastaniServer.{CMS, Repo}
@@ -47,9 +48,6 @@ defmodule MastaniServer.Accounts.Delegate.Profile do
4748
update geo info for user, include geo_city & remote ip
4849
"""
4950
def update_geo(%User{geo_city: geo_city} = user, remote_ip) when is_nil(geo_city) do
50-
IO.inspect(geo_city, label: "update_geo geo_city nil")
51-
IO.inspect(remote_ip, label: "update_geo remote_ip")
52-
5351
case RadarSearch.locate_city(remote_ip) do
5452
{:ok, city} ->
5553
update_profile(user, %{geo_city: city, remote_ip: remote_ip})
@@ -60,15 +58,8 @@ defmodule MastaniServer.Accounts.Delegate.Profile do
6058
end
6159
end
6260

63-
def update_geo(%User{} = user, remote_ip) do
64-
IO.inspect(user, label: "update_geo geo_city not nil")
65-
IO.inspect(remote_ip, label: "update_geo geo_city not nil remote_ip")
66-
update_profile(user, %{remote_ip: remote_ip})
67-
end
68-
69-
def update_geo(_user, _remote_ip) do
70-
{:ok, "pass"}
71-
end
61+
def update_geo(%User{} = user, remote_ip), do: update_profile(user, %{remote_ip: remote_ip})
62+
def update_geo(_user, _remote_ip), do: {:ok, "pass"}
7263

7364
@doc """
7465
github_signin steps:
@@ -101,18 +92,38 @@ defmodule MastaniServer.Accounts.Delegate.Profile do
10192
@doc """
10293
get users subscribed communities
10394
"""
104-
def subscribed_communities(%User{id: id}, %{page: page, size: size} = filter) do
95+
def subscribed_communities(%User{id: id} = user, %{page: page, size: size} = filter) do
10596
filter = filter |> Map.delete(:first)
106-
97+
# TODO: merge customed index
10798
CMS.CommunitySubscriber
10899
|> where([c], c.user_id == ^id)
109100
|> join(:inner, [c], cc in assoc(c, :community))
110101
|> select([c, cc], cc)
111102
|> QueryBuilder.filter_pack(filter)
112103
|> ORM.paginater(~m(page size)a)
104+
|> sort_communities(user)
113105
|> done()
114106
end
115107

108+
# sort by users sort customization
109+
defp sort_communities(paged_communities, user) do
110+
with {:ok, customization} <- Accounts.get_customization(user) do
111+
case Enum.empty?(customization.sidebar_communities_index) do
112+
true ->
113+
paged_communities
114+
115+
false ->
116+
entries =
117+
Enum.map(paged_communities.entries, fn c ->
118+
index = Map.get(customization.sidebar_communities_index, c.raw, 100_000)
119+
%{c | index: index}
120+
end)
121+
122+
%{paged_communities | entries: entries}
123+
end
124+
end
125+
end
126+
116127
defp register_github_user(github_profile) do
117128
Multi.new()
118129
|> Multi.run(:create_user, fn _ ->

lib/mastani_server_web/resolvers/accounts_resolver.ex

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,20 @@ defmodule MastaniServerWeb.Resolvers.Accounts do
6363
# Accounts.set_customization(%User{id: user_id}, customization)
6464
# end
6565

66-
def set_customization(_root, ~m(customization)a, %{context: %{cur_user: cur_user}}) do
66+
def set_customization(_root, ~m(customization)a = args, %{context: %{cur_user: cur_user}}) do
67+
sidebar_communities_index =
68+
try do
69+
args
70+
|> Map.get(:sidebar_communities_index, [])
71+
|> Enum.map(fn %{community: c, index: i} -> {c, i} end)
72+
|> Map.new()
73+
rescue
74+
_ -> %{}
75+
end
76+
77+
customization =
78+
Map.merge(customization, %{sidebar_communities_index: sidebar_communities_index})
79+
6780
Accounts.set_customization(cur_user, customization)
6881
end
6982

lib/mastani_server_web/schema/account/account_misc.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ defmodule MastaniServerWeb.Schema.Account.Misc do
7272
field(:content_divider, :boolean)
7373
field(:mark_viewed, :boolean)
7474
field(:display_density, :string, default_value: "20")
75+
# field(:sidebar_communities_index, list_of(:community_index))
76+
end
77+
78+
input_object :community_index do
79+
field(:community, :string)
80+
field(:index, :integer)
7581
end
7682

7783
# see: https://github.com/absinthe-graphql/absinthe/issues/206

lib/mastani_server_web/schema/account/account_mutations.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ defmodule MastaniServerWeb.Schema.Account.Mutations do
101101
field :set_customization, :user do
102102
arg(:user_id, :id)
103103
arg(:customization, non_null(:customization_input))
104+
arg(:sidebar_communities_index, list_of(:community_index))
104105

105106
resolve(&R.Accounts.set_customization/3)
106107
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule MastaniServer.Repo.Migrations.AddCommunitiesIndexToC11n do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:customizations) do
6+
add(:sidebar_communities_index, :map)
7+
end
8+
end
9+
end

test/mastani_server/accounts/customization_test.exs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,18 @@ defmodule MastaniServer.Test.Accounts.Customization do
3131
{:ok, _result} = Accounts.set_customization(user, :brainwash_free, true)
3232
end
3333

34+
@tag :wip
3435
test "user can set multiable customization at once", ~m(user)a do
3536
{:ok, result} =
3637
Accounts.set_customization(user, %{
3738
content_divider: true,
38-
sidebar_layout: %{hello: :world}
39+
sidebar_layout: %{hello: :world},
40+
sidebar_communities_index: %{javascript: 1, elixir: 2}
3941
})
4042

4143
assert result.content_divider == true
4244
assert result.sidebar_layout == %{hello: :world}
45+
assert result.sidebar_communities_index == %{javascript: 1, elixir: 2}
4346

4447
assert {:error, _result} =
4548
Accounts.set_customization(user, %{content_divider: true, no_exsit: true})

test/mastani_server_web/mutation/accounts/customization_test.exs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,16 @@ defmodule MastaniServer.Test.Mutation.Account.Customization do
1515

1616
describe "[account customization mutation]" do
1717
@query """
18-
mutation($userId: ID, $customization: CustomizationInput!) {
19-
setCustomization( userId: $userId, customization: $customization) {
18+
mutation(
19+
$userId: ID,
20+
$customization: CustomizationInput!,
21+
$sidebarCommunitiesIndex: [CommunityIndex]
22+
) {
23+
setCustomization(
24+
userId: $userId,
25+
customization: $customization,
26+
sidebarCommunitiesIndex: $sidebarCommunitiesIndex
27+
) {
2028
id
2129
customization {
2230
bannerLayout
@@ -27,6 +35,7 @@ defmodule MastaniServer.Test.Mutation.Account.Customization do
2735
}
2836
}
2937
"""
38+
@tag :wip
3039
test "user can set customization", ~m(user_conn)a do
3140
# ownd_conn = simu_conn(:user, user)
3241
variables = %{
@@ -35,7 +44,8 @@ defmodule MastaniServer.Test.Mutation.Account.Customization do
3544
contentDivider: true,
3645
markViewed: false,
3746
displayDensity: "25"
38-
}
47+
},
48+
sidebarCommunitiesIndex: [%{community: "javascript", index: 1}]
3949
}
4050

4151
result = user_conn |> mutation_result(@query, variables, "setCustomization")

0 commit comments

Comments
 (0)