Skip to content

Commit

Permalink
Merge pull request #246 from bugout-dev/duplication-check
Browse files Browse the repository at this point in the history
Add duplicates check.
  • Loading branch information
Andrei-Dolgolev committed Dec 20, 2022
2 parents da0da95 + a40139f commit eb2e576
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 9 deletions.
18 changes: 17 additions & 1 deletion api/engineapi/actions.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from datetime import datetime
from collections import Counter
from typing import List, Any, Optional, Dict
import uuid
import logging
Expand Down Expand Up @@ -44,6 +45,13 @@ class DublicateClaimantError(Exception):
pass


class DuplicateLeaderboardAddressError(Exception):
def __init__(self, message, duplicates):
super(DuplicateLeaderboardAddressError, self).__init__(message)
self.message = message
self.duplicates = duplicates


BATCH_SIGNATURE_PAGE_SIZE = 500

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -1150,7 +1158,15 @@ def add_scores(

normalizer_fn = Web3.toChecksumAddress
if not normalize_addresses:
normalizer_fn = lambda x: x
normalizer_fn = lambda x: x # type: ignore

addresses = [score.address for score in scores]

if len(addresses) != len(set(addresses)):

duplicates = [key for key, value in Counter(addresses).items() if value > 1]

raise DuplicateLeaderboardAddressError("Dublicated addresses", duplicates)

if overwrite:
db_session.query(LeaderboardScores).filter(
Expand Down
24 changes: 16 additions & 8 deletions api/engineapi/routes/leaderboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,13 +218,21 @@ async def leaderboard(
raise EngineHTTPException(
status_code=403, detail="You don't have access to this leaderboard."
)

leaderboard_points = actions.add_scores(
db_session=db_session,
leaderboard_id=leaderboard_id,
scores=scores,
overwrite=overwrite,
normalize_addresses=normalize_addresses,
)
try:
leaderboard_points = actions.add_scores(
db_session=db_session,
leaderboard_id=leaderboard_id,
scores=scores,
overwrite=overwrite,
normalize_addresses=normalize_addresses,
)
except actions.DuplicateLeaderboardAddressError as e:
raise EngineHTTPException(
status_code=409,
detail=f"Duplicates in push to database is disallowed.\n List of duplicates:{e.duplicates}.\n Please handle duplicates manualy.",
)
except Exception as e:
logger.error(f"Score update failed with error: {e}")
raise EngineHTTPException(status_code=500, detail="Score update failed.")

return leaderboard_points

0 comments on commit eb2e576

Please sign in to comment.