* feat: start tracking which cids a user has posted to, update account pages' topics/posts view to call this new sorted set
re: #14113
* feat: upgrade script for #14113
* fix: cids unavailable in getPostsFields, duh
* fix: update sortedSetIncrByBulk in mongo/psql to return early on empty data
* fix: remove unused lodash require
* test: sortedSetIncrBy and sortedSetIncrByBulk tests
* test: who needs null checks anyway
* fix: sortedSetIncrByBulk null response
* test: aggregate zincrbulk data
if there are alot of identical key/value pairs they will be combined into a single row
* fix: key name
* test: fix test name
* lint: fix lint issues
* test: negative values should work too
* fix: add e11000 handler for incrByBulk
* refactor: fix variable name
* merge tests with existing zset test, remove dupes
* test: return topicData for failing test
* delete uid:<uid>:cids on user delete
---------
Co-authored-by: Barış Soner Uşaklı <barisusakli@gmail.com>
this was happening because the same topic was passed to setObject bulk multiple times with different tag data.
the fix is to find the uniq tids first and then only call setObjectBulk once per topic
* refactor: allow passing an array to topics.purge and topics.purgePostsAndTopic
deprecate action:topic.purge, add action:topics.purge with array of deleted topics
update usage of topics.purge to pass in an array
fix an issue in posts/delete where cids were passed to parseInt, caused AP cids to get saved into category:NaN
* lint
* refactor: change style
* use array of tids
tldr when reschedule was called it was still using the timestamp in the future when adding to cid:<cid>:pids causing that post to get stuck at the top of that zset, which led to the bug in this issue
* fix: tag urls getting double escaped
get rid of weird decodeURIComponent($.param()) usage
$.param returns a string suitable for use in query param string
* add a new test
socket.emit('topics.delete') removed use `DELETE /api/v3/topics/state`
socket.emit('topics.restore') removed use `PUT /api/v3/topics/state`
socket.emit('topics.purge') removed use `DELETE /api/v3/topics`
socket.emit('topics.lock') removed use `PUT /api/v3/topics/lock`
socket.emit('topics.unlock') removed use `DELETE /api/v3/topics/lock`
socket.emit('topics.pin') removed use `PUT /api/v3/topics/pin`
socket.emit('topics.unpin') removed use `DELETE /api/v3/topics/pin`