add cache function

This commit is contained in:
2024-12-10 15:46:40 +09:00
parent c684105c2c
commit d6bd8fdee0
6 changed files with 97 additions and 35 deletions

View File

@@ -15,6 +15,7 @@ from app.db.cruddb import domainService,appService
import httpx import httpx
import app.core.config as config import app.core.config as config
from app.core import domainCacheService
platform_router = r = APIRouter() platform_router = r = APIRouter()
@@ -82,10 +83,10 @@ async def apps_update(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id)
if not domain: if not domainurl:
return ApiReturnModel(data = None) return ApiReturnModel(data = None)
return ApiReturnModel(data =appService.update_appversion(db, domain.url,app,user.id)) return ApiReturnModel(data =appService.update_appversion(db, domainurl,app,user.id))
except Exception as e: except Exception as e:
raise APIException('platform:apps',request.url._url,f"Error occurred while get create app :",e) raise APIException('platform:apps',request.url._url,f"Error occurred while get create app :",e)
@@ -100,10 +101,10 @@ async def apps_delete(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) #get_activedomain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id) #get_activedomain(db, user.id)
if not domain: if not domainurl:
return ApiReturnModel(data = None) return ApiReturnModel(data = None)
return ApiReturnModel(data =appService.delete_app(db, domain.url,appid)) return ApiReturnModel(data =appService.delete_app(db, domainurl,appid))
except Exception as e: except Exception as e:
raise APIException('platform:apps',request.url._url,f"Error occurred while delete app({appid}):",e) raise APIException('platform:apps',request.url._url,f"Error occurred while delete app({appid}):",e)
@@ -119,10 +120,10 @@ async def appversions_list(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) #get_activedomain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id) #get_activedomain(db, user.id)
if not domain: if not domainurl:
return ApiReturnPage(data = None) return ApiReturnPage(data = None)
return appService.get_appversions(db,domain.url,appid) return appService.get_appversions(db,domainurl,appid)
except Exception as e: except Exception as e:
raise APIException('platform:appversions',request.url._url,f"Error occurred while get app({appid}) version :",e) raise APIException('platform:appversions',request.url._url,f"Error occurred while get app({appid}) version :",e)
@@ -139,10 +140,10 @@ async def appversions_change(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) #get_activedomain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id) #get_activedomain(db, user.id)
if not domain: if not domainurl:
ApiReturnModel(data = None) ApiReturnModel(data = None)
return ApiReturnModel(data = appService.change_appversion(db, domain.url,appid,version,user.id)) return ApiReturnModel(data = appService.change_appversion(db, domainurl,appid,version,user.id))
except Exception as e: except Exception as e:
raise APIException('platform:appversions',request.url._url,f"Error occurred while change app version:",e) raise APIException('platform:appversions',request.url._url,f"Error occurred while change app version:",e)
@@ -237,7 +238,7 @@ async def action_data(
@r.get( @r.get(
"/flow/{appid}",tags=["App"], "/flow/{appid}",tags=["App"],
response_model=ApiReturnModel[List[Flow|None]], response_model=ApiReturnModel[Flow|None],
response_model_exclude_none=True, response_model_exclude_none=True,
) )
async def flow_details( async def flow_details(
@@ -247,10 +248,10 @@ async def flow_details(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id)
if not domain: if not domainurl:
return ApiReturnModel(data = None) return ApiReturnModel(data = None)
return ApiReturnModel(data = appService.get_flow(db, domain.url, appid,user.id)) return ApiReturnModel(data = appService.get_flow(db, domainurl, appid,user.id))
except Exception as e: except Exception as e:
raise APIException('platform:flow',request.url._url,f"Error occurred while get flow by flowid:",e) raise APIException('platform:flow',request.url._url,f"Error occurred while get flow by flowid:",e)
@@ -266,11 +267,10 @@ async def flow_list(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) #get_activedomain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id) #get_activedomain(db, user.id)
if not domain: if not domainurl:
return [] return []
print("domain=>",domain) flows = get_flows_by_app(db, domainurl, appid)
flows = get_flows_by_app(db, domain.url, appid)
return flows return flows
except Exception as e: except Exception as e:
raise APIException('platform:flow',request.url._url,f"Error occurred while get flow by appid:",e) raise APIException('platform:flow',request.url._url,f"Error occurred while get flow by appid:",e)
@@ -286,10 +286,10 @@ async def flow_create(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) #get_activedomain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id) #get_activedomain(db, user.id)
if not domain: if not domainurl:
return ApiReturnModel(data = None) return ApiReturnModel(data = None)
return ApiReturnModel(data = appService.create_flow(db, domain.url, flow,user.id)) return ApiReturnModel(data = appService.create_flow(db, domainurl, flow,user.id))
except Exception as e: except Exception as e:
raise APIException('platform:flow',request.url._url,f"Error occurred while create flow:",e) raise APIException('platform:flow',request.url._url,f"Error occurred while create flow:",e)
@@ -306,10 +306,10 @@ async def flow_edit(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id)
if not domain: if not domainurl:
return ApiReturnModel(data = None) return ApiReturnModel(data = None)
return ApiReturnModel(data = appService.edit_flow(db,domain.url, flow,user.id)) return ApiReturnModel(data = appService.edit_flow(db,domainurl, flow,user.id))
except Exception as e: except Exception as e:
raise APIException('platform:flow',request.url._url,f"Error occurred while edit flow:",e) raise APIException('platform:flow',request.url._url,f"Error occurred while edit flow:",e)
@@ -326,8 +326,8 @@ async def flow_delete(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.get_default_domain(db, user.id) domainurl = domainCacheService.get_default_domainurl(db,user.id)
if not domain: if not domainurl:
return ApiReturnModel(data = None) return ApiReturnModel(data = None)
return ApiReturnModel(data = appService.delete_flow(db, flowid)) return ApiReturnModel(data = appService.delete_flow(db, flowid))
except Exception as e: except Exception as e:
@@ -395,7 +395,10 @@ async def domain_edit(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
return ApiReturnModel(data = domainService.edit_domain(db, domain,user.id)) domain = domainService.edit_domain(db, domain,user.id)
if domain :
domainCacheService.clear_default_domainurl()
return ApiReturnModel(data = domain)
except Exception as e: except Exception as e:
raise APIException('platform:domain',request.url._url,f"Error occurred while edit domain:",e) raise APIException('platform:domain',request.url._url,f"Error occurred while edit domain:",e)
@@ -498,7 +501,7 @@ async def set_defualtuserdomain(
db=Depends(get_db), db=Depends(get_db),
): ):
try: try:
domain = domainService.set_default_domain(db,user.id,domainid) domain = domainCacheService.set_default_domain(db,user.id,domainid)
return ApiReturnModel(data= domain) return ApiReturnModel(data= domain)
except Exception as e: except Exception as e:
raise APIException('platform:defaultdomain',request.url._url,f"Error occurred while update user({user.id}) defaultdomain:",e) raise APIException('platform:defaultdomain',request.url._url,f"Error occurred while update user({user.id}) defaultdomain:",e)

View File

@@ -0,0 +1 @@
from app.core.cache import domainCacheService

55
backend/app/core/cache.py Normal file
View File

@@ -0,0 +1,55 @@
import time
from typing import Any
from sqlalchemy.orm import Session
from app.db.cruddb import domainService
class MemoryCache:
def __init__(self, max_cache_size: int = 100, ttl: int = 60):
self.cache = {}
self.max_cache_size = max_cache_size
self.ttl = ttl
def get(self, key: str) -> Any:
item = self.cache.get(key)
if item:
if time.time() - item['timestamp'] > self.ttl:
self.cache.pop(key)
return None
return item['value']
return None
def set(self, key: str, value: Any) -> None:
if len(self.cache) >= self.max_cache_size:
self.cache.pop(next(iter(self.cache)))
self.cache[key] = {'value': value, 'timestamp': time.time()}
# def clear(self,key) -> None:
# self.cache.pop(key,None)
def clear(self) -> None:
self.cache.clear()
class domainCache:
def __init__(self):
self.memoryCache = MemoryCache(max_cache_size=50, ttl=120)
def set_default_domain(self, db: Session,userid: int,domainid:str):
domain = domainService.set_default_domain(db,userid,domainid)
if domain:
self.memoryCache.set(f"DOMAIN_{userid}",domain.url)
return domain
def get_default_domainurl(self,db: Session, userid: int):
if not self.memoryCache.get(f"DOMAIN_{userid}"):
domain = domainService.get_default_domain(db,userid)
if domain:
self.memoryCache.set(f"DOMAIN_{userid}",domain.url)
return self.memoryCache.get(f"DOMAIN_{userid}")
def clear_default_domainurl(self):
self.memoryCache.clear()
domainCacheService =domainCache()

View File

@@ -47,7 +47,7 @@ class dbflow(crudbase):
updateuserid = userid updateuserid = userid
) )
db.add(db_flow) db.add(db_flow)
db_app = db.execute(select(models.App).filter(and_(models.App.domainurl == domainurl,models.App.appid == flow.appid))).scalars().first() db_app = db.execute(select(models.App).where(and_(models.App.domainurl == domainurl,models.App.appid == flow.appid))).scalars().first()
if not db_app: if not db_app:
db_app = models.App( db_app = models.App(
domainurl = domainurl, domainurl = domainurl,

View File

@@ -57,8 +57,9 @@ def test_delete_domain(test_client, login_user):
def test_set_defaultuserdomain(test_client, test_domain,login_user): def test_set_defaultuserdomain(test_client, test_domain,login_user):
response = test_client.put("/api/defaultdomain/"+str(test_domain.id), headers={"Authorization": "Bearer " + login_user}) response = test_client.put("/api/defaultdomain/"+str(test_domain.id), headers={"Authorization": "Bearer " + login_user})
assert response.status_code == 200
data = response.json() data = response.json()
logging.error(data)
assert response.status_code == 200
assert "data" in data assert "data" in data
assert data["data"] is not None assert data["data"] is not None
assert data["data"]["name"] == test_domain.name assert data["data"]["name"] == test_domain.name
@@ -99,8 +100,9 @@ def test_edit_domain(test_client, test_domain, login_user):
"is_active": True "is_active": True
} }
response = test_client.put("/api/domain", json=update_domain,headers={"Authorization": "Bearer " + login_user}) response = test_client.put("/api/domain", json=update_domain,headers={"Authorization": "Bearer " + login_user})
assert response.status_code == 200
data = response.json() data = response.json()
logging.error(data)
assert response.status_code == 200
assert "data" in data assert "data" in data
assert data["data"] is not None assert data["data"] is not None
assert data["data"]["name"] == update_domain["name"] assert data["data"]["name"] == update_domain["name"]

View File

@@ -37,8 +37,9 @@ def test_edit_flow(test_client,test_domain,test_app_id,login_user):
"content": "" "content": ""
} }
response = test_client.put("/api/flow", json=test_flow,headers={"Authorization": "Bearer " + login_user}) response = test_client.put("/api/flow", json=test_flow,headers={"Authorization": "Bearer " + login_user})
assert response.status_code == 200
data = response.json() data = response.json()
logging.error(data)
assert response.status_code == 200
assert "data" in data assert "data" in data
assert data["data"] is not None assert data["data"] is not None
assert data["data"]["domainurl"] == test_domain.url assert data["data"]["domainurl"] == test_domain.url