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

Commit 944114b

Browse files
authored
feat: Guide thread (#416)
* chore(guide): basic migration & model setup * chore(guide): tests * chore(guide): typo * chore(guide): fix migration schema
1 parent 188c18a commit 944114b

File tree

34 files changed

+4243
-2
lines changed

34 files changed

+4243
-2
lines changed

config/config.exs

Lines changed: 3 additions & 2 deletions
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],
72+
threads: [:post, :job, :repo, :blog, :works, :radar, :guide],
7373
# in this period, paged articles will sort front if non-article-author commented
7474
# 在此时间段内,一旦有非文章作者的用户评论,该文章就会排到前面
7575
active_period_days: %{
@@ -78,7 +78,8 @@ config :groupher_server, :article,
7878
repo: 10,
7979
blog: 10,
8080
works: 10,
81-
radar: 10
81+
radar: 10,
82+
guide: 10
8283
},
8384

8485
# NOTE: if you want to add/remove emotion, just edit the list below
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
defmodule GroupherServer.CMS.Model.Guide 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 :: %Guide{}
21+
schema "cms_guides" do
22+
article_tags_field(:guide)
23+
article_communities_field(:guide)
24+
general_article_fields(:guide)
25+
end
26+
27+
@doc false
28+
def changeset(%Guide{} = guide, attrs) do
29+
guide
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(%Guide{} = guide, attrs) do
38+
guide
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
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
defmodule GroupherServer.CMS.Model.GuideDocument 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.Guide
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 guide_id)a
22+
@optional_fields []
23+
24+
@type t :: %GuideDocument{}
25+
schema "guide_documents" do
26+
belongs_to(:guide, Guide, foreign_key: :guide_id)
27+
28+
field(:body, :string)
29+
field(:body_html, :string)
30+
field(:toc, :map)
31+
end
32+
33+
@doc false
34+
def changeset(%GuideDocument{} = guide, attrs) do
35+
guide
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(%GuideDocument{} = guide, attrs) do
43+
guide
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_web/schema/cms/cms_metrics.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,13 @@ defmodule GroupherServerWeb.Schema.CMS.Metrics do
212212
field(:sort, :sort_enum)
213213
end
214214

215+
@desc "guide_filter doc"
216+
input_object :paged_guides_filter do
217+
pagination_args()
218+
article_filter_fields()
219+
field(:sort, :sort_enum)
220+
end
221+
215222
@desc "article_filter doc"
216223
input_object :paged_repos_filter do
217224
@desc "limit of records (default 20), if first > 30, only return 30 at most"

lib/groupher_server_web/schema/cms/cms_types.ex

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,18 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
117117
timestamp_fields(:article)
118118
end
119119

120+
object :guide do
121+
interface(:article)
122+
123+
general_article_fields()
124+
comments_fields()
125+
126+
field(:length, :integer)
127+
field(:link_addr, :string)
128+
129+
timestamp_fields(:article)
130+
end
131+
120132
object :repo do
121133
interface(:article)
122134

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
defmodule GroupherServerWeb.Schema.CMS.Mutations.Guide do
2+
@moduledoc """
3+
CMS mutations for guide
4+
"""
5+
use Helper.GqlSchemaSuite
6+
import GroupherServerWeb.Schema.Helper.Mutations
7+
8+
object :cms_guide_mutations do
9+
@desc "create a guide"
10+
field :create_guide, :guide 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: :guide)
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/guide"
25+
field :update_guide, :guide 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: :guide)
36+
middleware(M.Passport, claim: "owner;cms->c?->guide.edit")
37+
38+
resolve(&R.CMS.update_article/3)
39+
end
40+
41+
article_react_mutations(:guide, [
42+
:upvote,
43+
:pin,
44+
:mark_delete,
45+
:delete,
46+
:emotion,
47+
:report,
48+
:sink,
49+
:lock_comment
50+
])
51+
end
52+
end
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
defmodule GroupherServer.Repo.Migrations.CreateGuide do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:cms_guides) 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_guides, [:author_id]))
31+
end
32+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
defmodule GroupherServer.Repo.Migrations.CreateGuideDocument do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:guide_documents) do
6+
add(:guide_id, references(:cms_guides, on_delete: :delete_all), null: false)
7+
add(:body, :text)
8+
add(:body_html, :text)
9+
add(:markdown, :text)
10+
add(:toc, :map)
11+
end
12+
end
13+
end
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
defmodule GroupherServer.Repo.Migrations.CreateCommunitiesJoinGuides do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:communities_join_guides) do
6+
add(:community_id, references(:communities, on_delete: :delete_all), null: false)
7+
add(:guide_id, references(:cms_guides, on_delete: :delete_all), null: false)
8+
end
9+
10+
create(unique_index(:communities_join_guides, [:community_id, :guide_id]))
11+
end
12+
end
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
defmodule GroupherServer.Repo.Migrations.AddGuideIdToOthers do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:articles_join_tags) do
6+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
7+
end
8+
9+
alter table(:abuse_reports) do
10+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
11+
end
12+
13+
alter table(:article_collects) do
14+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
15+
end
16+
17+
alter table(:article_upvotes) do
18+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
19+
end
20+
21+
alter table(:comments) do
22+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
23+
end
24+
25+
alter table(:pinned_comments) do
26+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
27+
end
28+
29+
alter table(:articles_users_emotions) do
30+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
31+
end
32+
33+
alter table(:pinned_articles) do
34+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
35+
end
36+
37+
alter table(:cited_artiments) do
38+
add(:guide_id, references(:cms_guides, on_delete: :delete_all))
39+
end
40+
end
41+
end

0 commit comments

Comments
 (0)