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.

Commit3cd6403

Browse files
committed
feat: add archive flag for articles
1 parent1f13097 commit3cd6403

25 files changed

+607
-67
lines changed

‎config/config.exs‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,15 @@ config :groupher_server, :article,
109109
:pill,
110110
:popcorn
111111
],
112-
digest_length:120
112+
digest_length:120,
113+
archive_threshold:%{
114+
# for post, blog, job, works, radar, job
115+
default:[weeks:-1],
116+
meetups:[months:-1],
117+
drink:[years:-99],
118+
repo:[years:-99],
119+
guide:[years:-99]
120+
}
113121

114122
config:groupher_server,GroupherServerWeb.Gettext,default_locale:"zh_CN",locales:~w(en zh_CN)
115123

@@ -137,7 +145,8 @@ config :rihanna,
137145
config:groupher_server,Helper.Scheduler,
138146
jobs:[
139147
# Every midnight
140-
{"@daily",{Helper.Scheduler,:clear_all_cache,[]}}
148+
{"@daily",{Helper.Scheduler,:clear_all_cache,[]}},
149+
{"@daily",{Helper.Scheduler,:archive_artiments,[]}}
141150
]
142151

143152
import_config"#{Mix.env()}.exs"

‎lib/groupher_server/cms/cms.ex‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ defmodule GroupherServer.CMS do
100100
defdelegatesink_article(thread,id),to:ArticleCURD
101101
defdelegateundo_sink_article(thread,id),to:ArticleCURD
102102

103+
defdelegatearchive_articles(thread),to:ArticleCURD
104+
103105
defdelegatepaged_citing_contents(type,id,filter),to:CitedArtiment
104106

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

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

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
3939
aliasEcto.Multi
4040

4141
@active_periodget_config(:article,:active_period_days)
42+
@archive_thresholdget_config(:article,:archive_threshold)
43+
4244
@default_emotionsEmbeds.ArticleEmotion.default_emotions()
4345
@default_article_metaEmbeds.ArticleMeta.default_meta()
4446
@remove_article_hint"The content does not comply with the community norms"
@@ -68,26 +70,24 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
6870
read articles for logined user
6971
"""
7072
defread_article(thread,id,%User{id:user_id})do
71-
with{:ok,info}<-match(thread)do
72-
Multi.new()
73-
|>Multi.run(:normal_read,fn_,_->read_article(thread,id)end)
74-
|>Multi.run(:add_viewed_user,fn_,%{normal_read:article}->
75-
update_viewed_user_list(article,user_id)
76-
end)
77-
|>Multi.run(:set_viewer_has_states,fn_,%{normal_read:article}->
78-
article_meta=ifis_nil(article.meta),do:@default_article_meta,else:article.meta
73+
Multi.new()
74+
|>Multi.run(:normal_read,fn_,_->read_article(thread,id)end)
75+
|>Multi.run(:add_viewed_user,fn_,%{normal_read:article}->
76+
update_viewed_user_list(article,user_id)
77+
end)
78+
|>Multi.run(:set_viewer_has_states,fn_,%{normal_read:article}->
79+
article_meta=ifis_nil(article.meta),do:@default_article_meta,else:article.meta
7980

80-
viewer_has_states=%{
81-
viewer_has_collected:user_idinarticle_meta.collected_user_ids,
82-
viewer_has_upvoted:user_idinarticle_meta.upvoted_user_ids,
83-
viewer_has_reported:user_idinarticle_meta.reported_user_ids
84-
}
81+
viewer_has_states=%{
82+
viewer_has_collected:user_idinarticle_meta.collected_user_ids,
83+
viewer_has_upvoted:user_idinarticle_meta.upvoted_user_ids,
84+
viewer_has_reported:user_idinarticle_meta.reported_user_ids
85+
}
8586

86-
article|>Map.merge(viewer_has_states)|>done
87-
end)
88-
|>Repo.transaction()
89-
|>result()
90-
end
87+
article|>Map.merge(viewer_has_states)|>done
88+
end)
89+
|>Repo.transaction()
90+
|>result()
9191
end
9292

9393
@doc"""
@@ -134,6 +134,23 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
134134
end
135135
end
136136

137+
@doc"""
138+
archive articles based on thread
139+
called every day by scheuler job
140+
"""
141+
defarchive_articles(thread)do
142+
with{:ok,info}<-match(thread)do
143+
now=Timex.now()
144+
threshold=@archive_threshold[thread]||@archive_threshold[:default]
145+
archive_threshold=Timex.shift(now,threshold)
146+
147+
info.model
148+
|>where([article],article.inserted_at<^archive_threshold)
149+
|>Repo.update_all(set:[is_archived:true,archived_at:now])
150+
|>done()
151+
end
152+
end
153+
137154
defpmark_viewer_has_states(%{entries:[]}=articles,_),do:articles
138155

139156
defpmark_viewer_has_states(%{entries:entries}=articles,user)do
@@ -237,6 +254,9 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
237254
@doc"""
238255
update a article(post/job ...)
239256
"""
257+
defupdate_article(%{is_archived:true},_attrs),
258+
do:raise_error(:archived,"article is archived, can not be edit or delete")
259+
240260
defupdate_article(article,attrs)do
241261
Multi.new()
242262
|>Multi.run(:update_article,fn_,_->
@@ -317,7 +337,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
317337
"""
318338
defmark_delete_article(thread,id)do
319339
with{:ok,info}<-match(thread),
320-
{:ok,article}<-ORM.find(info.model,id,preload::communities)do
340+
{:ok,article}<-ORM.find(info.model,id,preload::communities),
341+
false<-article.is_archiveddo
321342
Multi.new()
322343
|>Multi.run(:update_article,fn_,_->
323344
ORM.update(article,%{mark_delete:true})
@@ -327,6 +348,8 @@ defmodule GroupherServer.CMS.Delegate.ArticleCURD do
327348
end)
328349
|>Repo.transaction()
329350
|>result()
351+
else
352+
true->raise_error(:archived,"article is archived, can not be edit or delete")
330353
end
331354
end
332355

‎lib/groupher_server/cms/helper/macros.ex‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ defmodule GroupherServer.CMS.Helper.Macros do
200200
comment_fields()
201201

202202
field(:active_at,:utc_datetime_usec)
203+
204+
field(:is_archived,:boolean,default:false)
205+
field(:archived_at,:utc_datetime_usec)
206+
203207
# TODO:
204208
# related_articles
205209
timestamps()

‎lib/groupher_server/cms/models/embeds/article_meta.ex‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ defmodule GroupherServer.CMS.Model.Embeds.ArticleMeta do
3232
field(:is_edited,:boolean,default:false)
3333
field(:is_comment_locked,:boolean,default:false)
3434
field(:folded_comment_count,:integer,default:0)
35+
3536
# reaction history
3637
field(:upvoted_user_ids,{:array,:integer},default:[])
3738
field(:collected_user_ids,{:array,:integer},default:[])

‎lib/groupher_server_web/schema/Helper/fields.ex‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ defmodule GroupherServerWeb.Schema.Helper.Fields do
3838
field(:viewer_has_upvoted,:boolean)
3939
field(:viewer_has_viewed,:boolean)
4040
field(:viewer_has_reported,:boolean)
41+
42+
field(:is_archived,:boolean)
43+
field(:archived_at,:datetime)
4144
end
4245
end
4346

‎lib/helper/error_code.ex‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ defmodule Helper.ErrorCode do
5252
defecode(:article_comments_locked),do:@article_base+8
5353
defecode(:require_questioner),do:@article_base+9
5454
defecode(:cite_artilce),do:@article_base+10
55+
defecode(:archived),do:@article_base+11
5556
# def ecode(:already_solved), do: @article_base + 10
5657

5758
defecode,do:@default_base

‎lib/helper/scheduler.ex‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,11 @@ defmodule Helper.Scheduler do
1212
defclear_all_cachedo
1313
# Cache.clear_all()
1414
end
15+
16+
@doc"""
17+
archive articles and comments based on config
18+
"""
19+
defarchive_artiments()do
20+
# TODO
21+
end
1522
end
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
defmoduleGroupherServer.Repo.Migrations.AddArchiveFieldsToArticlesdo
2+
useEcto.Migration
3+
4+
defchangedo
5+
altertable(:cms_posts)do
6+
add(:is_archived,:boolean,default:false)
7+
add(:archived_at,:utc_datetime)
8+
end
9+
10+
altertable(:cms_jobs)do
11+
add(:is_archived,:boolean,default:false)
12+
add(:archived_at,:utc_datetime)
13+
end
14+
15+
altertable(:cms_repos)do
16+
add(:is_archived,:boolean,default:false)
17+
add(:archived_at,:utc_datetime)
18+
end
19+
20+
altertable(:cms_blogs)do
21+
add(:is_archived,:boolean,default:false)
22+
add(:archived_at,:utc_datetime)
23+
end
24+
25+
altertable(:cms_works)do
26+
add(:is_archived,:boolean,default:false)
27+
add(:archived_at,:utc_datetime)
28+
end
29+
30+
altertable(:cms_radars)do
31+
add(:is_archived,:boolean,default:false)
32+
add(:archived_at,:utc_datetime)
33+
end
34+
35+
altertable(:cms_guides)do
36+
add(:is_archived,:boolean,default:false)
37+
add(:archived_at,:utc_datetime)
38+
end
39+
40+
altertable(:cms_meetups)do
41+
add(:is_archived,:boolean,default:false)
42+
add(:archived_at,:utc_datetime)
43+
end
44+
45+
altertable(:cms_drinks)do
46+
add(:is_archived,:boolean,default:false)
47+
add(:archived_at,:utc_datetime)
48+
end
49+
end
50+
end
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
defmoduleGroupherServer.Test.CMS.BlogArchivedo
2+
@moduledocfalse
3+
useGroupherServer.TestTools
4+
importHelper.Utils,only:[get_config:2]
5+
6+
aliasGroupherServer.{CMS,Repo}
7+
aliasCMS.Model.Blog
8+
9+
@nowTimex.now()
10+
@archive_thresholdget_config(:article,:archive_threshold)
11+
@blog_archive_thresholdTimex.shift(
12+
@now,
13+
@archive_threshold[:blog]||@archive_threshold[:default]
14+
)
15+
16+
@last_weekTimex.shift(@now,days:-7,seconds:-1)
17+
18+
setupdo
19+
{:ok,user}=db_insert(:user)
20+
# {:ok, blog} = db_insert(:blog)
21+
{:ok,community}=db_insert(:community)
22+
23+
{:ok,blog_long_ago}=db_insert(:blog,%{title:"last week",inserted_at:@last_week})
24+
db_insert_multi(:blog,5)
25+
26+
{:ok,~m(user community blog_long_ago)a}
27+
end
28+
29+
describe"[cms blog archive]"do
30+
@tag:wip
31+
test"can archive blogs",~m(blog_long_ago)ado
32+
{:ok,_}=CMS.archive_articles(:blog)
33+
34+
archived_blogs=
35+
Blog
36+
|>where([article],article.inserted_at<^@blog_archive_threshold)
37+
|>Repo.all()
38+
39+
assertlength(archived_blogs)==1
40+
archived_blog=archived_blogs|>List.first()
41+
assertarchived_blog.id==blog_long_ago.id
42+
end
43+
44+
@tag:wip
45+
test"can not edit archived blog"do
46+
{:ok,_}=CMS.archive_articles(:blog)
47+
48+
archived_blogs=
49+
Blog
50+
|>where([article],article.inserted_at<^@blog_archive_threshold)
51+
|>Repo.all()
52+
53+
archived_blog=archived_blogs|>List.first()
54+
{:error,reason}=CMS.update_article(archived_blog,%{"title"=>"new title"})
55+
assertreason|>is_error?(:archived)
56+
end
57+
58+
@tag:wip
59+
test"can not delete archived blog"do
60+
{:ok,_}=CMS.archive_articles(:blog)
61+
62+
archived_blogs=
63+
Blog
64+
|>where([article],article.inserted_at<^@blog_archive_threshold)
65+
|>Repo.all()
66+
67+
archived_blog=archived_blogs|>List.first()
68+
69+
{:error,reason}=CMS.mark_delete_article(:blog,archived_blog.id)
70+
assertreason|>is_error?(:archived)
71+
end
72+
end
73+
end

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp