Skip to content
Snippets Groups Projects

Add endpoint for retrieving from the database

Merged Petr.Kalashnikov requested to merge dd13 into DD-12-gamle-okonomidata
+ 53
4
import hashlib
import datetime
import urllib
from functools import lru_cache
import fastapi
import logging.config
from typing import Optional, Union
from .document_client import DocumentClient
from .oracle_bot import OracleClient, OracleConfig
from .config import get_config, AuthConfig, InstanceConfig
app = fastapi.FastAPI(docs_url=None, redoc_url=None)
@@ -72,6 +75,20 @@ async def authorised(firm: str, token: str, doc_id: str) -> bool:
return bool(token and token == generated_token)
@lru_cache
def get_oracle_client(firm: str) -> OracleClient | None:
instance_config = get_instance_config(firm)
if instance_config is None or instance_config.old_bot is None:
return None
oracle_config = OracleConfig(
dsn=instance_config.old_bot.database.dsn,
user=instance_config.old_bot.database.user,
password=instance_config.old_bot.database.password,
)
return OracleClient(oracle_config)
@app.get("/document")
async def get_document(
firm: str,
@@ -110,9 +127,41 @@ async def get_document(
)
@app.get("/health")
async def health() -> fastapi.responses.Response:
@app.get("/economy_data")
async def get_economy_data(
firm: str,
doc_id: int,
authorised: bool = fastapi.Depends(authorised),
) -> fastapi.responses.Response:
if not authorised:
return fastapi.responses.PlainTextResponse(
status_code=401, content="Unauthorised"
)
oracle_client = get_oracle_client(firm)
if oracle_client is None:
return fastapi.responses.PlainTextResponse(status_code=404)
answer = oracle_client.get_document(doc_id)
if not answer:
return fastapi.responses.PlainTextResponse(status_code=404)
headers = {
"Cache-Control": "no-store",
}
if answer.filename:
# Stolen from starlette.FileResponse
content_disposition_filename = urllib.parse.quote(answer.filename)
if content_disposition_filename != answer.filename:
content_disposition = "attachment; filename*=utf-8''{}".format(
content_disposition_filename
)
else:
content_disposition = 'attachment; filename="{}"'.format(answer.filename)
headers["Content-Disposition"] = content_disposition
return fastapi.responses.Response(
content="OK",
media_type="text/plain",
content=answer.document,
media_type=answer.mimetype,
headers=headers,
)
Loading