aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/views/api/bot/user.py
diff options
context:
space:
mode:
authorGravatar Gareth Coles <[email protected]>2018-06-24 10:44:46 +0100
committerGravatar Gareth Coles <[email protected]>2018-06-24 10:44:46 +0100
commit3dfbe79936965e9a4ef5eba634dff87009581192 (patch)
tree838f0d96a57e450091dcd5899d61e45d78ab3ae9 /pysite/views/api/bot/user.py
parent[API] Check for DB-nuking empty data in users POST (diff)
[API] Implement chunk-based user update mechanism
Diffstat (limited to 'pysite/views/api/bot/user.py')
-rw-r--r--pysite/views/api/bot/user.py97
1 files changed, 7 insertions, 90 deletions
diff --git a/pysite/views/api/bot/user.py b/pysite/views/api/bot/user.py
index febddd64..189dd1f8 100644
--- a/pysite/views/api/bot/user.py
+++ b/pysite/views/api/bot/user.py
@@ -35,12 +35,14 @@ BANNABLE_STATES = ("preparing", "running")
class UserView(APIView, DBMixin):
path = "/bot/users"
name = "bot.users"
- table_name = "users"
- oauth_table_name = "oauth_data"
- participants_table = "code_jam_participants"
+
+ chunks_table = "member_chunks"
infractions_table = "code_jam_infractions"
jams_table = "code_jams"
+ oauth_table_name = "oauth_data"
+ participants_table = "code_jam_participants"
responses_table = "code_jam_responses"
+ table_name = "users"
teams_table = "code_jam_teams"
@api_key
@@ -51,94 +53,9 @@ class UserView(APIView, DBMixin):
if not data:
return self.error(ErrorCodes.bad_data_format, "No users supplied")
- deletions = 0
- oauth_deletions = 0
- profile_deletions = 0
- response_deletions = 0
- bans = 0
-
- user_ids = [user["user_id"] for user in data]
-
- all_users = self.db.run(self.db.query(self.table_name), coerce=list)
-
- for user in all_users:
- if user["user_id"] not in user_ids:
- self.db.delete(self.table_name, user["user_id"], durability="soft")
- deletions += 1
-
- all_oauth_data = self.db.run(self.db.query(self.oauth_table_name), coerce=list)
-
- for item in all_oauth_data:
- if item["snowflake"] not in user_ids:
- user_id = item["snowflake"]
-
- oauth_deletions += self.db.delete(
- self.oauth_table_name, item["id"], durability="soft", return_changes=True
- ).get("deleted", 0)
- profile_deletions += self.db.delete(
- self.participants_table, user_id, durability="soft", return_changes=True
- ).get("deleted", 0)
-
- banned = False
- responses = self.db.run(
- self.db.query(self.responses_table).filter({"snowflake": user_id}),
- coerce=list
- )
-
- for response in responses:
- jam = response["jam"]
- jam_obj = self.db.get(self.jams_table, jam)
+ self.db.insert(self.chunks_table, {"chunk": data})
- if jam_obj:
- if jam_obj["state"] in BANNABLE_STATES:
- banned = True
-
- self.db.delete(self.responses_table, response["id"], durability="soft")
- response_deletions += 1
-
- teams = self.db.run(
- self.db.query(self.teams_table).filter(lambda row: row["members"].contains(user_id)),
- coerce=list
- )
-
- for team in teams:
- team["members"].remove(user_id)
-
- self.db.insert(self.teams_table, team, conflict="replace", durability="soft")
-
- if banned:
- self.db.insert(
- self.infractions_table, {
- "participant": user_id,
- "reason": "Automatic ban: Removed jammer profile in the middle of a code jam",
- "number": -1,
- "decremented_for": []
- }, durability="soft"
- )
- bans += 1
-
- del user_ids
-
- changes = self.db.insert(
- self.table_name, *data,
- conflict="update",
- durability="soft"
- )
-
- self.db.sync(self.infractions_table)
- self.db.sync(self.oauth_table_name)
- self.db.sync(self.participants_table)
- self.db.sync(self.responses_table)
- self.db.sync(self.table_name)
- self.db.sync(self.teams_table)
-
- changes["deleted"] = deletions
- changes["deleted_oauth"] = oauth_deletions
- changes["deleted_jam_profiles"] = profile_deletions
- changes["deleted_responses"] = response_deletions
- changes["jam_bans"] = bans
-
- return jsonify(changes) # pragma: no cover
+ return jsonify({"success": True}) # pragma: no cover
@api_key
@api_params(schema=SCHEMA, validation_type=ValidationTypes.json)