Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
cs_comments_service
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
cs_comments_service
Commits
e8c91269
Commit
e8c91269
authored
Apr 03, 2013
by
Kevin Chugh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
find comment flags and move testing forward
parent
88b0cd88
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
110 additions
and
56 deletions
+110
-56
api/flags.rb
+2
-2
lib/helpers.rb
+71
-53
models/content.rb
+1
-0
spec/api/abuse_spec.rb
+36
-1
No files found.
api/flags.rb
View file @
e8c91269
...
@@ -12,5 +12,4 @@ end
...
@@ -12,5 +12,4 @@ end
put
"
#{
APIPREFIX
}
/comments/:comment_id/abuse_unflags"
do
|
thread_id
|
put
"
#{
APIPREFIX
}
/comments/:comment_id/abuse_unflags"
do
|
thread_id
|
un_flag_as_abuse
comment
un_flag_as_abuse
comment
end
end
\ No newline at end of file
lib/helpers.rb
View file @
e8c91269
...
@@ -46,7 +46,14 @@ helpers do
...
@@ -46,7 +46,14 @@ helpers do
def
un_flag_as_abuse
(
obj
)
def
un_flag_as_abuse
(
obj
)
raise
ArgumentError
,
"User id is required"
unless
user
raise
ArgumentError
,
"User id is required"
unless
user
obj
.
abuse_flaggers
.
delete
user
.
id
if
params
[
"moderator"
]
obj
.
historical_abuse_flaggers
+=
obj
.
abuse_flaggers
obj
.
historical_abuse_flaggers
=
obj
.
historical_abuse_flaggers
.
uniq
obj
.
abuse_flaggers
.
clear
else
obj
.
abuse_flaggers
.
delete
user
.
id
end
obj
.
save
obj
.
save
obj
.
reload
.
to_hash
.
to_json
obj
.
reload
.
to_hash
.
to_json
end
end
...
@@ -107,68 +114,79 @@ helpers do
...
@@ -107,68 +114,79 @@ helpers do
end
end
def
handle_threads_query
(
comment_threads
)
def
handle_threads_query
(
comment_threads
)
if
params
[
:flagged
]
#get flagged threads and threads containing flagged responses
comment_threads
=
comment_threads
.
where
(
:course_id
=>
params
[
:course_id
]).
where
(
:abuse_flaggers
)
else
if
params
[
:course_id
]
if
params
[
:course_id
]
comment_threads
=
comment_threads
.
where
(
:course_id
=>
params
[
:course_id
])
comment_threads
=
comment_threads
.
where
(
:course_id
=>
params
[
:course_id
])
if
params
[
:flagged
]
#get flagged threads and threads containing flagged responses
comment_ids
=
Comment
.
where
(
:course_id
=>
params
[
:course_id
]).
where
(
:abuse_flaggers
.
ne
=>
[],
:abuse_flaggers
.
exists
=>
true
).
collect
{
|
c
|
c
.
comment_thread_id
}.
uniq
thread_ids
=
comment_threads
.
where
(
:abuse_flaggers
.
ne
=>
[],
:abuse_flaggers
.
exists
=>
true
).
collect
{
|
c
|
c
.
id
}
comment_ids
+=
thread_ids
comment_threads
=
comment_threads
.
where
(
:id
.
in
=>
comment_ids
)
end
end
if
CommentService
.
config
[
:cache_enabled
]
end
query_params
=
params
.
slice
(
*
%w[course_id commentable_id sort_key sort_order page per_page user_id]
)
if
CommentService
.
config
[
:cache_enabled
]
memcached_key
=
"threads_query_
#{
query_params
.
hash
}
"
query_params
=
params
.
slice
(
*
%w[course_id commentable_id sort_key sort_order page per_page user_id]
)
cached_results
=
Sinatra
::
Application
.
cache
.
get
(
memcached_key
)
memcached_key
=
"threads_query_
#{
query_params
.
hash
}
"
if
cached_results
cached_results
=
Sinatra
::
Application
.
cache
.
get
(
memcached_key
)
return
{
if
cached_results
collection:
cached_results
[
:collection_ids
].
map
{
|
id
|
CommentThread
.
find
(
id
).
to_hash
(
recursive:
bool_recursive
,
user_id:
params
[
"user_id"
])},
return
{
num_pages:
cached_results
[
:num_pages
]
,
collection:
cached_results
[
:collection_ids
].
map
{
|
id
|
CommentThread
.
find
(
id
).
to_hash
(
recursive:
bool_recursive
,
user_id:
params
[
"user_id"
])}
,
page:
cached_results
[
:page
],
num_pages:
cached_results
[
:num_pages
],
}.
to_json
page:
cached_results
[
:page
],
end
}.
to_json
end
end
end
sort_key_mapper
=
{
sort_key_mapper
=
{
"date"
=>
:created_at
,
"date"
=>
:created_at
,
"activity"
=>
:last_activity_at
,
"activity"
=>
:last_activity_at
,
"votes"
=>
:"votes.point"
,
"votes"
=>
:"votes.point"
,
"comments"
=>
:comment_count
,
"comments"
=>
:comment_count
,
}
}
sort_order_mapper
=
{
sort_order_mapper
=
{
"desc"
=>
:desc
,
"desc"
=>
:desc
,
"asc"
=>
:asc
,
"asc"
=>
:asc
,
}
}
sort_key
=
sort_key_mapper
[
params
[
"sort_key"
]]
sort_key
=
sort_key_mapper
[
params
[
"sort_key"
]]
sort_order
=
sort_order_mapper
[
params
[
"sort_order"
]]
sort_order
=
sort_order_mapper
[
params
[
"sort_order"
]]
sort_keyword_valid
=
(
!
params
[
"sort_key"
]
&&
!
params
[
"sort_order"
]
||
sort_key
&&
sort_order
)
sort_keyword_valid
=
(
!
params
[
"sort_key"
]
&&
!
params
[
"sort_order"
]
||
sort_key
&&
sort_order
)
if
not
sort_keyword_valid
if
not
sort_keyword_valid
{}.
to_json
{}.
to_json
else
else
page
=
(
params
[
"page"
]
||
DEFAULT_PAGE
).
to_i
page
=
(
params
[
"page"
]
||
DEFAULT_PAGE
).
to_i
per_page
=
(
params
[
"per_page"
]
||
DEFAULT_PER_PAGE
).
to_i
per_page
=
(
params
[
"per_page"
]
||
DEFAULT_PER_PAGE
).
to_i
#KChugh turns out we don't need to go through all the extra work on the back end because the client is resorting anyway
#KChugh turns out we don't need to go through all the extra work on the back end because the client is resorting anyway
#KChugh boy was I wrong, we need to sort for pagination
#KChugh boy was I wrong, we need to sort for pagination
comment_threads
=
comment_threads
.
order_by
(
"pinned DESC,
#{
sort_key
}
#{
sort_order
}
"
)
if
sort_key
&&
sort_order
comment_threads
=
comment_threads
.
order_by
(
"pinned DESC,
#{
sort_key
}
#{
sort_order
}
"
)
if
sort_key
&&
sort_order
num_pages
=
[
1
,
(
comment_threads
.
count
/
per_page
.
to_f
).
ceil
].
max
num_pages
=
[
1
,
(
comment_threads
.
count
/
per_page
.
to_f
).
ceil
].
max
page
=
[
num_pages
,
[
1
,
page
].
max
].
min
page
=
[
num_pages
,
[
1
,
page
].
max
].
min
paged_comment_threads
=
comment_threads
.
page
(
page
).
per
(
per_page
)
paged_comment_threads
=
comment_threads
.
page
(
page
).
per
(
per_page
)
if
CommentService
.
config
[
:cache_enabled
]
if
CommentService
.
config
[
:cache_enabled
]
cached_results
=
{
cached_results
=
{
collection_ids:
paged_comment_threads
.
map
(
&
:id
),
collection_ids:
paged_comment_threads
.
map
(
&
:id
),
num_pages:
num_pages
,
page:
page
,
}
Sinatra
::
Application
.
cache
.
set
(
memcached_key
,
cached_results
,
CommentService
.
config
[
:cache_timeout
][
:threads_query
].
to_i
)
end
{
collection:
paged_comment_threads
.
map
{
|
t
|
t
.
to_hash
(
recursive:
bool_recursive
,
user_id:
params
[
"user_id"
])},
num_pages:
num_pages
,
num_pages:
num_pages
,
page:
page
,
page:
page
,
}.
to_json
}
Sinatra
::
Application
.
cache
.
set
(
memcached_key
,
cached_results
,
CommentService
.
config
[
:cache_timeout
][
:threads_query
].
to_i
)
end
end
{
collection:
paged_comment_threads
.
map
{
|
t
|
t
.
to_hash
(
recursive:
bool_recursive
,
user_id:
params
[
"user_id"
])},
num_pages:
num_pages
,
page:
page
,
}.
to_json
end
end
end
end
...
...
models/content.rb
View file @
e8c91269
...
@@ -4,6 +4,7 @@ class Content
...
@@ -4,6 +4,7 @@ class Content
field
:visible
,
type:
Boolean
,
default:
true
field
:visible
,
type:
Boolean
,
default:
true
field
:abuse_flaggers
,
type:
Array
,
default:
[]
field
:abuse_flaggers
,
type:
Array
,
default:
[]
field
:historical_abuse_flaggers
,
type:
Array
,
default:
[]
#preserve abuse flaggers after a moderator unflags
def
author_with_anonymity
(
attr
=
nil
,
attr_when_anonymous
=
nil
)
def
author_with_anonymity
(
attr
=
nil
,
attr_when_anonymous
=
nil
)
if
not
attr
if
not
attr
...
...
spec/api/abuse_spec.rb
View file @
e8c91269
...
@@ -8,6 +8,14 @@ def create_thread_flag(thread_id, user_id)
...
@@ -8,6 +8,14 @@ def create_thread_flag(thread_id, user_id)
create_flag
(
"/api/v1/threads/"
+
thread_id
+
"/abuse_flags"
,
user_id
)
create_flag
(
"/api/v1/threads/"
+
thread_id
+
"/abuse_flags"
,
user_id
)
end
end
def
remove_thread_flag
(
thread_id
,
user_id
)
remove_flag
(
"/api/v1/threads/"
+
thread_id
+
"/abuse_unflags"
,
user_id
)
end
def
remove_comment_flag
(
thread_id
,
user_id
)
remove_flag
(
"/api/v1/threads/"
+
comment_id
+
"/abuse_unflags"
,
user_id
)
end
def
create_flag
(
put_command
,
user_id
)
def
create_flag
(
put_command
,
user_id
)
if
user_id
.
nil?
if
user_id
.
nil?
put
put_command
put
put_command
...
@@ -45,7 +53,7 @@ describe "app" do
...
@@ -45,7 +53,7 @@ describe "app" do
#end
#end
end
end
describe
"flag a thread as abusive"
do
describe
"flag a thread as abusive"
do
it
"create or update the abuse_flags on the
thread
"
do
it
"create or update the abuse_flags on the
comment
"
do
comment
=
Comment
.
first
comment
=
Comment
.
first
thread
=
comment
.
comment_thread
thread
=
comment
.
comment_thread
prev_abuse_flaggers
=
thread
.
abuse_flaggers
prev_abuse_flaggers
=
thread
.
abuse_flaggers
...
@@ -70,5 +78,32 @@ describe "app" do
...
@@ -70,5 +78,32 @@ describe "app" do
# Comment.first.comment_thread.to_hash
# Comment.first.comment_thread.to_hash
#end
#end
end
end
describe
"unflag a comment as abusive"
do
it
"removes the user from the existing abuse_flaggers"
do
comment
=
Comment
.
first
thread
=
comment
.
comment_thread
prev_abuse_flaggers
=
thread
.
abuse_flaggers
create_thread_flag
(
"
#{
thread
.
id
}
"
,
User
.
first
.
id
)
prev_abuse_flaggers
.
should
include
User
.
first
.
id
remove_thread_flag
(
"
#{
thread
.
id
}
"
,
User
.
first
.
id
)
comment
=
Comment
.
find
(
comment
.
id
)
comment
.
comment_thread
.
abuse_flaggers
.
length
.
should
==
prev_abuse_flaggers
.
length
+
1
prev_abuse_flaggers
.
should_not
include
?
User
.
first
.
id
end
it
"returns 400 when the thread does not exist"
do
remove_thread_flag
(
"does_not_exist"
,
User
.
first
.
id
)
last_response
.
status
.
should
==
400
end
it
"returns 400 when user_id is not provided"
do
remove_thread_flag
(
"
#{
Comment
.
first
.
comment_thread
.
id
}
"
,
nil
)
last_response
.
status
.
should
==
400
end
#Would like to test the output of to_hash, but not sure how to deal with a Moped::BSON::Document object
#it "has a correct hash" do
# create_thread_flag("#{Comment.first.comment_thread.id}", User.first.id)
# Comment.first.comment_thread.to_hash
#end
end
end
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment