From 911c162b86cfe563ba723a17febaa37970e2f818 Mon Sep 17 00:00:00 2001
From: Iosif <josephmazan6174@gmail.com>
Date: Tue, 29 Oct 2024 22:42:55 +0300
Subject: [PATCH] init

---
 Dockerfile         | 12 ++++++++++++
 docker-compose.yml | 18 ++++++++++++++++++
 main.py            | 37 +++++++++++++++++++++++++++++++++++++
 requirements.txt   |  3 +++
 4 files changed, 70 insertions(+)
 create mode 100644 Dockerfile
 create mode 100644 docker-compose.yml
 create mode 100644 main.py
 create mode 100644 requirements.txt

diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..079dc0b
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,12 @@
+FROM python:3.10-slim
+
+WORKDIR /app
+
+COPY requirements.txt .
+RUN pip install --no-cache-dir -r requirements.txt
+
+COPY . .
+
+EXPOSE 8000
+
+CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..1fb9253
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,18 @@
+version: '3.8'
+
+services:
+  app:
+    build: .
+    container_name: fastapi_app
+    ports:
+      - "8000:8000"
+    depends_on:
+      - redis
+    environment:
+      - REDIS_URL=redis://redis:6379
+
+  redis:
+    image: redis:alpine
+    container_name: redis
+    ports:
+      - "6379:6379"
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..398c9bb
--- /dev/null
+++ b/main.py
@@ -0,0 +1,37 @@
+from fastapi import FastAPI, HTTPException, Depends
+from pydantic import BaseModel
+from aioredis import Redis
+from aioredis.client import Redis as RedisClient
+import aioredis
+
+app = FastAPI()
+
+REDIS_URL = "redis://localhost:6379"
+REDIS_KEY = "stored_string"
+
+async def get_redis() -> RedisClient:
+    return await aioredis.from_url(REDIS_URL, encoding="utf-8", decode_responses=True)
+
+class StringRequest(BaseModel):
+    text: str
+
+@app.post("/string", status_code=201)
+async def create_string(request: StringRequest, redis: Redis = Depends(get_redis)):
+    if await redis.exists(REDIS_KEY):
+        raise HTTPException(status_code=400, detail="String already exists. Use PATCH to update.")
+    await redis.set(REDIS_KEY, request.text)
+    return {"message": "String created successfully", "text": request.text}
+
+@app.patch("/string")
+async def update_string(request: StringRequest, redis: Redis = Depends(get_redis)):
+    if not await redis.exists(REDIS_KEY):
+        raise HTTPException(status_code=404, detail="No string found to update. Use POST to create one.")
+    await redis.set(REDIS_KEY, request.text)
+    return {"message": "String updated successfully", "text": request.text}
+
+@app.get("/string")
+async def get_string(redis: Redis = Depends(get_redis)):
+    stored_string = await redis.get(REDIS_KEY)
+    if stored_string is None:
+        raise HTTPException(status_code=404, detail="No string found.")
+    return {"text": stored_string}
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..da20b73
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+fastapi
+aioredis[standard]
+uvicorn
\ No newline at end of file