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

Commit 81b4fa5

Browse files
committed
Merge branch 'radar-source' into dev
2 parents fb59a58 + 794437a commit 81b4fa5

File tree

6 files changed

+165
-1
lines changed

6 files changed

+165
-1
lines changed

lib/mastani_server/cms/post.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ defmodule MastaniServer.CMS.Post do
1919

2020
@timestamps_opts [type: :utc_datetime_usec]
2121
@required_fields ~w(title body digest length)a
22-
@optional_fields ~w(link_addr copy_right link_addr)a
22+
@optional_fields ~w(link_addr copy_right link_addr link_icon)a
2323

2424
@type t :: %Post{}
2525
schema "cms_posts" do
2626
field(:body, :string)
2727
field(:title, :string)
2828
field(:digest, :string)
2929
field(:link_addr, :string)
30+
field(:link_icon, :string)
3031
field(:copy_right, :string)
3132
field(:length, :integer)
3233
field(:views, :integer, default: 0)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# ---
2+
# parse and add source icon to radar posts
3+
# ---
4+
defmodule MastaniServerWeb.Middleware.AddSourceIcon do
5+
@moduledoc """
6+
parse and add source icon to radar posts
7+
"""
8+
@behaviour Absinthe.Middleware
9+
10+
@parse_error "https://cps-oss.oss-cn-shanghai.aliyuncs.com/icons/radar_source/url_parse_waning.png"
11+
@wanqu "https://cps-oss.oss-cn-shanghai.aliyuncs.com/icons/radar_source/wanqu.png"
12+
@solidot "https://cps-oss.oss-cn-shanghai.aliyuncs.com/icons/radar_source/solidot.png"
13+
@techcrunch "https://cps-oss.oss-cn-shanghai.aliyuncs.com/icons/radar_source/techcrunch.png"
14+
@default_radar "https://cps-oss.oss-cn-shanghai.aliyuncs.com/icons/radar_source/default_radar.png"
15+
16+
def call(%{arguments: %{topic: "radar"} = arguments} = resolution, _) do
17+
link_icon = parse_source_addr(arguments)
18+
%{resolution | arguments: Map.merge(arguments, %{link_icon: link_icon})}
19+
end
20+
21+
def call(resolution, _), do: resolution
22+
23+
defp parse_source_addr(%{link_addr: link_addr}) do
24+
result = URI.parse(link_addr)
25+
26+
case Map.get(result, :host) do
27+
nil -> source_addr(:error)
28+
host -> source_addr(host)
29+
end
30+
end
31+
32+
defp parse_source_addr(_), do: @default_radar
33+
34+
defp source_addr("wanqu.co"), do: @wanqu
35+
defp source_addr("www.solidot.org"), do: @solidot
36+
defp source_addr("techcrunch.cn"), do: @techcrunch
37+
defp source_addr("techcrunch.com"), do: @techcrunch
38+
39+
defp source_addr(:error), do: @parse_error
40+
defp source_addr(_), do: @default_radar
41+
end

lib/mastani_server_web/schema/cms/cms_types.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ defmodule MastaniServerWeb.Schema.CMS.Types do
2525
field(:digest, :string)
2626
field(:length, :integer)
2727
field(:link_addr, :string)
28+
field(:link_icon, :string)
2829
field(:copy_right, :string)
2930
field(:body, :string)
3031
field(:views, :integer)

lib/mastani_server_web/schema/cms/mutations/post.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ defmodule MastaniServerWeb.Schema.CMS.Mutations.Post do
2121

2222
middleware(M.Authorize, :login)
2323
middleware(M.PublishThrottle)
24+
middleware(M.AddSourceIcon)
2425
# middleware(M.PublishThrottle, interval: 3, hour_limit: 15, day_limit: 30)
2526
resolve(&R.CMS.create_content/3)
2627
middleware(M.Statistics.MakeContribute, for: :user)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule MastaniServer.Repo.Migrations.AddLinkIconToPosts do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:cms_posts) do
6+
add(:link_icon, :string)
7+
end
8+
end
9+
end
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
defmodule MastaniServer.Test.Mutation.Radar do
2+
use MastaniServer.TestTools
3+
4+
# alias Helper.ORM
5+
6+
setup do
7+
{:ok, post} = db_insert(:post)
8+
9+
guest_conn = simu_conn(:guest)
10+
user_conn = simu_conn(:user)
11+
owner_conn = simu_conn(:owner, post)
12+
13+
{:ok, ~m(user_conn guest_conn owner_conn post)a}
14+
end
15+
16+
describe "[mutation radar posts]" do
17+
@create_post_query """
18+
mutation(
19+
$title: String!
20+
$body: String!
21+
$digest: String!
22+
$length: Int!
23+
$communityId: ID!
24+
$tags: [Ids]
25+
$mentionUsers: [Ids]
26+
$linkAddr: String
27+
$topic: String
28+
) {
29+
createPost(
30+
title: $title
31+
body: $body
32+
digest: $digest
33+
length: $length
34+
communityId: $communityId
35+
tags: $tags
36+
mentionUsers: $mentionUsers
37+
linkAddr: $linkAddr
38+
topic: $topic
39+
) {
40+
title
41+
id
42+
linkAddr
43+
linkIcon
44+
}
45+
}
46+
"""
47+
@wanqu "https://cps-oss.oss-cn-shanghai.aliyuncs.com/icons/radar_source/wanqu.png"
48+
@default_radar "https://cps-oss.oss-cn-shanghai.aliyuncs.com/icons/radar_source/default_radar.png"
49+
@parse_error "https://cps-oss.oss-cn-shanghai.aliyuncs.com/icons/radar_source/url_parse_waning.png"
50+
51+
test "create radar with known source will auto add link icon addr" do
52+
{:ok, user} = db_insert(:user)
53+
user_conn = simu_conn(:user, user)
54+
55+
{:ok, community} = db_insert(:community)
56+
post_attr = mock_attrs(:post)
57+
58+
variables =
59+
post_attr
60+
|> Map.merge(%{
61+
communityId: community.id,
62+
linkAddr: "https://wanqu.co/a/7237/",
63+
topic: "radar"
64+
})
65+
66+
created = user_conn |> mutation_result(@create_post_query, variables, "createPost")
67+
assert created["linkIcon"] == @wanqu
68+
assert created["linkAddr"] == "https://wanqu.co/a/7237/"
69+
end
70+
71+
test "create radar with unknown source will add default link icon addr" do
72+
{:ok, user} = db_insert(:user)
73+
user_conn = simu_conn(:user, user)
74+
75+
{:ok, community} = db_insert(:community)
76+
post_attr = mock_attrs(:post)
77+
78+
variables =
79+
post_attr
80+
|> Map.merge(%{
81+
communityId: community.id,
82+
linkAddr: "https://unknown.com",
83+
topic: "radar"
84+
})
85+
86+
created = user_conn |> mutation_result(@create_post_query, variables, "createPost")
87+
assert created["linkIcon"] == @default_radar
88+
assert created["linkAddr"] == "https://unknown.com"
89+
end
90+
91+
test "create radar with invalid link addr will add error link icon addr" do
92+
{:ok, user} = db_insert(:user)
93+
user_conn = simu_conn(:user, user)
94+
95+
{:ok, community} = db_insert(:community)
96+
post_attr = mock_attrs(:post)
97+
98+
variables =
99+
post_attr
100+
|> Map.merge(%{
101+
communityId: community.id,
102+
linkAddr: "watdjfiefejife",
103+
topic: "radar"
104+
})
105+
106+
created = user_conn |> mutation_result(@create_post_query, variables, "createPost")
107+
assert created["linkIcon"] == @parse_error
108+
assert created["linkAddr"] == "watdjfiefejife"
109+
end
110+
end
111+
end

0 commit comments

Comments
 (0)