mirror of
https://github.com/Redume/Kekkai.git
synced 2025-02-23 12:43:12 +03:00
96 lines
2.9 KiB
Python
96 lines
2.9 KiB
Python
|
import os
|
||
|
import psycopg2
|
||
|
import uvicorn
|
||
|
import yaml
|
||
|
import matplotlib.pyplot as plt
|
||
|
from fastapi import FastAPI, Response, status
|
||
|
from psycopg2.extras import DictCursor
|
||
|
from starlette.staticfiles import StaticFiles
|
||
|
|
||
|
app = FastAPI()
|
||
|
|
||
|
config = yaml.safe_load(open('../config.yaml'))
|
||
|
|
||
|
con = psycopg2.connect(host=config['database']['host'],
|
||
|
user=config['database']['user'],
|
||
|
password=config['database']['password'],
|
||
|
database=config['database']['name'],
|
||
|
port=config['database']['port'])
|
||
|
|
||
|
cur = con.cursor(cursor_factory=DictCursor)
|
||
|
con.autocommit = True
|
||
|
|
||
|
app.mount('/static/charts', StaticFiles(directory='../charts/'))
|
||
|
|
||
|
|
||
|
@app.get("/api/getChart/")
|
||
|
async def get_chart(response: Response,
|
||
|
from_currency: str, conv_currency: str,
|
||
|
start_date: str, end_date: str):
|
||
|
"""
|
||
|
:param response:
|
||
|
:param from_currency: The currency to convert from
|
||
|
:type from_currency: str
|
||
|
:param conv_currency: The currency to be converted into
|
||
|
:type conv_currency: str
|
||
|
:param start_date: The start date of the schedule period
|
||
|
:type start_date: str
|
||
|
:param end_date: The last date of the schedule period
|
||
|
:type end_date: str
|
||
|
:return:
|
||
|
"""
|
||
|
cur.execute('SELECT date, rate FROM currency WHERE (date BETWEEN %s AND %s) '
|
||
|
'AND from_currency = %s AND conv_currency = %s ORDER BY date',
|
||
|
[
|
||
|
start_date, end_date,
|
||
|
from_currency.upper(), conv_currency.upper()
|
||
|
])
|
||
|
con.commit()
|
||
|
data = cur.fetchall()
|
||
|
|
||
|
if not data:
|
||
|
response.status_code = status.HTTP_404_NOT_FOUND
|
||
|
return {'message': 'No data found', 'status_code': status.HTTP_404_NOT_FOUND}
|
||
|
|
||
|
date, rate = [], []
|
||
|
|
||
|
for i in range(len(data)):
|
||
|
date.append(str(data[i][0]))
|
||
|
rate.append(data[i][1])
|
||
|
|
||
|
if rate[0] < rate[-1]:
|
||
|
plt.plot(date, rate, color='green')
|
||
|
elif rate[0] > rate[-1]:
|
||
|
plt.plot(date, rate, color='red')
|
||
|
else:
|
||
|
plt.plot(date, rate, color='grey')
|
||
|
|
||
|
plt.xlabel('Date')
|
||
|
plt.ylabel('Rate')
|
||
|
|
||
|
fig = plt.gcf()
|
||
|
fig.set_size_inches(18.5, 9.5)
|
||
|
|
||
|
if not os.path.exists('../charts'):
|
||
|
os.mkdir('../charts')
|
||
|
|
||
|
fig.savefig(f'../charts/{from_currency}-{conv_currency}.png')
|
||
|
fig.clear()
|
||
|
|
||
|
return {'message': f'./static/charts/{from_currency}-{conv_currency}.png',
|
||
|
'status_code': status.HTTP_201_CREATED,
|
||
|
}
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
uvicorn.run(app,
|
||
|
host=config['server']['host'],
|
||
|
port=3030,
|
||
|
ssl_keyfile=config['server']['ssl']['private_key']
|
||
|
if config['server']['ssl']['work']
|
||
|
else None,
|
||
|
ssl_certfile=config['server']['ssl']['cert']
|
||
|
if config['server']['ssl']['work']
|
||
|
else None
|
||
|
)
|