An ebook/comic library service and web client
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

85 lines
2.3 KiB

"""Model definitions for the api module."""
from typing import Any, List, Optional, Dict, Type
from flask_sqlalchemy import Pagination
from atheneum import db
# pylint: disable=too-few-public-methods
class APIResponse:
"""Custom class to wrap api responses."""
def __init__(self,
payload: Any,
status: int = 200,
options: Optional[List[str]] = None) -> None:
"""Construct an APIResponse object."""
self.payload = payload
self.status = status
self.options = options
# pylint: disable=too-few-public-methods
class BaseAPIMessage:
"""Base class for API responses."""
def to_dict(self) -> Dict[str, Any]:
"""Abstract to_dict."""
raise NotImplementedError('Not Implemented')
# pylint: disable=too-few-public-methods
class APIMessage(BaseAPIMessage):
"""Simple class to encapsulate response messages."""
success: bool
message: Optional[str]
def __init__(self,
success: bool,
message: Optional[str]) -> None:
"""Construct an APIMessage."""
self.success = success
self.message = message
def to_dict(self) -> Dict[str, Any]:
"""Serialize an APIMessage to a dict."""
obj: Dict[str, Any] = {
'success': self.success
}
if self.message is not None:
obj['message'] = self.message
return obj
# pylint: disable=too-few-public-methods
class APIPage(BaseAPIMessage):
"""Simple page response."""
def __init__(self,
page: int,
total_count: int,
last_page: int,
items: List[Type[db.Model]]) -> None:
"""Construct and APIPage."""
self.page = page
self.count = len(items)
self.total_count = total_count
self.last_page = last_page
self.items = items
def to_dict(self) -> Dict[str, Any]:
"""Serialize an APIPage."""
return {
'page': self.page,
'count': self.count,
'totalCount': self.total_count,
'lastPage': self.last_page,
'items': self.items
}
@staticmethod
def from_page(page: Pagination) -> 'APIPage':
"""Create an APIPage from a Pagination object."""
return APIPage(page.page, page.total, page.pages, page.items)