sync
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import os
|
||||
|
||||
import redis # type: ignore
|
||||
from dishka import Container, Provider, Scope, make_container, provide
|
||||
|
||||
@@ -14,7 +16,8 @@ from flask_demo_api.usecase.put import PutKey
|
||||
class RedisSettingsProvider(Provider):
|
||||
@provide(scope=Scope.APP)
|
||||
def redis_settings(self) -> RedisSettings:
|
||||
return RedisSettings()
|
||||
url = os.getenv("REDISURL") or "redis://localhost:6379/0"
|
||||
return RedisSettings(url=url)
|
||||
|
||||
|
||||
class SettingsProvider(Provider):
|
||||
|
@@ -1,8 +1,7 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class KeyDTO:
|
||||
key: str
|
||||
val: Any | None = None
|
||||
val: str = ""
|
||||
|
@@ -10,11 +10,11 @@ class Repository(Protocol):
|
||||
raise NotImplementedError
|
||||
|
||||
@abstractmethod
|
||||
def add_key(self, obj: KeyDTO) -> KeyDTO:
|
||||
def add_key(self, obj: KeyDTO) -> KeyDTO | None:
|
||||
raise NotImplementedError
|
||||
|
||||
@abstractmethod
|
||||
def put_key(self, obj: KeyDTO) -> KeyDTO:
|
||||
def put_key(self, obj: KeyDTO) -> KeyDTO | None:
|
||||
raise NotImplementedError
|
||||
|
||||
@abstractmethod
|
||||
|
@@ -3,4 +3,4 @@ from dataclasses import dataclass
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class RedisSettings:
|
||||
url: str = "redis://localhost:6379/0"
|
||||
url: str
|
||||
|
@@ -10,19 +10,36 @@ class RedisRepository(Repository):
|
||||
def __init__(self, redis_pool: redis.Redis) -> None:
|
||||
self.pool = redis_pool
|
||||
|
||||
def __set(self, key, val):
|
||||
data = pickle.dumps(val)
|
||||
self.pool.set(key, data)
|
||||
|
||||
def __get(self, key):
|
||||
data = self.pool.get(key)
|
||||
if data is not None:
|
||||
return pickle.loads(data)
|
||||
return None
|
||||
|
||||
def get_key(self, obj: KeyDTO) -> KeyDTO | None:
|
||||
data = self.pool.get(obj.key)
|
||||
data = self.__get(obj.key)
|
||||
if not data:
|
||||
return None
|
||||
return KeyDTO(key=str(obj.key), val=data)
|
||||
return KeyDTO(key=obj.key, val=data)
|
||||
|
||||
def add_key(self, obj: KeyDTO) -> KeyDTO:
|
||||
self.pool.set(str(obj.key), pickle.dumps(obj.val))
|
||||
def add_key(self, obj: KeyDTO) -> KeyDTO | None:
|
||||
data = self.__get(obj.key)
|
||||
if data:
|
||||
return None
|
||||
self.__set(obj.key, obj.val)
|
||||
return obj
|
||||
|
||||
def put_key(self, obj: KeyDTO) -> KeyDTO:
|
||||
return KeyDTO(key="5", val="6")
|
||||
def put_key(self, obj: KeyDTO) -> KeyDTO | None:
|
||||
data = self.__get(obj.key)
|
||||
if data is None:
|
||||
return None
|
||||
self.__set(obj.key, obj.val)
|
||||
return obj
|
||||
|
||||
def delete_key(self, obj: KeyDTO) -> None:
|
||||
self.pool.delete(str(obj.key))
|
||||
self.pool.delete(obj.key)
|
||||
return None
|
||||
|
@@ -15,16 +15,18 @@ key_bp = Blueprint("key_bp", __name__)
|
||||
def past_key(usecase: FromDishka[PostKey]):
|
||||
json_data = request.get_json()
|
||||
|
||||
if not json_data.get("key"):
|
||||
abort(400, "'key' required")
|
||||
elif not json_data.get("val"):
|
||||
abort(400, "'val' required")
|
||||
|
||||
if json_data:
|
||||
result = usecase(
|
||||
request=KeyDTO(key=json_data.get("key"), val=json_data.get("val"))
|
||||
)
|
||||
return (
|
||||
jsonify({"message": "Ok", "data": result}),
|
||||
201,
|
||||
)
|
||||
result = usecase(request=KeyDTO(key=json_data.get("key"), val=json_data.get("val")))
|
||||
if result is None:
|
||||
abort(400, "Key alredy exist")
|
||||
return jsonify({"message": "Ok", "data": result}), 201
|
||||
else:
|
||||
return jsonify({"message": "No JSON data received"}), 400
|
||||
abort(400, "Invalid json data")
|
||||
|
||||
|
||||
@key_bp.route("/", methods=["GET"])
|
||||
@@ -50,16 +52,21 @@ def get_key(usecase: FromDishka[GetKey]):
|
||||
def put_key(usecase: FromDishka[PutKey]):
|
||||
json_data = request.get_json()
|
||||
|
||||
if not json_data.get("key"):
|
||||
abort(400, "'key' required")
|
||||
elif not json_data.get("val"):
|
||||
abort(400, "'val' required")
|
||||
|
||||
if json_data:
|
||||
result = usecase(
|
||||
request=KeyDTO(key=json_data.get("key"), val=json_data.get("val"))
|
||||
)
|
||||
result = usecase(request=KeyDTO(key=json_data.get("key"), val=json_data.get("val")))
|
||||
if result is None:
|
||||
abort(400, "No item for update")
|
||||
return (
|
||||
jsonify({"message": "Updated", "data": result}),
|
||||
200,
|
||||
)
|
||||
else:
|
||||
return jsonify({"message": "No JSON data received"}), 400
|
||||
abort(400, "Inalid JSON data")
|
||||
|
||||
|
||||
@key_bp.route("/", methods=["DELETE"])
|
||||
@@ -74,4 +81,4 @@ def delete_key(usecase: FromDishka[DelKey]):
|
||||
200,
|
||||
)
|
||||
else:
|
||||
return jsonify({"message": "No JSON data received"}), 400
|
||||
abort(400, "Inalid JSON data")
|
||||
|
@@ -9,5 +9,5 @@ class PostKey:
|
||||
) -> None:
|
||||
self.__repository = repository
|
||||
|
||||
def __call__(self, request: KeyDTO) -> KeyDTO:
|
||||
def __call__(self, request: KeyDTO) -> KeyDTO | None:
|
||||
return self.__repository.add_key(obj=request)
|
||||
|
@@ -9,5 +9,5 @@ class PutKey:
|
||||
) -> None:
|
||||
self.__repository = repository
|
||||
|
||||
def __call__(self, request: KeyDTO) -> KeyDTO:
|
||||
def __call__(self, request: KeyDTO) -> KeyDTO | None:
|
||||
return self.__repository.put_key(obj=request)
|
||||
|
Reference in New Issue
Block a user