1
0
mirror of synced 2024-11-24 06:20:12 +01:00

Switch to using an enum for API ID constants.

This commit is contained in:
Jennifer Taylor 2021-08-19 19:21:41 +00:00
parent 96dd9a865e
commit b92cd4f579
8 changed files with 24 additions and 19 deletions

View File

@ -286,10 +286,17 @@ def lookup(protoversion: str, requestgame: str, requestversion: str) -> Dict[str
# Don't support this version!
abort(404)
idtype = requestdata['type']
ids = requestdata['ids']
if idtype not in [APIConstants.ID_TYPE_CARD, APIConstants.ID_TYPE_SONG, APIConstants.ID_TYPE_INSTANCE, APIConstants.ID_TYPE_SERVER]:
# Attempt to coerce ID type. If we fail, provide the correct failure message.
idtype = None
try:
idtype = APIConstants(requestdata['type'])
except ValueError:
pass
if idtype is None:
raise APIException('Invalid ID type provided!')
# Validate the provided IDs given the ID type above.
ids = requestdata['ids']
if idtype == APIConstants.ID_TYPE_CARD and len(ids) == 0:
raise APIException('Invalid number of IDs given!')
if idtype == APIConstants.ID_TYPE_SONG and len(ids) not in [1, 2]:

View File

@ -1,7 +1,7 @@
from typing import List, Any, Dict
from bemani.api.exceptions import APIException
from bemani.common import GameConstants
from bemani.common import APIConstants, GameConstants
from bemani.data import Data
@ -20,5 +20,5 @@ class BaseObject:
self.version = version
self.omnimix = omnimix
def fetch_v1(self, idtype: str, ids: List[str], params: Dict[str, Any]) -> Any:
def fetch_v1(self, idtype: APIConstants, ids: List[str], params: Dict[str, Any]) -> Any:
raise APIException('Object fetch not supported for this version!')

View File

@ -192,7 +192,7 @@ class CatalogObject(BaseObject):
else:
return self.version
def fetch_v1(self, idtype: str, ids: List[str], params: Dict[str, Any]) -> Dict[str, List[Dict[str, Any]]]:
def fetch_v1(self, idtype: APIConstants, ids: List[str], params: Dict[str, Any]) -> Dict[str, List[Dict[str, Any]]]:
# Verify IDs
if idtype != APIConstants.ID_TYPE_SERVER:
raise APIException(

View File

@ -73,7 +73,7 @@ class ProfileObject(BaseObject):
return base
def fetch_v1(self, idtype: str, ids: List[str], params: Dict[str, Any]) -> List[Dict[str, Any]]:
def fetch_v1(self, idtype: APIConstants, ids: List[str], params: Dict[str, Any]) -> List[Dict[str, Any]]:
# Fetch the profiles
profiles: List[Tuple[UserID, ValidatedDict]] = []
if idtype == APIConstants.ID_TYPE_SERVER:

View File

@ -230,7 +230,7 @@ class RecordsObject(BaseObject):
else:
return self.version
def fetch_v1(self, idtype: str, ids: List[str], params: Dict[str, Any]) -> List[Dict[str, Any]]:
def fetch_v1(self, idtype: APIConstants, ids: List[str], params: Dict[str, Any]) -> List[Dict[str, Any]]:
since = params.get('since')
until = params.get('until')

View File

@ -180,7 +180,7 @@ class StatisticsObject(BaseObject):
return retval
def fetch_v1(self, idtype: str, ids: List[str], params: Dict[str, Any]) -> List[Dict[str, Any]]:
def fetch_v1(self, idtype: APIConstants, ids: List[str], params: Dict[str, Any]) -> List[Dict[str, Any]]:
retval: List[Dict[str, Any]] = []
# Fetch the attempts

View File

@ -132,11 +132,9 @@ class VersionConstants:
SDVX_HEAVENLY_HAVEN: Final[int] = 4
class APIConstants:
class APIConstants(Enum):
"""
The four types of IDs found in a BEMAPI request or response.
TODO: These should be an enum.
"""
ID_TYPE_SERVER: Final[str] = 'server'
ID_TYPE_CARD: Final[str] = 'card'

View File

@ -2,7 +2,7 @@ import json
import requests
from typing import Tuple, Dict, List, Any, Optional
from bemani.common import GameConstants, VersionConstants, DBConstants, ValidatedDict
from bemani.common import APIConstants, GameConstants, VersionConstants, DBConstants, ValidatedDict
class APIException(Exception):
@ -194,7 +194,7 @@ class APIClient:
'versions': resp['versions'],
})
def get_profiles(self, game: GameConstants, version: int, idtype: str, ids: List[str]) -> List[Dict[str, Any]]:
def get_profiles(self, game: GameConstants, version: int, idtype: APIConstants, ids: List[str]) -> List[Dict[str, Any]]:
# Allow remote servers to be disabled
if not self.allow_scores:
return []
@ -205,7 +205,7 @@ class APIClient:
f'{self.API_VERSION}/{servergame}/{serverversion}',
{
'ids': ids,
'type': idtype,
'type': idtype.value,
'objects': ['profile'],
},
)
@ -218,7 +218,7 @@ class APIClient:
self,
game: GameConstants,
version: int,
idtype: str,
idtype: APIConstants,
ids: List[str],
since: Optional[int]=None,
until: Optional[int]=None,
@ -231,7 +231,7 @@ class APIClient:
servergame, serverversion = self.__translate(game, version)
data: Dict[str, Any] = {
'ids': ids,
'type': idtype,
'type': idtype.value,
'objects': ['records'],
}
if since is not None:
@ -247,7 +247,7 @@ class APIClient:
# Couldn't talk to server, assume empty records
return []
def get_statistics(self, game: GameConstants, version: int, idtype: str, ids: List[str]) -> List[Dict[str, Any]]:
def get_statistics(self, game: GameConstants, version: int, idtype: APIConstants, ids: List[str]) -> List[Dict[str, Any]]:
# Allow remote servers to be disabled
if not self.allow_stats:
return []
@ -258,7 +258,7 @@ class APIClient:
f'{self.API_VERSION}/{servergame}/{serverversion}',
{
'ids': ids,
'type': idtype,
'type': idtype.value,
'objects': ['statistics'],
},
)