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

Commit 57cb7ec

Browse files
authored
feat(meetup): basic workflow (#417)
* chore(meetup): basic setup * chore(meetup): basic setup model, schema * chore(meetup): tests * chore(meetup): fix tests
1 parent 944114b commit 57cb7ec

40 files changed

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

8586
# 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.Meetup 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 :: %Meetup{}
21+
schema "cms_meetups" do
22+
article_tags_field(:meetup)
23+
article_communities_field(:meetup)
24+
general_article_fields(:meetup)
25+
end
26+
27+
@doc false
28+
def changeset(%Meetup{} = meetup, attrs) do
29+
meetup
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(%Meetup{} = meetup, attrs) do
38+
meetup
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.MeetupDocument 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.Meetup
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 meetup_id)a
22+
@optional_fields []
23+
24+
@type t :: %MeetupDocument{}
25+
schema "meetup_documents" do
26+
belongs_to(:meetup, Meetup, foreign_key: :meetup_id)
27+
28+
field(:body, :string)
29+
field(:body_html, :string)
30+
field(:toc, :map)
31+
end
32+
33+
@doc false
34+
def changeset(%MeetupDocument{} = meetup, attrs) do
35+
meetup
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(%MeetupDocument{} = meetup, attrs) do
43+
meetup
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
@@ -219,6 +219,13 @@ defmodule GroupherServerWeb.Schema.CMS.Metrics do
219219
field(:sort, :sort_enum)
220220
end
221221

222+
@desc "meetup_filter doc"
223+
input_object :paged_meetups_filter do
224+
pagination_args()
225+
article_filter_fields()
226+
field(:sort, :sort_enum)
227+
end
228+
222229
@desc "article_filter doc"
223230
input_object :paged_repos_filter do
224231
@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
@@ -129,6 +129,18 @@ defmodule GroupherServerWeb.Schema.CMS.Types do
129129
timestamp_fields(:article)
130130
end
131131

132+
object :meetup do
133+
interface(:article)
134+
135+
general_article_fields()
136+
comments_fields()
137+
138+
field(:length, :integer)
139+
field(:link_addr, :string)
140+
141+
timestamp_fields(:article)
142+
end
143+
132144
object :repo do
133145
interface(:article)
134146

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
defmodule GroupherServerWeb.Schema.CMS.Mutations.Meetup do
2+
@moduledoc """
3+
CMS mutations for meetup
4+
"""
5+
use Helper.GqlSchemaSuite
6+
import GroupherServerWeb.Schema.Helper.Mutations
7+
8+
object :cms_meetup_mutations do
9+
@desc "create a meetup"
10+
field :create_meetup, :meetup 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: :meetup)
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/meetup"
25+
field :update_meetup, :meetup 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: :meetup)
36+
middleware(M.Passport, claim: "owner;cms->c?->meetup.edit")
37+
38+
resolve(&R.CMS.update_article/3)
39+
end
40+
41+
article_react_mutations(:meetup, [
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.CreateMeetup do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:cms_meetups) 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_meetups, [: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.CreateMeetupDocument do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:meetup_documents) do
6+
add(:meetup_id, references(:cms_meetups, 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.CreateCommunitiesJoinMeetups do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:communities_join_meetups) do
6+
add(:community_id, references(:communities, on_delete: :delete_all), null: false)
7+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all), null: false)
8+
end
9+
10+
create(unique_index(:communities_join_meetups, [:community_id, :meetup_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.AddMeetupToOthers do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:articles_join_tags) do
6+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
7+
end
8+
9+
alter table(:abuse_reports) do
10+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
11+
end
12+
13+
alter table(:article_collects) do
14+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
15+
end
16+
17+
alter table(:article_upvotes) do
18+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
19+
end
20+
21+
alter table(:comments) do
22+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
23+
end
24+
25+
alter table(:pinned_comments) do
26+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
27+
end
28+
29+
alter table(:articles_users_emotions) do
30+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
31+
end
32+
33+
alter table(:pinned_articles) do
34+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
35+
end
36+
37+
alter table(:cited_artiments) do
38+
add(:meetup_id, references(:cms_meetups, on_delete: :delete_all))
39+
end
40+
end
41+
end

0 commit comments

Comments
 (0)