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

Commit ff03347

Browse files
authored
feat(drink-thread): basic workflow (#418)
* chore: remove length arg when create article * chore: setup schema * chore: tests * chore: fix test * chore: fix mock * chore: fix migration * chore: length issue * chore: length issue
1 parent 57cb7ec commit ff03347

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+5300
-41
lines changed

config/config.exs

+3-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ config :groupher_server, :article,
6969
min_length: 10,
7070
max_length: 20_000,
7171
# NOTE: do not change unless you know what you are doing
72-
threads: [:post, :job, :repo, :blog, :works, :radar, :guide, :meetup],
72+
threads: [:post, :job, :repo, :blog, :works, :radar, :guide, :meetup, :drink],
7373
# in this period, paged articles will sort front if non-article-author commented
7474
# 在此时间段内,一旦有非文章作者的用户评论,该文章就会排到前面
7575
active_period_days: %{
@@ -80,7 +80,8 @@ config :groupher_server, :article,
8080
works: 10,
8181
radar: 10,
8282
guide: 10,
83-
meetup: 10
83+
meetup: 10,
84+
drink: 10
8485
},
8586

8687
# NOTE: if you want to add/remove emotion, just edit the list below

lib/groupher_server/cms/delegates/article_curd.ex

+1-1
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
526526
defp result({:ok, %{set_viewer_has_states: result}}), do: result |> done()
527527
defp result({:ok, %{update_article_meta: result}}), do: {:ok, result}
528528

529-
defp result({:error, :create_article, _result, _steps}) do
529+
defp result({:error, :create_article, result, _steps}) do
530530
{:error, [message: "create article", code: ecode(:create_fails)]}
531531
end
532532

lib/groupher_server/cms/models/blog.ex

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ defmodule GroupherServer.CMS.Model.Blog do
1515

1616
@required_fields ~w(title digest)a
1717
@article_cast_fields general_article_cast_fields()
18-
@optional_fields ~w(link_addr digest length)a ++ @article_cast_fields
18+
@optional_fields ~w(link_addr digest)a ++ @article_cast_fields
1919

2020
@type t :: %Blog{}
2121
schema "cms_blogs" do
2222
field(:link_addr, :string)
23-
field(:length, :integer)
2423

2524
article_tags_field(:blog)
2625
article_communities_field(:blog)
+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
defmodule GroupherServer.CMS.Model.Drink do
2+
@moduledoc false
3+
alias __MODULE__
4+
5+
use Ecto.Schema
6+
use Accessible
7+
8+
import Ecto.Changeset
9+
import GroupherServer.CMS.Helper.Macros
10+
11+
alias GroupherServer.CMS
12+
alias CMS.Model.Embeds
13+
14+
@timestamps_opts [type: :utc_datetime_usec]
15+
16+
@required_fields ~w(title digest)a
17+
@article_cast_fields general_article_cast_fields()
18+
@optional_fields @article_cast_fields
19+
20+
@type t :: %Drink{}
21+
schema "cms_drinks" do
22+
article_tags_field(:drink)
23+
article_communities_field(:drink)
24+
general_article_fields(:drink)
25+
end
26+
27+
@doc false
28+
def changeset(%Drink{} = drink, attrs) do
29+
drink
30+
|> cast(attrs, @optional_fields ++ @required_fields)
31+
|> validate_required(@required_fields)
32+
|> cast_embed(:meta, required: false, with: &Embeds.ArticleMeta.changeset/2)
33+
|> generl_changeset
34+
end
35+
36+
@doc false
37+
def update_changeset(%Drink{} = drink, attrs) do
38+
drink
39+
|> cast(attrs, @optional_fields ++ @required_fields)
40+
|> generl_changeset
41+
end
42+
43+
defp generl_changeset(changeset) do
44+
changeset
45+
|> validate_length(:title, min: 3, max: 50)
46+
|> cast_embed(:emotions, with: &Embeds.ArticleEmotion.changeset/2)
47+
end
48+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
defmodule GroupherServer.CMS.Model.DrinkDocument do
2+
@moduledoc """
3+
mainly for full-text search
4+
"""
5+
alias __MODULE__
6+
7+
use Ecto.Schema
8+
use Accessible
9+
10+
import Ecto.Changeset
11+
import Helper.Utils, only: [get_config: 2]
12+
13+
alias GroupherServer.CMS
14+
alias CMS.Model.Drink
15+
16+
@timestamps_opts [type: :utc_datetime_usec]
17+
18+
@max_body_length get_config(:article, :max_length)
19+
@min_body_length get_config(:article, :min_length)
20+
21+
@required_fields ~w(body body_html drink_id)a
22+
@optional_fields []
23+
24+
@type t :: %DrinkDocument{}
25+
schema "drink_documents" do
26+
belongs_to(:drink, Drink, foreign_key: :drink_id)
27+
28+
field(:body, :string)
29+
field(:body_html, :string)
30+
field(:toc, :map)
31+
end
32+
33+
@doc false
34+
def changeset(%DrinkDocument{} = drink, attrs) do
35+
drink
36+
|> cast(attrs, @optional_fields ++ @required_fields)
37+
|> validate_required(@required_fields)
38+
|> validate_length(:body, min: @min_body_length, max: @max_body_length)
39+
end
40+
41+
@doc false
42+
def update_changeset(%DrinkDocument{} = drink, attrs) do
43+
drink
44+
|> cast(attrs, @optional_fields ++ @required_fields)
45+
|> validate_length(:body, min: @min_body_length, max: @max_body_length)
46+
end
47+
end

lib/groupher_server/cms/models/job.ex

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ defmodule GroupherServer.CMS.Model.Job do
1212
alias CMS.Model.Embeds
1313

1414
@timestamps_opts [type: :utc_datetime_usec]
15-
@required_fields ~w(title company digest length)a
15+
@required_fields ~w(title company digest)a
1616
@article_cast_fields general_article_cast_fields()
1717
@optional_fields @article_cast_fields ++ ~w(desc company_link link_addr copy_right)a
1818

@@ -24,7 +24,6 @@ defmodule GroupherServer.CMS.Model.Job do
2424

2525
field(:link_addr, :string)
2626
field(:copy_right, :string)
27-
field(:length, :integer)
2827

2928
article_tags_field(:job)
3029
article_communities_field(:job)

lib/groupher_server/cms/models/post.ex

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ defmodule GroupherServer.CMS.Model.Post do
1515

1616
@timestamps_opts [type: :utc_datetime_usec]
1717

18-
@required_fields ~w(title digest length)a
18+
@required_fields ~w(title digest)a
1919
@article_cast_fields general_article_cast_fields()
2020
@optional_fields ~w(link_addr copy_right is_question is_solved solution_digest)a ++
2121
@article_cast_fields
@@ -24,7 +24,6 @@ defmodule GroupherServer.CMS.Model.Post do
2424
schema "cms_posts" do
2525
field(:link_addr, :string)
2626
field(:copy_right, :string)
27-
field(:length, :integer)
2827

2928
field(:is_question, :boolean, default: false)
3029
field(:is_solved, :boolean, default: false)

lib/groupher_server_web/schema/Helper/fields.ex

-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ defmodule GroupherServerWeb.Schema.Helper.Fields do
168168
defmacro article_filter_fields do
169169
quote do
170170
field(:when, :when_enum)
171-
field(:length, :length_enum)
172171
field(:article_tag, :string)
173172
field(:article_tags, list_of(:string))
174173
field(:community, :string)

lib/groupher_server_web/schema/cms/cms_metrics.ex

+7-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ defmodule GroupherServerWeb.Schema.CMS.Metrics do
161161
# field(:sort, :sort_input)
162162
field(:when, :when_enum)
163163
field(:sort, :sort_enum)
164-
field(:length, :length_enum)
165164
# @desc "Matching a tag"
166165
# @desc "Added to the menu after this date"
167166
# field(:added_after, :datetime)
@@ -226,6 +225,13 @@ defmodule GroupherServerWeb.Schema.CMS.Metrics do
226225
field(:sort, :sort_enum)
227226
end
228227

228+
@desc "drink_filter doc"
229+
input_object :paged_drinks_filter do
230+
pagination_args()
231+
article_filter_fields()
232+
field(:sort, :sort_enum)
233+
end
234+
229235
@desc "article_filter doc"
230236
input_object :paged_repos_filter do
231237
@desc "limit of records (default 20), if first > 30, only return 30 at most"

lib/groupher_server_web/schema/cms/cms_types.ex

+8-8
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
5858
general_article_fields()
5959
comments_fields()
6060

61-
field(:length, :integer)
6261
field(:link_addr, :string)
6362
field(:copy_right, :string)
6463

@@ -74,7 +73,6 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
7473
field(:desc, :string)
7574
field(:company, :string)
7675
field(:company_link, :string)
77-
field(:length, :integer)
7876
field(:link_addr, :string)
7977
field(:copy_right, :string)
8078

@@ -87,7 +85,6 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
8785
general_article_fields()
8886
comments_fields()
8987

90-
field(:length, :integer)
9188
field(:link_addr, :string)
9289

9390
timestamp_fields(:article)
@@ -99,7 +96,6 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
9996
general_article_fields()
10097
comments_fields()
10198

102-
field(:length, :integer)
10399
field(:link_addr, :string)
104100

105101
timestamp_fields(:article)
@@ -111,7 +107,6 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
111107
general_article_fields()
112108
comments_fields()
113109

114-
field(:length, :integer)
115110
field(:link_addr, :string)
116111

117112
timestamp_fields(:article)
@@ -123,7 +118,6 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
123118
general_article_fields()
124119
comments_fields()
125120

126-
field(:length, :integer)
127121
field(:link_addr, :string)
128122

129123
timestamp_fields(:article)
@@ -135,8 +129,14 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
135129
general_article_fields()
136130
comments_fields()
137131

138-
field(:length, :integer)
139-
field(:link_addr, :string)
132+
timestamp_fields(:article)
133+
end
134+
135+
object :drink do
136+
interface(:article)
137+
138+
general_article_fields()
139+
comments_fields()
140140

141141
timestamp_fields(:article)
142142
end

lib/groupher_server_web/schema/cms/mutations/blog.ex

-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ defmodule GroupherServerWeb.Schema.CMS.Mutations.Blog do
1111
arg(:title, non_null(:string))
1212
arg(:body, non_null(:string))
1313
arg(:digest, non_null(:string))
14-
arg(:length, :integer)
1514
arg(:community_id, non_null(:id))
1615
arg(:link_addr, :string)
1716
arg(:thread, :thread, default_value: :blog)
@@ -29,7 +28,6 @@ defmodule GroupherServerWeb.Schema.CMS.Mutations.Blog do
2928
arg(:title, :string)
3029
arg(:body, :string)
3130
arg(:digest, :string)
32-
arg(:length, :integer)
3331
arg(:link_addr, :string)
3432

3533
arg(:article_tags, list_of(:id))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
defmodule GroupherServerWeb.Schema.CMS.Mutations.Drink do
2+
@moduledoc """
3+
CMS mutations for drink
4+
"""
5+
use Helper.GqlSchemaSuite
6+
import GroupherServerWeb.Schema.Helper.Mutations
7+
8+
object :cms_drink_mutations do
9+
@desc "create a drink"
10+
field :create_drink, :drink do
11+
arg(:title, non_null(:string))
12+
arg(:body, non_null(:string))
13+
arg(:digest, non_null(:string))
14+
arg(:community_id, non_null(:id))
15+
arg(:thread, :thread, default_value: :drink)
16+
arg(:article_tags, list_of(:id))
17+
18+
middleware(M.Authorize, :login)
19+
middleware(M.PublishThrottle)
20+
resolve(&R.CMS.create_article/3)
21+
middleware(M.Statistics.MakeContribute, for: [:user, :community])
22+
end
23+
24+
@desc "update a cms/drink"
25+
field :update_drink, :drink do
26+
arg(:id, non_null(:id))
27+
arg(:title, :string)
28+
arg(:body, :string)
29+
arg(:digest, :string)
30+
31+
arg(:article_tags, list_of(:id))
32+
# ...
33+
34+
middleware(M.Authorize, :login)
35+
middleware(M.PassportLoader, source: :drink)
36+
middleware(M.Passport, claim: "owner;cms->c?->drink.edit")
37+
38+
resolve(&R.CMS.update_article/3)
39+
end
40+
41+
article_react_mutations(:drink, [
42+
:upvote,
43+
:pin,
44+
:mark_delete,
45+
:delete,
46+
:emotion,
47+
:report,
48+
:sink,
49+
:lock_comment
50+
])
51+
end
52+
end

lib/groupher_server_web/schema/cms/mutations/job.ex

-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ defmodule GroupherServerWeb.Schema.CMS.Mutations.Job do
1313
arg(:company_link, :string)
1414
arg(:body, non_null(:string))
1515
arg(:digest, non_null(:string))
16-
arg(:length, non_null(:integer))
1716
arg(:community_id, non_null(:id))
1817

1918
arg(:desc, :string)
@@ -35,7 +34,6 @@ defmodule GroupherServerWeb.Schema.CMS.Mutations.Job do
3534
arg(:title, :string)
3635
arg(:body, :string)
3736
arg(:digest, :string)
38-
arg(:length, :integer)
3937
arg(:copy_right, :string)
4038
arg(:desc, :string)
4139
arg(:link_addr, :string)

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

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ defmodule GroupherServerWeb.Schema.CMS.Mutations.Post do
1212
arg(:title, non_null(:string))
1313
arg(:body, non_null(:string))
1414
arg(:digest, non_null(:string))
15-
arg(:length, non_null(:integer))
1615
arg(:link_addr, :string)
1716
arg(:copy_right, :string)
1817
arg(:community_id, non_null(:id))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
defmodule GroupherServer.Repo.Migrations.CreateDrink do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:cms_drinks) do
6+
add(:thread, :string)
7+
add(:title, :string)
8+
add(:digest, :string)
9+
add(:views, :integer, default: 0)
10+
add(:mark_delete, :boolean, default: false)
11+
add(:meta, :map)
12+
add(:emotions, :map)
13+
add(:original_community_id, references(:communities, on_delete: :delete_all))
14+
add(:author_id, references(:cms_authors, on_delete: :delete_all), null: false)
15+
16+
add(:active_at, :utc_datetime)
17+
18+
# reaction
19+
add(:upvotes_count, :integer, default: 0)
20+
add(:collects_count, :integer, default: 0)
21+
22+
# comments
23+
add(:comments_participants_count, :integer, default: 0)
24+
add(:comments_count, :integer, default: 0)
25+
add(:comments_participants, :map)
26+
27+
timestamps()
28+
end
29+
30+
create(index(:cms_drinks, [:author_id]))
31+
end
32+
end

0 commit comments

Comments
 (0)