@@ -3,19 +3,102 @@ defmodule GroupherServer.CMS.Delegate.AbuseReport do
33 CURD and operations for article comments
44 """
55 import Ecto.Query , warn: false
6- # import Helper.Utils, only: [done: 1]
6+ import Helper.Utils , only: [ done: 1 , strip_struct : 1 ]
77
88 import GroupherServer.CMS.Helper.Matcher2
9- # import ShortMaps
9+ import ShortMaps
1010
11- alias Helper . { ORM }
11+ alias Helper.ORM
12+ alias Helper.QueryBuilder
1213 alias GroupherServer . { Accounts , CMS , Repo }
1314
1415 alias Accounts.User
1516 alias CMS . { AbuseReport , Embeds }
1617
17- # alias Accounts.User
18+ alias Ecto.Multi
1819
20+ def list_reports ( type , content_id , % { page: page , size: size } = filter ) do
21+ with { :ok , info } <- match ( type ) do
22+ query = from ( r in AbuseReport , where: field ( r , ^ info . foreign_key ) == ^ content_id )
23+
24+ query
25+ |> QueryBuilder . filter_pack ( filter )
26+ |> ORM . paginater ( ~m( page size) a )
27+ |> done ( )
28+ end
29+ end
30+
31+ def report_article ( thread , article_id , reason , attr , % User { } = user ) do
32+ with { :ok , info } <- match ( thread ) ,
33+ { :ok , article } <- ORM . find ( info . model , article_id ) do
34+ Multi . new ( )
35+ |> Multi . run ( :create_abuse_report , fn _ , _ ->
36+ create_report ( thread , article_id , reason , attr , user )
37+ end )
38+ |> Multi . run ( :update_report_flag , fn _ , _ ->
39+ count_query = from ( c in AbuseReport , where: field ( c , ^ info . foreign_key ) == ^ article . id )
40+ reported_count = Repo . aggregate ( count_query , :count )
41+ meta = article . meta |> Map . merge ( % { reported_count: reported_count } ) |> strip_struct
42+
43+ article
44+ |> Ecto.Changeset . change ( % { is_reported: true } )
45+ |> Ecto.Changeset . put_embed ( :meta , meta )
46+ |> Repo . update ( )
47+ end )
48+ |> Repo . transaction ( )
49+ |> result ( )
50+ end
51+ end
52+
53+ @ doc "unreport a comment"
54+ # def unreport_article(thread, article_id, %User{} = _user) do
55+ # with {:ok, comment} <- ORM.find(ArticleComment, comment_id) do
56+ # comment |> ORM.update(%{is_reported: false})
57+ # end
58+ # end
59+
60+ def create_report ( type , content_id , reason , attr , % User { } = user ) do
61+ with { :ok , info } <- match ( type ) ,
62+ { :ok , report } <- not_reported_before ( info , content_id , user ) do
63+ case report do
64+ nil ->
65+ updated_report_cases = [
66+ % {
67+ reason: reason ,
68+ additional_reason: attr ,
69+ user: % { login: user . login , nickname: user . nickname }
70+ }
71+ ]
72+
73+ args =
74+ % { report_cases_count: 1 , report_cases: updated_report_cases }
75+ |> Map . put ( info . foreign_key , content_id )
76+
77+ AbuseReport |> ORM . create ( args )
78+
79+ _ ->
80+ updated_report_cases =
81+ report . report_cases
82+ |> List . insert_at (
83+ length ( report . report_cases ) ,
84+ % Embeds.AbuseReportCase {
85+ reason: reason ,
86+ additional_reason: "additional_reason" ,
87+ user: % { login: user . login , nickname: user . nickname }
88+ }
89+ )
90+
91+ report
92+ |> Ecto.Changeset . change ( % { report_cases_count: length ( updated_report_cases ) } )
93+ |> Ecto.Changeset . put_embed ( :report_cases , updated_report_cases )
94+ |> Repo . update ( )
95+ end
96+ end
97+ end
98+
99+ @ doc """
100+ create report record
101+ """
19102 def create_report ( type , content_id , % { reason: reason } , % User { } = user ) do
20103 with { :ok , info } <- match ( type ) ,
21104 { :ok , report } <- not_reported_before ( info , content_id , user ) do
@@ -76,4 +159,10 @@ defmodule GroupherServer.CMS.Delegate.AbuseReport do
76159 else: { :error , "#{ login } already reported" }
77160 end
78161 end
162+
163+ defp result ( { :ok , % { create_abuse_report: result } } ) , do: result |> done ( )
164+
165+ defp result ( { :error , _ , result , _steps } ) do
166+ { :error , result }
167+ end
79168end
0 commit comments