Патч
All checks were successful
Build And Push / publish (push) Successful in 2m44s

This commit is contained in:
2025-12-02 04:31:47 +03:00
parent 3749f9b0bb
commit 633125cf7b
4 changed files with 61 additions and 12 deletions

View File

@ -1,6 +1,13 @@
from logging import getLogger
import xmltodict
from fastapi import APIRouter, HTTPException, Request
from orjson import dumps, loads
from apps.users.v1.schema import AEMDDemandContent
from shared.redis import client
from . import schema as s
logger = getLogger(__name__)
router = APIRouter(
@ -13,18 +20,26 @@ router = APIRouter(
@router.post('/callback')
async def callback(request: Request):
logger.info(request.headers.get('content-type', ''))
# if not request.headers.get('content-type', '').startswith(
# 'application/xml'
# ):
# logger.warning('Content-Type must be application/xml')
# raise HTTPException(
# status_code=400, detail='Content-Type must be application/xml'
# )
body_bytes = await request.body()
if not body_bytes:
logger.warning('Empty body')
raise HTTPException(status_code=400, detail='Empty body')
print(body_bytes)
body = body_bytes.decode('utf-8').replace('\r', '').replace('\n', '')
body_dict = xmltodict.parse(body)
body = s.Remd.model_validate(body_dict)
file_request = body.Envelope.body.sendDocumentFileRequest
data = await client.get(f'aemd_messages:{file_request.relatesToMessage}')
if not data:
raise HTTPException(status_code=400, detail='Message not found')
messageData = AEMDDemandContent(**loads(data))
await client.delete(f'aemd_messages:{file_request.relatesToMessage}')
await client.set(
f'aemd{messageData["vitaId"]}:{messageData["emdrId"]}',
dumps(s.AEMDFileData(data=file_request.file.data)),
)
return

View File

@ -0,0 +1,28 @@
from typing import TypedDict
from pydantic import BaseModel, Field
class FileModel(BaseModel):
data: str
class RequestModel(BaseModel):
relatesToMessage: str
file: FileModel
class BodyModel(BaseModel):
sendDocumentFileRequest: RequestModel
class EnvelopeModel(BaseModel):
body: BodyModel = Field(..., alias='s:Body')
class Remd(BaseModel):
Envelope: EnvelopeModel = Field(..., alias='s:Envelope')
class AEMDFileData(TypedDict):
data: str

View File

@ -206,7 +206,7 @@ async def get_aemd(user: Annotated[User, Depends(login)]):
return_items: list[s.AEMDReturnFile] = []
for item in items:
is_cached = await cache.get(f'aemd:{item["localUid"]}')
is_cached = await cache.get(f'aemd:{user.vita_id}:{item["emdrId"]}')
return_items.append(
s.AEMDReturnFile(
@ -233,7 +233,12 @@ async def post_aemd(user: Annotated[User, Depends(login)], emdrId: str):
@router.get('/aemd/{emdrId}')
async def get_aemd_file(user: Annotated[User, Depends(login)], emdrId: str):
return
data = await cache.get(f'aemd:{user.vita_id}:{emdrId}')
if not data:
raise e.NotFoundException(status_code=404, detail='File not found')
return loads(data)
@router.post('/measurement', status_code=status.HTTP_202_ACCEPTED)