Implement /deleteAll.

This commit is contained in:
Dominik Picheta 2016-06-19 19:58:34 +01:00
commit 840c7b173d

View file

@ -578,6 +578,24 @@ template writeToDb(c, cr, setPostId: expr) =
if setPostId: if setPostId:
c.postId = retID.int c.postId = retID.int
proc updateThreads(c: var TForumData): int =
## Removes threads if they have no posts, or changes their modified field
## if they still contain posts.
const query =
sql"delete from thread where id not in (select thread from post)"
result = execAffectedRows(db, query).int
if result > 0:
discard tryExec(db, sql"delete from thread_fts where id not in (select thread from post)")
else:
# Update corresponding thread's modified field.
let getModifiedSql = "(select creation from post where post.thread = ?" &
" order by creation desc limit 1)"
let updateSql = sql("update thread set modified=" & getModifiedSql &
" where id = ?")
if not tryExec(db, updateSql, $c.threadId, $c.threadId):
result = -1
discard setError(c, "", "database error")
proc edit(c: var TForumData, postId: int): bool = proc edit(c: var TForumData, postId: int): bool =
checkLogin(c) checkLogin(c)
if c.isPreview: if c.isPreview:
@ -588,21 +606,15 @@ proc edit(c: var TForumData, postId: int): bool =
if not tryExec(db, crud(crDelete, "post"), $postId): if not tryExec(db, crud(crDelete, "post"), $postId):
return setError(c, "", "database error") return setError(c, "", "database error")
discard tryExec(db, crud(crDelete, "post_fts"), $postId) discard tryExec(db, crud(crDelete, "post_fts"), $postId)
result = true
# delete corresponding thread: # delete corresponding thread:
if execAffectedRows(db, let updateResult = updateThreads(c)
sql"delete from thread where id not in (select thread from post)") > 0: if updateResult > 0:
# whole thread has been deleted, so: # whole thread has been deleted, so:
c.threadId = unselectedThread c.threadId = unselectedThread
discard tryExec(db, sql"delete from thread_fts where id not in (select thread from post)") elif updateResult < 0:
else: # error occurred
# Update corresponding thread's modified field. return false
let getModifiedSql = "(select creation from post where post.thread = ?" &
" order by creation desc limit 1)"
let updateSql = sql("update thread set modified=" & getModifiedSql &
" where id = ?")
if not tryExec(db, updateSql, $c.threadId, $c.threadId):
return setError(c, "", "database error")
result = true
else: else:
checkOwnership(c, $postId) checkOwnership(c, $postId)
retrPost(c) retrPost(c)
@ -731,6 +743,12 @@ proc setBan(c: var TForumData, nick, reason: string): bool =
sql("update person set ban = ? where name = ?") sql("update person set ban = ? where name = ?")
return tryExec(db, query, reason, nick) return tryExec(db, query, reason, nick)
proc deleteAll(c: var TForumData, nick: string): bool =
const query =
sql("delete from post where author = (select id from person where name = ?)")
result = tryExec(db, query, nick)
result = result and updateThreads(c) >= 0
proc setPassword(c: var TForumData, nick, pass: string): bool = proc setPassword(c: var TForumData, nick, pass: string): bool =
const query = const query =
sql("update person set password = ?, salt = ? where name = ?") sql("update person set password = ?, salt = ? where name = ?")
@ -987,7 +1005,14 @@ proc genProfile(c: var TForumData, ui: TUserInfo): string =
"Confirm user's email") "Confirm user's email")
else: "" else: ""
else: "") else: "")
) ),
tr(
th(""),
td(if c.isAdmin:
htmlgen.a(href=c.req.makeUri("/deleteAll?nick=$1" % ui.nick),
"Delete all user's posts and threads")
else: "")
),
) )
)) ))
@ -1223,8 +1248,8 @@ routes:
"?") "?")
del = true del = true
formBody.add "<input type='hidden' name='del' value='" & $del & "'/>" formBody.add "<input type='hidden' name='del' value='" & $del & "'/>"
content = htmlgen.form(action = c.req.makeUri("/dosetban"), content = content & htmlgen.form(action = c.req.makeUri("/dosetban"),
`method` = "POST", formBody) & content `method` = "POST", formBody)
resp genMain(c, content, "Set user status - Nim Forum") resp genMain(c, content, "Set user status - Nim Forum")
post "/dosetban": post "/dosetban":
@ -1246,6 +1271,32 @@ routes:
resp genMain(c, "Failed to change the ban status of user.", resp genMain(c, "Failed to change the ban status of user.",
"Error - Nim Forum") "Error - Nim Forum")
get "/deleteAll/?":
createTFD()
cond (@"nick" != "")
var formBody = "<input type=\"hidden\" name=\"nick\" value=\"" &
@"nick" & "\">"
var del = false
var content = ""
formBody.add "<input type='submit' name='deleteAllBtn' value='Delete All' />"
content = htmlgen.p("Are you sure you wish to delete all " &
"the posts and threads created by ", htmlgen.b(@"nick"), "?")
content = content & htmlgen.form(action = c.req.makeUri("/dodeleteall"),
`method` = "POST", formBody)
resp genMain(c, content, "Delete all user's posts & threads - Nim Forum")
post "/dodeleteall/?":
createTFD()
cond (@"nick" != "")
if not c.isAdmin:
resp genMain(c, "You cannot delete this user's data.", "Error - Nim Forum")
let result = deleteAll(c, @"nick")
if result:
redirect(c.req.makeUri("/profile/" & @"nick"))
else:
resp genMain(c, "Failed to delete all user's posts and threads.",
"Error - NimForum")
get "/setpassword/?": get "/setpassword/?":
createTFD() createTFD()
cond (@"nick" != "") cond (@"nick" != "")