diff --git a/engineapi/engineapi/actions.py b/engineapi/engineapi/actions.py index bc0c6d74..f298ce99 100644 --- a/engineapi/engineapi/actions.py +++ b/engineapi/engineapi/actions.py @@ -73,6 +73,17 @@ class DuplicateLeaderboardAddressError(Exception): self.duplicates = duplicates +class LeaderboardNormalizeScoresError(Exception): + def __init__(self, message, normilize_errors): + super(LeaderboardNormalizeScoresError, self).__init__(message) + self.message = message + self.normilize_errors = normilize_errors + + +class LeaderboardPushScoreError(Exception): + pass + + class LeaderboardIsEmpty(Exception): pass @@ -1687,15 +1698,28 @@ def add_scores( raise DuplicateLeaderboardAddressError("Dublicated addresses", duplicates) - for score in scores: - leaderboard_scores.append( - { - "leaderboard_id": leaderboard_id, - "address": normalizer_fn(score.address), - "score": score.score, - "points_data": score.points_data, - "leaderboard_version_number": version_number, - } + # Process each score and append to leaderboard_scores list + non_normalized_addresses = [] + for index, score in enumerate(scores): + try: + normalized_address = normalizer_fn(score.address) + leaderboard_scores.append( + { + "leaderboard_id": leaderboard_id, + "address": normalized_address, + "score": score.score, + "points_data": score.points_data, + "leaderboard_version_number": version_number, + } + ) + except Exception as e: + non_normalized_addresses.append((index + 1, score.address)) + + if non_normalized_addresses: + logger.error(f"Error adding scores to leaderboard failed in normalizing") + raise LeaderboardNormalizeScoresError( + f"Error adding scores to leaderboard. Non-normalized addresses", + non_normalized_addresses, ) insert_statement = insert(LeaderboardScores).values(leaderboard_scores) @@ -1715,8 +1739,10 @@ def add_scores( try: db_session.execute(result_stmt) db_session.commit() - except: + except Exception as e: + logger.error(f"Error adding scores to leaderboard failed on commit: {e}") db_session.rollback() + raise LeaderboardPushScoreError("Error committing scores") return leaderboard_scores diff --git a/engineapi/engineapi/routes/leaderboard.py b/engineapi/engineapi/routes/leaderboard.py index ce798cb2..0e05a751 100644 --- a/engineapi/engineapi/routes/leaderboard.py +++ b/engineapi/engineapi/routes/leaderboard.py @@ -770,14 +770,18 @@ async def leaderboard_push_scores( ) except actions.DuplicateLeaderboardAddressError as e: raise EngineHTTPException( - status_code=409, + status_code=400, detail=f"Duplicates in push to database is disallowed.\n List of duplicates:{e.duplicates}.\n Please handle duplicates manualy.", ) - except actions.LeaderboardDeleteScoresError as e: - logger.error(f"Delete scores failed with error: {e}") + except actions.LeaderboardNormalizeScoresError as e: + raise EngineHTTPException( + status_code=400, + detail=f"Normalize scores failed for addresses: {e.normilize_errors}.", + ) + except actions.LeaderboardPushScoreError as e: raise EngineHTTPException( status_code=500, - detail=f"Delete scores failed.", + detail=f"Write scores to database failed", ) except Exception as e: logger.error(f"Score update failed with error: {e}") @@ -1428,9 +1432,19 @@ async def leaderboard_version_push_scores_handler( ) except actions.DuplicateLeaderboardAddressError as e: raise EngineHTTPException( - status_code=409, + status_code=400, detail=f"Duplicates in push to database is disallowed.\n List of duplicates:{e.duplicates}.\n Please handle duplicates manualy.", ) + except actions.LeaderboardNormalizeScoresError as e: + raise EngineHTTPException( + status_code=400, + detail=f"Normalize scores failed for addresses: {e.normilize_errors}.", + ) + except actions.LeaderboardPushScoreError as e: + raise EngineHTTPException( + status_code=500, + detail=f"Write scores to database failed", + ) except Exception as e: logger.error(f"Score update failed with error: {e}") raise EngineHTTPException(status_code=500, detail="Score update failed.") diff --git a/engineapi/engineapi/version.txt b/engineapi/engineapi/version.txt index 2cfabea2..8cbf02c3 100644 --- a/engineapi/engineapi/version.txt +++ b/engineapi/engineapi/version.txt @@ -1 +1 @@ -0.0.11 +0.0.12