Skip to content

Commit c794afe

Browse files
authored
Merge pull request #82 from majestrate/delete-all-posts-for-user-2022-03-03
Add Remove all posts for user from room endpoint
2 parents 5d82646 + a35e06d commit c794afe

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

sogs/model/room.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -934,20 +934,19 @@ def delete_all_posts(self, poster: User, *, deleter: User):
934934
# Set up files for deletion, but don't wipe out the room image in case the target was
935935
# the one who uploaded it:
936936
image = self.image
937-
omit_id = image.id if image.uploader == poster.id else None
937+
omit_id = image.id if image and image.uploader == poster.id else None
938938

939939
# TODO: Eventually we can drop this: once uploads have to be properly associated with
940940
# posts then the post deletion should trigger automatic expiry of post attachments.
941941

942-
# Don't actually delete right now but set room to NULL so that the images aren't
943-
# retrievable, and set expiry to now so that they'll be picked up by the next db
944-
# cleanup.
942+
# Don't actually delete right now but just expire them so that the next db cleanup will
943+
# perform the deletion (and since they are expired, they won't be accessible in the
944+
# meantime).
945945
result = query(
946946
f"""
947-
UPDATE files SET room = NULL, expiry = :now WHERE room = :r AND uploader = :u
947+
UPDATE files SET expiry = 0.0 WHERE room = :r AND uploader = :u
948948
{'AND id != :omit' if omit_id else ''}
949949
""",
950-
now=time.time(),
951950
r=self.id,
952951
u=poster.id,
953952
omit=omit_id,

sogs/routes/rooms.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from .. import config, db, http
2-
from ..model import room as mroom, exc
2+
from ..model import room as mroom, exc, user as muser
33
from ..web import app
44
from . import auth
55

@@ -542,3 +542,28 @@ def serve_file_with_ignored_filename(room, fileId, filename):
542542
543543
"""
544544
return serve_file(room=room, fileId=fileId)
545+
546+
547+
@rooms.delete("/room/<Room:room>/all/<SessionID:sid>")
548+
def delete_all_posts(room, sid):
549+
"""
550+
Deletes all posts from a room made by a user
551+
552+
# URL Parameters
553+
554+
- `sid` — the session id of the user to ban
555+
556+
# Return value
557+
558+
An empty json object is returned.
559+
560+
# Error status codes
561+
562+
- 403 Forbidden — if the invoking user does not have access to the room.
563+
- 404 Not Found — if the user we are deleting posts from made no posts in this room.
564+
"""
565+
user = muser.User(session_id=sid, autovivify=False)
566+
deleted, _ = room.delete_all_posts(user, deleter=g.user)
567+
if not deleted:
568+
abort(http.NOT_FOUND)
569+
return jsonify({})

tests/test_room_routes.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,3 +1377,43 @@ def test_file_upload_false(client, room, user, mod):
13771377
extra_headers={"Content-Disposition": ('attachment', {'filename': filename})},
13781378
)
13791379
assert r.status_code == 403
1380+
1381+
1382+
def test_remove_all_posts_from_room(client, room, user, mod, no_rate_limit):
1383+
for _ in range(256):
1384+
_make_dummy_post(room, user)
1385+
assert len(room.get_messages_for(user, recent=True)) == 256
1386+
r = sogs_delete(client, f'/room/{room.token}/all/{user.session_id}', mod)
1387+
assert r.status_code == 200
1388+
assert len(room.get_messages_for(user, recent=True)) == 0
1389+
assert room.check_unbanned(user)
1390+
1391+
1392+
def test_remove_all_posts_from_room_not_allowed(client, room, user, user2, no_rate_limit):
1393+
for _ in range(256):
1394+
_make_dummy_post(room, user)
1395+
assert len(room.get_messages_for(user, recent=True)) == 256
1396+
with pytest.raises(wexc.Forbidden):
1397+
sogs_delete(client, f'/room/{room.token}/all/{user.session_id}', user2)
1398+
assert len(room.get_messages_for(user, recent=True)) == 256
1399+
assert room.check_unbanned(user) and room.check_unbanned(user2)
1400+
1401+
1402+
def test_remove_all_posts_from_room_not_allowed_for_user(client, room, mod, user, no_rate_limit):
1403+
for _ in range(256):
1404+
_make_dummy_post(room, mod)
1405+
with pytest.raises(wexc.Forbidden):
1406+
sogs_delete(client, f'/room/{room.token}/all/{mod.session_id}', user)
1407+
assert len(room.get_messages_for(user, recent=True)) == 256
1408+
assert room.check_unbanned(user) and room.check_unbanned(mod)
1409+
1410+
1411+
def test_remove_all_self_posts_from_room(client, room, mod, user, no_rate_limit):
1412+
for u in (user, mod):
1413+
for _ in range(256):
1414+
_make_dummy_post(room, u)
1415+
assert len(room.get_messages_for(u, recent=True)) == 256
1416+
r = sogs_delete(client, f'/room/{room.token}/all/{u.session_id}', u)
1417+
assert r.status_code == 200
1418+
assert len(room.get_messages_for(u, recent=True)) == 0
1419+
assert room.check_unbanned(u)

0 commit comments

Comments
 (0)