Commit f011e512 authored by 杨明橙's avatar 杨明橙

添加报价查询接口

parent 6c0633cc
from fastapi import APIRouter from fastapi import APIRouter
from api import bill, nav, fund, group, node, scheduler from api import bill, nav, fund, group, node, scheduler, price
api_router = APIRouter() api_router = APIRouter()
...@@ -8,4 +8,5 @@ api_router.include_router(nav.router, prefix="/nav", tags=["净值"]) ...@@ -8,4 +8,5 @@ api_router.include_router(nav.router, prefix="/nav", tags=["净值"])
api_router.include_router(fund.router, prefix="/fund", tags=["基金"]) api_router.include_router(fund.router, prefix="/fund", tags=["基金"])
api_router.include_router(node.router, prefix="/node", tags=["节点"]) api_router.include_router(node.router, prefix="/node", tags=["节点"])
api_router.include_router(group.router, prefix="/group", tags=["用户分组"]) api_router.include_router(group.router, prefix="/group", tags=["用户分组"])
api_router.include_router(price.router, prefix="/price", tags=["报价"])
api_router.include_router(scheduler.router, prefix="/scheduler", tags=["定时任务"]) api_router.include_router(scheduler.router, prefix="/scheduler", tags=["定时任务"])
from typing import List, Any, Optional
from fastapi import APIRouter, Depends, Query
from motor.core import AgnosticCollection
from db import AioRedisManager
from dependencies import get_hour_price_collect, get_cmc_price_redis
from model import Response
from service.price import get_price
from tools.time_helper import timestamp_to_datetime
router = APIRouter()
@router.get('/cmc/', summary='查询报价', description='查询报价')
async def get(
symbol: List[str] = Query(..., description='查询的币种'),
query_time: Optional[float] = Query(None, description='查询时间,为空时返回最新报价'),
hour_price_collect: AgnosticCollection = Depends(get_hour_price_collect),
cmc_price_redis: AioRedisManager = Depends(get_cmc_price_redis)
):
if query_time:
db_client = hour_price_collect
query_time = timestamp_to_datetime(query_time)
else:
db_client = cmc_price_redis
data = await get_price(symbol, query_time, db_client)
return Response[Any](data=data)
...@@ -53,5 +53,5 @@ def get_cache_collect(mongodb_manager: AioMongodbManager = Depends(get_mongodb_m ...@@ -53,5 +53,5 @@ def get_cache_collect(mongodb_manager: AioMongodbManager = Depends(get_mongodb_m
# 获取redis Client # 获取redis Client
def get_cmc_price_redis(redis_manager: AioRedisManager = Depends(get_redis_manager)): def get_cmc_price_redis(redis_manager: AioRedisManager = Depends(get_redis_manager)) -> AioRedisManager:
return redis_manager.get_client(name='cmc_price') return redis_manager.get_client(name='cmc_price')
import asyncio import asyncio
import datetime import datetime
import json import json
from typing import Dict
import aiofiles import aiofiles
import pytz import pytz
...@@ -250,9 +251,16 @@ class CMCPrice: ...@@ -250,9 +251,16 @@ class CMCPrice:
await self.start_update_ohlcv() await self.start_update_ohlcv()
async def get_price(coin_list, query_time, db_client): async def get_price(coin_list, query_time, db_client) -> Dict[str, float]:
"""
如果传入 query_time 则从历史数据中查询,如果没有传入则查询最新报价,需要传入对应的db_client
:param coin_list:
:param query_time:
:param db_client:
:return: 返回字典 key为symbol,value为报价 没有查询到数据 则value为None
"""
coin_list_copy = coin_list.copy() coin_list_copy = coin_list.copy()
result_dict = {} result_dict = dict.fromkeys(coin_list, None)
if 'USD' in coin_list_copy: if 'USD' in coin_list_copy:
coin_list_copy.remove('USD') coin_list_copy.remove('USD')
...@@ -266,6 +274,7 @@ async def get_price(coin_list, query_time, db_client): ...@@ -266,6 +274,7 @@ async def get_price(coin_list, query_time, db_client):
temp_index.append(coin_item) temp_index.append(coin_item)
data = await pipe.execute() data = await pipe.execute()
for coin_name, result_item in zip(temp_index, data): for coin_name, result_item in zip(temp_index, data):
if result_item:
result_dict[coin_name] = float(result_item) result_dict[coin_name] = float(result_item)
else: else:
cursor = db_client.find({'time': query_time, "symbol": {"$in": coin_list_copy}}) cursor = db_client.find({'time': query_time, "symbol": {"$in": coin_list_copy}})
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment