dify/api/controllers/inner_api/plugin/wraps.py

73 lines
2.1 KiB
Python
Raw Normal View History

2024-07-08 22:37:20 +08:00
from collections.abc import Callable
from functools import wraps
from typing import Optional
2024-07-29 16:40:04 +08:00
from flask import request
2024-07-08 22:37:20 +08:00
from flask_restful import reqparse
2024-07-29 16:40:04 +08:00
from pydantic import BaseModel
2024-07-08 22:37:20 +08:00
from extensions.ext_database import db
from models.account import Tenant
def get_tenant(view: Optional[Callable] = None):
def decorator(view_func):
@wraps(view_func)
def decorated_view(*args, **kwargs):
# fetch json body
parser = reqparse.RequestParser()
parser.add_argument('tenant_id', type=str, required=True, location='json')
parser.add_argument('user_id', type=str, required=True, location='json')
kwargs = parser.parse_args()
user_id = kwargs.get('user_id')
tenant_id = kwargs.get('tenant_id')
del kwargs['tenant_id']
del kwargs['user_id']
try:
tenant_model = db.session.query(Tenant).filter(
Tenant.id == tenant_id,
).first()
except Exception:
raise ValueError('tenant not found')
if not tenant_model:
raise ValueError('tenant not found')
kwargs['tenant_model'] = tenant_model
kwargs['user_id'] = user_id
return view_func(*args, **kwargs)
return decorated_view
if view is None:
return decorator
else:
return decorator(view)
2024-07-29 16:40:04 +08:00
def plugin_data(view: Optional[Callable] = None, *, payload_type: type[BaseModel]):
def decorator(view_func):
def decorated_view(*args, **kwargs):
try:
data = request.get_json()
except Exception:
raise ValueError('invalid json')
try:
payload = payload_type(**data)
except Exception as e:
raise ValueError(f'invalid payload: {str(e)}')
kwargs['payload'] = payload
return view_func(*args, **kwargs)
return decorated_view
if view is None:
return decorator
else:
return decorator(view)