| Total Complexity | 3 |
| Total Lines | 34 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
| 1 | from enum import Enum |
||
| 2 | from functools import wraps |
||
| 3 | from typing import Type |
||
| 4 | |||
| 5 | from flask import request |
||
| 6 | from pydantic import BaseModel |
||
| 7 | |||
| 8 | from app.context import context_property |
||
| 9 | |||
| 10 | |||
| 11 | class PayloadLocation(Enum): |
||
| 12 | ARGS = "args" |
||
| 13 | JSON = "json" |
||
| 14 | |||
| 15 | |||
| 16 | def validate_with_pydantic(payload_location: PayloadLocation, model: Type[BaseModel]): |
||
| 17 | def decorator(fn): |
||
| 18 | @wraps(fn) |
||
| 19 | def wrapper(*args, **kwargs): |
||
| 20 | payload = getattr(request, payload_location.value) |
||
| 21 | |||
| 22 | if payload_location == PayloadLocation.ARGS and hasattr(payload, "to_dict"): |
||
| 23 | payload = payload.to_dict() |
||
| 24 | |||
| 25 | instance = model(**payload) |
||
| 26 | |||
| 27 | context_property.request_payload = instance |
||
| 28 | |||
| 29 | return fn(*args, **kwargs) |
||
| 30 | |||
| 31 | return wrapper |
||
| 32 | |||
| 33 | return decorator |
||
| 34 |