tebakaja's picture
[ Feat ]: Implementation Server Side Caching \u Redis (Aiven Cloud)
89eb9ba
import os
from http import HTTPStatus
from typing import _ProtocolMeta
from fastapi.responses import JSONResponse
from restful.services import ForecastingService
from restful.schemas import ForecastingServiceSchema
# Forecasting Controller
class ForecastingControllers:
__SERVICE: ForecastingService = ForecastingService()
# Algorithms Controller
async def algorithms_controller(self) -> JSONResponse:
try:
algorithms: list = sorted(
os.listdir("resources/algorithms"))
return JSONResponse(
content = {
'message': 'Success',
'status_code': HTTPStatus.OK,
'data': algorithms
},
status_code = HTTPStatus.OK
)
except Exception as error_message:
print(error_message)
return JSONResponse(
content = {
'message': 'Internal Server Error',
'status_code': HTTPStatus.INTERNAL_SERVER_ERROR,
'data': None
},
status_code = HTTPStatus.INTERNAL_SERVER_ERROR
)
# Currency Controller
async def currencies_controller(self) -> JSONResponse:
try:
path: str = 'resources/datasets'
datasets: list = sorted(
[
item.replace(".csv", "") for item in os.listdir(path)
if os.path.isfile(os.path.join(path, item))
and item.endswith('.csv')
]
)
return JSONResponse(
content = {
'message': 'Success',
'status_code': HTTPStatus.OK,
'data': datasets
},
status_code = HTTPStatus.OK
)
except Exception as error_message:
print(error_message)
return JSONResponse(
content = {
'message': 'Internal Server Error',
'status_code': HTTPStatus.INTERNAL_SERVER_ERROR,
'data': None
},
status_code = HTTPStatus.INTERNAL_SERVER_ERROR
)
# Forecasting Controller
async def forecasting_controller(self, payload: ForecastingServiceSchema,
caching: _ProtocolMeta) -> JSONResponse:
try:
path: str = 'resources/datasets'
datasets: list = sorted(
[
item.replace(".csv", "") for item in os.listdir(path)
if os.path.isfile(os.path.join(path, item)) and item.endswith('.csv')
]
)
if payload.currency not in datasets:
return JSONResponse(
content = {
'message': f'symbols "{payload.currency}" is not available.',
'status_code': HTTPStatus.BAD_REQUEST,
'data': None
},
status_code = HTTPStatus.BAD_REQUEST
)
if (payload.days > 31) or (payload.days < 1):
return JSONResponse(
content = {
'message': 'days cannot be more than a month and cannot be less than 1',
'status_code': HTTPStatus.BAD_REQUEST,
'data': None
},
status_code = HTTPStatus.BAD_REQUEST
)
if payload.algorithm not in os.listdir("resources/algorithms"):
return JSONResponse(
content = {
'message': f'algorithm "{payload.algorithm}" is not available.',
'status_code': HTTPStatus.BAD_REQUEST,
'data': None
},
status_code = HTTPStatus.BAD_REQUEST
)
prediction: dict = await self.__SERVICE.forecasting(
payload = payload, caching = caching)
if not prediction :
return JSONResponse(
content = {
'message': 'prediction could not be generated, please try again.',
'status_code': HTTPStatus.BAD_REQUEST,
'data': None
},
status_code = HTTPStatus.BAD_REQUEST
)
return JSONResponse(
content = {
'message': 'prediction success',
'status_code': HTTPStatus.OK,
'data': {
'currency': payload.currency,
'predictions': prediction
}
},
status_code = HTTPStatus.OK
)
except Exception as error_message:
print(error_message)
return JSONResponse(
content = {
'message': 'internal server error',
'status_code': HTTPStatus.INTERNAL_SERVER_ERROR,
'data': None
},
status_code = HTTPStatus.INTERNAL_SERVER_ERROR
)