This commit is contained in:
2024-04-16 04:48:10 +03:00
parent 9b4184994f
commit 903c216966
17 changed files with 363 additions and 33 deletions

View File

@@ -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):

View File

@@ -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 = ""

View File

@@ -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

View File

@@ -3,4 +3,4 @@ from dataclasses import dataclass
@dataclass(frozen=True)
class RedisSettings:
url: str = "redis://localhost:6379/0"
url: str

View File

@@ -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

View File

@@ -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")

View File

@@ -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)

View File

@@ -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)