Skip to content

Commit eb2e576

Browse files
Merge pull request #246 from bugout-dev/duplication-check
Add duplicates check.
2 parents da0da95 + a40139f commit eb2e576

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

api/engineapi/actions.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from collections import Counter
23
from typing import List, Any, Optional, Dict
34
import uuid
45
import logging
@@ -44,6 +45,13 @@ class DublicateClaimantError(Exception):
4445
pass
4546

4647

48+
class DuplicateLeaderboardAddressError(Exception):
49+
def __init__(self, message, duplicates):
50+
super(DuplicateLeaderboardAddressError, self).__init__(message)
51+
self.message = message
52+
self.duplicates = duplicates
53+
54+
4755
BATCH_SIGNATURE_PAGE_SIZE = 500
4856

4957
logger = logging.getLogger(__name__)
@@ -1150,7 +1158,15 @@ def add_scores(
11501158

11511159
normalizer_fn = Web3.toChecksumAddress
11521160
if not normalize_addresses:
1153-
normalizer_fn = lambda x: x
1161+
normalizer_fn = lambda x: x # type: ignore
1162+
1163+
addresses = [score.address for score in scores]
1164+
1165+
if len(addresses) != len(set(addresses)):
1166+
1167+
duplicates = [key for key, value in Counter(addresses).items() if value > 1]
1168+
1169+
raise DuplicateLeaderboardAddressError("Dublicated addresses", duplicates)
11541170

11551171
if overwrite:
11561172
db_session.query(LeaderboardScores).filter(

api/engineapi/routes/leaderboard.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,21 @@ async def leaderboard(
218218
raise EngineHTTPException(
219219
status_code=403, detail="You don't have access to this leaderboard."
220220
)
221-
222-
leaderboard_points = actions.add_scores(
223-
db_session=db_session,
224-
leaderboard_id=leaderboard_id,
225-
scores=scores,
226-
overwrite=overwrite,
227-
normalize_addresses=normalize_addresses,
228-
)
221+
try:
222+
leaderboard_points = actions.add_scores(
223+
db_session=db_session,
224+
leaderboard_id=leaderboard_id,
225+
scores=scores,
226+
overwrite=overwrite,
227+
normalize_addresses=normalize_addresses,
228+
)
229+
except actions.DuplicateLeaderboardAddressError as e:
230+
raise EngineHTTPException(
231+
status_code=409,
232+
detail=f"Duplicates in push to database is disallowed.\n List of duplicates:{e.duplicates}.\n Please handle duplicates manualy.",
233+
)
234+
except Exception as e:
235+
logger.error(f"Score update failed with error: {e}")
236+
raise EngineHTTPException(status_code=500, detail="Score update failed.")
229237

230238
return leaderboard_points

0 commit comments

Comments
 (0)