feat: cached solution to sync current date query
parent
b0fa541fbc
commit
8222eb4b50
|
@ -1,5 +1,5 @@
|
||||||
import os
|
import os
|
||||||
import hashlib
|
import hashlib
|
||||||
from bson import json_util
|
from bson import json_util
|
||||||
from flask_restx import Resource
|
from flask_restx import Resource
|
||||||
from flask_jwt_extended import jwt_required
|
from flask_jwt_extended import jwt_required
|
||||||
|
@ -15,7 +15,8 @@ from app.docs.usage_models import (
|
||||||
model_price_update,
|
model_price_update,
|
||||||
model_prices_query_params,
|
model_prices_query_params,
|
||||||
transcription_data_query_params, usage_ns)
|
transcription_data_query_params, usage_ns)
|
||||||
|
from app.utils.current_date import is_current_date
|
||||||
|
from app.utils.hash_key import set_hash_key
|
||||||
|
|
||||||
TMP_DIR = '/tmp'
|
TMP_DIR = '/tmp'
|
||||||
|
|
||||||
|
@ -40,13 +41,15 @@ class TranscriptionExport(Resource):
|
||||||
|
|
||||||
validated = TranscriptionRequest(**data)
|
validated = TranscriptionRequest(**data)
|
||||||
|
|
||||||
# Cria um nome de arquivo baseado nos parâmetros (evita caracteres inválidos)
|
# Cria um nome de arquivo baseado nos parâmetros (evita caracteres inválidos)
|
||||||
hash_key = hashlib.md5(f"{validated.company_id}_{validated.start_date}_{validated.end_date}_{validated.who}".encode()).hexdigest()
|
hash_key = set_hash_key(f"{validated.company_id}_{validated.start_date}_{validated.end_date}_{validated.who}")
|
||||||
filename = f"transcription_{hash_key}.xlsx"
|
filename = f"transcription_{hash_key}.xlsx"
|
||||||
filepath = os.path.join(TMP_DIR, filename)
|
filepath = os.path.join(TMP_DIR, filename)
|
||||||
|
|
||||||
|
ignore_cache = is_current_date(validated.start_date, validated.end_date)
|
||||||
|
|
||||||
# Verifica se o arquivo já existe
|
# Verifica se o arquivo já existe
|
||||||
if not os.path.exists(filepath):
|
if not os.path.exists(filepath) or ignore_cache:
|
||||||
# Gera o relatório e salva no caminho desejado
|
# Gera o relatório e salva no caminho desejado
|
||||||
service = TranscriptionReportService(
|
service = TranscriptionReportService(
|
||||||
validated.company_id,
|
validated.company_id,
|
||||||
|
@ -72,7 +75,7 @@ class TranscriptionExport(Resource):
|
||||||
download_name=os.path.basename(filepath),
|
download_name=os.path.basename(filepath),
|
||||||
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@usage_ns.route('/data/trascription')
|
@usage_ns.route('/data/trascription')
|
||||||
class TranscriptionUsageData(Resource):
|
class TranscriptionUsageData(Resource):
|
||||||
|
|
|
@ -6,12 +6,13 @@ from openpyxl import Workbook
|
||||||
from openpyxl.utils.dataframe import dataframe_to_rows
|
from openpyxl.utils.dataframe import dataframe_to_rows
|
||||||
from openpyxl.styles import Font, PatternFill
|
from openpyxl.styles import Font, PatternFill
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import os
|
import os
|
||||||
import hashlib
|
|
||||||
from typing import List, Dict, Any, Optional
|
from typing import List, Dict, Any, Optional
|
||||||
from app.utils.mysql_query import execute_query
|
from app.utils.mysql_query import execute_query
|
||||||
from app.utils.calc_api_usage import calculate_api_usage
|
from app.utils.calc_api_usage import calculate_api_usage
|
||||||
from app.services.redis_service import cache_del, cache_get, cache_set
|
from app.services.redis_service import cache_del, cache_get, cache_set
|
||||||
|
from app.utils.current_date import is_current_date
|
||||||
|
from app.utils.hash_key import set_hash_key
|
||||||
import json
|
import json
|
||||||
|
|
||||||
class TranscriptionReportService:
|
class TranscriptionReportService:
|
||||||
|
@ -311,11 +312,13 @@ class TranscriptionReportService:
|
||||||
|
|
||||||
def _reportDataTotalCost(self):
|
def _reportDataTotalCost(self):
|
||||||
|
|
||||||
hash_key = hashlib.md5(f"{self.company_id}_{self.start_date}_{self.end_date}".encode()).hexdigest()
|
sum_key = set_hash_key(f"{self.company_id}_{self.start_date}_{self.end_date}")
|
||||||
sum_key = f"sum_total_cost_{hash_key}"
|
|
||||||
|
ignore_cache = is_current_date(self.start_date, self.end_date)
|
||||||
if data := cache_get(f'report_model_usage:total_cost:{sum_key}'):
|
|
||||||
return json.loads(data)
|
if not ignore_cache:
|
||||||
|
if data := cache_get(f'report_model_usage:total_cost:{sum_key}'):
|
||||||
|
return json.loads(data)
|
||||||
|
|
||||||
self._fetch_mongo_data(all_data=True)
|
self._fetch_mongo_data(all_data=True)
|
||||||
mysql_data = self._fetch_mysql_data(hit_report=True)
|
mysql_data = self._fetch_mysql_data(hit_report=True)
|
||||||
|
@ -331,10 +334,10 @@ class TranscriptionReportService:
|
||||||
'total_client_cost': total_client_cost
|
'total_client_cost': total_client_cost
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_set(f'report_model_usage:total_cost:{sum_key}', json.dumps(sum_total_cost))
|
cache_set(f'report_model_usage:total_cost:{sum_key}', json.dumps(sum_total_cost), 86400)
|
||||||
|
|
||||||
return sum_total_cost
|
return sum_total_cost
|
||||||
|
|
||||||
|
|
||||||
def reportDataXLSX(self, hit_report: Optional[bool] = False) -> str:
|
def reportDataXLSX(self, hit_report: Optional[bool] = False) -> str:
|
||||||
self._fetch_mongo_data(all_data=True)
|
self._fetch_mongo_data(all_data=True)
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
def is_current_date(start_date: str, end_date: str):
|
||||||
|
today_str = datetime.utcnow().date().isoformat()
|
||||||
|
ignore_cache = (start_date == today_str or end_date == today_str)
|
||||||
|
return ignore_cache
|
|
@ -0,0 +1,5 @@
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
def set_hash_key(key: str) -> str:
|
||||||
|
hash_key = hashlib.md5(f"{key}".encode()).hexdigest()
|
||||||
|
return hash_key
|
Loading…
Reference in New Issue