Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit99ba102

Browse files
authored
chore: works GQ endpoint (#432)
* chore: wip* chore: wip* chore: basic create* refactor(works): use Multi to re-org create/update* refactor(works): gq endpoint wip* refactor(works): gq endpoint wip* refactor(works): update GQ endpoint
1 parent1f894f1 commit99ba102

22 files changed

+754
-60
lines changed

‎lib/groupher_server/cms/cms.ex‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ defmodule GroupherServer.CMS do
1111
AbuseReport,
1212
ArticleCURD,
1313
BlogCURD,
14+
WorksCURD,
1415
ArticleCommunity,
1516
ArticleEmotion,
1617
CitedArtiment,
@@ -108,6 +109,9 @@ defmodule GroupherServer.CMS do
108109
defdelegateupdate_blog_rss(attrs),to:BlogCURD
109110
defdelegateblog_rss_info(rss),to:BlogCURD
110111

112+
defdelegatecreate_works(attrs,user),to:WorksCURD
113+
defdelegateupdate_works(attrs,user),to:WorksCURD
114+
111115
defdelegatepaged_citing_contents(type,id,filter),to:CitedArtiment
112116

113117
defdelegateupvote_article(thread,article_id,user),to:ArticleUpvote

‎lib/groupher_server/cms/delegates/article_curd.ex‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
1313
module_to_atom:1,
1414
get_config:2,
1515
ensure:2,
16-
module_to_upcase:1
16+
module_to_upcase:1,
17+
atom_values_to_upcase:1
1718
]
1819

1920
importGroupherServer.CMS.Delegate.Helper,only:[mark_viewer_emotion_states:2,thread_of:1]
@@ -189,6 +190,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
189190
{:ok, %Post{}}
190191
"""
191192
defcreate_article(%Community{id:cid},thread,attrs,%User{id:uid})do
193+
attrs=atom_values_to_upcase(attrs)
194+
192195
with{:ok,author}<-ensure_author_exists(%User{id:uid}),
193196
{:ok,info}<-match(thread),
194197
{:ok,community}<-ORM.find(Community,cid)do
@@ -258,6 +261,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
258261
do:raise_error(:archived,"article is archived, can not be edit or delete")
259262

260263
defupdate_article(article,attrs)do
264+
attrs=atom_values_to_upcase(attrs)
265+
261266
Multi.new()
262267
|>Multi.run(:update_article,fn_,_->
263268
do_update_article(article,attrs)

‎lib/groupher_server/cms/delegates/blog_curd.ex‎

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule GroupherServer.CMS.Delegate.BlogCURD do
33
CURD operation on post/job ...
44
"""
55
importEcto.Query,warn:false
6-
importHelper.Utils,only:[strip_struct:1,done:1]
6+
importHelper.Utils,only:[strip_struct:1]
77
importHelper.ErrorCode
88

99
importGroupherServer.CMS.Delegate.ArticleCURD,only:[create_article:4]
@@ -38,17 +38,7 @@ defmodule GroupherServer.CMS.Delegate.BlogCURD do
3838
## 1.2 如不存在,则创建一条 RSS
3939
with{:ok,feed}<-blog_rss_info(attrs.rss)do
4040
do_create_blog(community,attrs,user,feed)
41-
42-
# IO.inspect(feed, label: "create blog")
43-
# 通过 feed 有没有 id 来 insert / update
44-
# 通过 blog_title, 组合 attrs 传给 create_article
4541
end
46-
47-
# 2. 创建 blog
48-
## 2.1 blog +字段 rss, author
49-
## 2.2 title, digest, xxx
50-
51-
# 前台获取作者信息的时候从 rss 表读取
5242
end
5343

5444
# rss 记录存在, 直接创建 blog
@@ -102,19 +92,6 @@ defmodule GroupherServer.CMS.Delegate.BlogCURD do
10292
end
10393
end
10494

105-
# create done
106-
# defp result({:ok, %{set_active_at_timestamp: result}}) do
107-
# {:ok, result}
108-
# end
109-
110-
# defp result({:ok, %{update_article_meta: result}}), do: {:ok, result}
111-
112-
# defp result({:error, :create_article, _result, _steps}) do
113-
# {:error, [message: "create article", code: ecode(:create_fails)]}
114-
# end
115-
116-
# defp result({:error, _, result, _steps}), do: {:error, result}
117-
11895
@doc"""
11996
get and cache feed by rss address as key
12097
"""
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
defmoduleGroupherServer.CMS.Delegate.WorksCURDdo
2+
@moduledoc"""
3+
CURD operation on post/job ...
4+
"""
5+
importEcto.Query,warn:false
6+
importHelper.Utils,only:[done:1,atom_values_to_upcase:1]
7+
importHelper.ErrorCode
8+
9+
importGroupherServer.CMS.Delegate.ArticleCURD,only:[create_article:4,update_article:2]
10+
11+
aliasGroupherServer.{Accounts,CMS,Repo}
12+
aliasCMS.Model.{Community,Techstack,City,Works}
13+
aliasAccounts.Model.User
14+
15+
aliasHelper.ORM
16+
aliasEcto.Multi
17+
18+
# works can only be published on home community
19+
defcreate_works(attrs,%User{}=user)do
20+
attrs=attrs|>atom_values_to_upcase
21+
22+
with{:ok,home_community}<-ORM.find_by(Community,%{raw:"home"})do
23+
Multi.new()
24+
|>Multi.run(:create_works,fn_,_->
25+
create_article(home_community,:works,attrs,user)
26+
end)
27+
|>Multi.run(:update_works_fields,fn_,%{create_works:works}->
28+
update_works_fields(works,attrs)
29+
end)
30+
|>Repo.transaction()
31+
|>result()
32+
end
33+
end
34+
35+
defupdate_works(%Works{}=works,attrs)do
36+
attrs=attrs|>atom_values_to_upcase
37+
38+
Multi.new()
39+
|>Multi.run(:update_works_fields,fn_,_->
40+
update_works_fields(works,attrs)
41+
end)
42+
|>Multi.run(:update_works,fn_,%{update_works_fields:works}->
43+
update_article(works,attrs)
44+
end)
45+
|>Repo.transaction()
46+
|>result()
47+
end
48+
49+
# update works spec fields
50+
defpupdate_works_fields(%Works{}=works,attrs)do
51+
techstacks=Map.get(attrs,:techstacks,[])
52+
cities=Map.get(attrs,:cities,[])
53+
social_info=Map.get(attrs,:social_info,[])
54+
app_store=Map.get(attrs,:app_store,[])
55+
56+
with{:ok,techstacks}<-get_or_create_techstacks(techstacks),
57+
{:ok,cities}<-get_or_create_cities(cities)do
58+
works=Repo.preload(works,[:techstacks,:cities])
59+
60+
works
61+
|>Ecto.Changeset.change()
62+
|>Ecto.Changeset.put_assoc(:techstacks,works.techstacks++techstacks)
63+
|>Ecto.Changeset.put_assoc(:cities,works.cities++cities)
64+
|>Ecto.Changeset.put_embed(:social_info,social_info)
65+
|>Ecto.Changeset.put_embed(:app_store,app_store)
66+
|>Repo.update()
67+
end
68+
end
69+
70+
defpget_or_create_cities([]),do:{:ok,[]}
71+
72+
defpget_or_create_cities(cities)do
73+
cities
74+
|>Enum.map(&String.downcase(&1))
75+
|>Enum.reduce([],fntitle,acc->
76+
with{:ok,city}<-get_city(title)do
77+
acc++[city]
78+
end
79+
end)
80+
|>done
81+
end
82+
83+
defpget_city(title)do
84+
caseORM.find_by(City,%{title:title})do
85+
{:error,_}->create_city(title)
86+
{:ok,city}->{:ok,city}
87+
end
88+
end
89+
90+
defpcreate_city(title)do
91+
attrs=
92+
caseORM.find_by(Community,%{raw:title})do
93+
{:ok,community}->
94+
%{
95+
title:community.title,
96+
logo:community.logo,
97+
desc:community.desc,
98+
link:"/#{community.raw}"
99+
}
100+
101+
{:error,_}->
102+
%{title:title}
103+
end
104+
105+
ORM.create(City,attrs)
106+
end
107+
108+
defpget_or_create_techstacks([]),do:{:ok,[]}
109+
110+
defpget_or_create_techstacks(techstacks)do
111+
techstacks
112+
|>Enum.map(&String.downcase(&1))
113+
|>Enum.reduce([],fntitle,acc->
114+
with{:ok,techstack}<-get_techstack(title)do
115+
acc++[techstack]
116+
end
117+
end)
118+
|>done
119+
end
120+
121+
defpget_techstack(title)do
122+
caseORM.find_by(Techstack,%{title:title})do
123+
{:error,_}->create_techstack(title)
124+
{:ok,techstack}->{:ok,techstack}
125+
end
126+
end
127+
128+
defpcreate_techstack(title)do
129+
attrs=
130+
caseORM.find_by(Community,%{raw:title})do
131+
{:ok,community}->
132+
%{
133+
title:community.title,
134+
logo:community.logo,
135+
community_link:"/#{community.raw}",
136+
desc:community.desc
137+
}
138+
139+
{:error,_}->
140+
%{title:title}
141+
end
142+
143+
ORM.create(Techstack,attrs)
144+
end
145+
146+
defpresult({:ok,%{create_works:result}}),do:{:ok,result}
147+
defpresult({:ok,%{update_works:result}}),do:{:ok,result}
148+
149+
defpresult({:error,:create_works,_result,_steps})do
150+
{:error,[message:"create works",code:ecode(:create_fails)]}
151+
end
152+
153+
defpresult({:error,:update_works_fields,_result,_steps})do
154+
{:error,[message:"update works fields",code:ecode(:create_fails)]}
155+
end
156+
157+
defpresult({:error,:update_works,_result,_steps})do
158+
{:error,[message:"update works",code:ecode(:update_fails)]}
159+
end
160+
end
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
defmoduleGroupherServer.CMS.Model.Citydo
2+
@moduledocfalse
3+
alias__MODULE__
4+
5+
useEcto.Schema
6+
useAccessible
7+
8+
importEcto.Changeset
9+
10+
# alias GroupherServer.CMS
11+
12+
@timestamps_opts[type::utc_datetime_usec]
13+
14+
@required_fields~w(title)a
15+
@optional_fields~w(logo desc link)a
16+
17+
@typet::%City{}
18+
schema"cms_cities"do
19+
## mailstone
20+
field(:title,:string)
21+
field(:logo,:string)
22+
field(:desc,:string)
23+
field(:link,:string)
24+
25+
timestamps()
26+
end
27+
28+
@docfalse
29+
defchangeset(%City{}=city,attrs)do
30+
city
31+
|>cast(attrs,@optional_fields++@required_fields)
32+
|>validate_required(@required_fields)
33+
|>generl_changeset
34+
end
35+
36+
@docfalse
37+
defupdate_changeset(%City{}=city,attrs)do
38+
city
39+
|>cast(attrs,@optional_fields++@required_fields)
40+
|>generl_changeset
41+
end
42+
43+
defpgenerl_changeset(changeset)do
44+
changeset
45+
|>validate_length(:title,min:1,max:100)
46+
end
47+
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmoduleGroupherServer.CMS.Model.Embeds.AppStoredo
2+
@moduledoc"""
3+
general community meta
4+
"""
5+
useEcto.Schema
6+
useAccessible
7+
8+
importEcto.Changeset
9+
10+
@required_fields~w(platform)a
11+
@optional_fields~w(link)a
12+
13+
embedded_schemado
14+
field(:platform,:string)
15+
field(:link,:string)
16+
end
17+
18+
defchangeset(struct,attrs)do
19+
struct
20+
|>cast(attrs,@optional_fields++@required_fields)
21+
|>validate_required(@required_fields)
22+
end
23+
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmoduleGroupherServer.CMS.Model.Embeds.SocialInfodo
2+
@moduledoc"""
3+
general community meta
4+
"""
5+
useEcto.Schema
6+
useAccessible
7+
8+
importEcto.Changeset
9+
10+
@required_fields~w(platform)a
11+
@optional_fields~w(link)a
12+
13+
embedded_schemado
14+
field(:platform,:string)
15+
field(:link,:string)
16+
end
17+
18+
defchangeset(struct,attrs)do
19+
struct
20+
|>cast(attrs,@optional_fields++@required_fields)
21+
|>validate_required(@required_fields)
22+
end
23+
end

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp