From b5c854a2437049bb8cc6d25ef31d48af197d96eb Mon Sep 17 00:00:00 2001 From: gabdevele Date: Sun, 12 Apr 2026 00:16:46 +0200 Subject: [PATCH] feat: add Redis support and update service/proxy models --- pyproject.toml | 1 + src/core/config.py | 1 + src/{db => core}/mongodb.py | 2 +- src/core/redis.py | 21 +++++++++++++++++++++ src/models/proxy.py | 6 ++++++ src/models/service.py | 6 ++++++ uv.lock | 11 +++++++++++ 7 files changed, 47 insertions(+), 1 deletion(-) rename src/{db => core}/mongodb.py (94%) create mode 100644 src/core/redis.py create mode 100644 src/models/proxy.py create mode 100644 src/models/service.py diff --git a/pyproject.toml b/pyproject.toml index a02e7c0..85203a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ dependencies = [ "fastapi[standard]>=0.135.3", "motor>=3.7.1", "pydantic-settings>=2.13.1", + "redis>=7.4.0", ] [tool.ruff.lint] diff --git a/src/core/config.py b/src/core/config.py index 09554b2..23be48d 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -5,6 +5,7 @@ class Settings(BaseSettings): MONGODB_URI: str MONGODB_DB_NAME: str + REDIS_URL: str settings = Settings() \ No newline at end of file diff --git a/src/db/mongodb.py b/src/core/mongodb.py similarity index 94% rename from src/db/mongodb.py rename to src/core/mongodb.py index 2caca5b..5d1bba7 100644 --- a/src/db/mongodb.py +++ b/src/core/mongodb.py @@ -19,4 +19,4 @@ async def ensure_mongodb_available() -> None: client = mongodb.client if client is None: raise RuntimeError("MongoDB client has not been initialized") - await client.admin.command("ping") + await client.admin.command("ping") \ No newline at end of file diff --git a/src/core/redis.py b/src/core/redis.py new file mode 100644 index 0000000..3dff882 --- /dev/null +++ b/src/core/redis.py @@ -0,0 +1,21 @@ +import redis.asyncio as aioredis +from core.config import settings + +_redis_pool: aioredis.Redis | None = None + +async def init_redis() -> None: + global _redis_pool + _redis_pool = aioredis.from_url( + settings.REDIS_URL, encoding="utf-8", decode_responses=True + ) + + +async def close_redis() -> None: + if _redis_pool: + await _redis_pool.aclose() + + +async def get_redis() -> aioredis.Redis: + if _redis_pool is None: + raise RuntimeError("Redis pool has not been initialized") + return _redis_pool diff --git a/src/models/proxy.py b/src/models/proxy.py new file mode 100644 index 0000000..6c423f3 --- /dev/null +++ b/src/models/proxy.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel, Field +from models.service import ServiceDocument + +class ProxyDocument(BaseModel): + port: int = Field(..., description="Port number of the proxy") + service: ServiceDocument = Field(..., description="Associated service details") \ No newline at end of file diff --git a/src/models/service.py b/src/models/service.py new file mode 100644 index 0000000..7caff45 --- /dev/null +++ b/src/models/service.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel, Field + +class ServiceDocument(BaseModel): + name: str = Field(..., description="Name of the service") + port: int = Field(..., description="Port number of the service") + category: str = Field(..., description="Category of the service (e.g., web, pwn, etc.)") diff --git a/uv.lock b/uv.lock index 03d840f..88ce3c5 100644 --- a/uv.lock +++ b/uv.lock @@ -497,6 +497,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "redis" +version = "7.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/7f/3759b1d0d72b7c92f0d70ffd9dc962b7b7b5ee74e135f9d7d8ab06b8a318/redis-7.4.0.tar.gz", hash = "sha256:64a6ea7bf567ad43c964d2c30d82853f8df927c5c9017766c55a1d1ed95d18ad", size = 4943913, upload-time = "2026-03-24T09:14:37.53Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/3a/95deec7db1eb53979973ebd156f3369a72732208d1391cd2e5d127062a32/redis-7.4.0-py3-none-any.whl", hash = "sha256:a9c74a5c893a5ef8455a5adb793a31bb70feb821c86eccb62eebef5a19c429ec", size = 409772, upload-time = "2026-03-24T09:14:35.968Z" }, +] + [[package]] name = "rich" version = "14.3.4" @@ -604,6 +613,7 @@ dependencies = [ { name = "fastapi", extra = ["standard"] }, { name = "motor" }, { name = "pydantic-settings" }, + { name = "redis" }, ] [package.metadata] @@ -611,6 +621,7 @@ requires-dist = [ { name = "fastapi", extras = ["standard"], specifier = ">=0.135.3" }, { name = "motor", specifier = ">=3.7.1" }, { name = "pydantic-settings", specifier = ">=2.13.1" }, + { name = "redis", specifier = ">=7.4.0" }, ] [[package]]