From 0fe7d71992661ae44d3fba7d91b056c3e2069dbf Mon Sep 17 00:00:00 2001 From: gordei228 Date: Sun, 28 Sep 2025 17:53:34 +0300 Subject: [PATCH 1/7] Implement ASGI application with fibonacci, factorial, and mean endpoints --- hw1/README.md | 2 +- hw1/app.py | 128 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 127 insertions(+), 3 deletions(-) diff --git a/hw1/README.md b/hw1/README.md index 517057e7..e0f73d91 100644 --- a/hw1/README.md +++ b/hw1/README.md @@ -5,7 +5,7 @@ ### 1. Установите зависимости ```bash -pip install -r requirements.txt +pip3 install --break-system-packages -r requirements.txt ``` ### 2. Реализуйте ASGI приложение diff --git a/hw1/app.py b/hw1/app.py index 6107b870..faf39949 100644 --- a/hw1/app.py +++ b/hw1/app.py @@ -1,4 +1,42 @@ from typing import Any, Awaitable, Callable +import math +import json +from urllib.parse import parse_qs +from http import HTTPStatus + + +def compute_fibonacci(n: int) -> int: + if n == 0: + return 0 + a, b = 0, 1 + for _ in range(1, n + 1): + a, b = b, a + b + return a + + +async def send_response( + send: Callable[[dict[str, Any]], Awaitable[None]], + status: int, + body: bytes = b"", + content_type: bytes = b"text/plain", +): + await send( + { + "type": "http.response.start", + "status": status, + "headers": [[b"content-type", content_type]], + } + ) + await send({"type": "http.response.body", "body": body}) + + +async def send_json( + send: Callable[[dict[str, Any]], Awaitable[None]], + data: dict[str, Any], + status: int = HTTPStatus.OK, +): + body = json.dumps(data).encode("utf-8") + await send_response(send, status, body, b"application/json") async def application( @@ -12,8 +50,94 @@ async def application( receive: Корутина для получения сообщений от клиента send: Корутина для отправки сообщений клиенту """ - # TODO: Ваша реализация здесь + if scope["type"] == "lifespan": + while True: + message = await receive() + if message["type"] == "lifespan.startup": + await send({"type": "lifespan.startup.complete"}) + elif message["type"] == "lifespan.shutdown": + await send({"type": "lifespan.shutdown.complete"}) + return + elif scope["type"] == "http": + method = scope["method"] + path = scope["path"] + + if path == "/factorial": + if method != "GET": + await send_response(send, HTTPStatus.METHOD_NOT_ALLOWED, b"Method Not Allowed") + return + query_string = scope["query_string"].decode() + query = parse_qs(query_string) + n_str = query.get("n", [None])[0] + if n_str is None: + await send_response(send, HTTPStatus.UNPROCESSABLE_ENTITY, b"Missing parameter 'n'") + return + try: + n = int(n_str) + except ValueError: + await send_response(send, HTTPStatus.UNPROCESSABLE_ENTITY, b"Invalid parameter 'n'") + return + if n < 0: + await send_response(send, HTTPStatus.BAD_REQUEST, b"Parameter 'n' must be non-negative") + return + result = math.factorial(n) + await send_json(send, {"result": result}) + + elif path.startswith("/fibonacci/"): + if method != "GET": + await send_response(send, HTTPStatus.METHOD_NOT_ALLOWED, b"Method Not Allowed") + return + n_str = path[len("/fibonacci/"):] + if not n_str: + await send_response(send, HTTPStatus.UNPROCESSABLE_ENTITY, b"Missing number in path") + return + try: + n = int(n_str) + except ValueError: + await send_response(send, HTTPStatus.UNPROCESSABLE_ENTITY, b"Invalid number in path") + return + if n < 0: + await send_response(send, HTTPStatus.BAD_REQUEST, b"Number must be non-negative") + return + result = compute_fibonacci(n) + await send_json(send, {"result": result}) + + elif path == "/mean": + if method != "GET": + await send_response(send, HTTPStatus.METHOD_NOT_ALLOWED, b"Method Not Allowed") + return + message = await receive() + if message["type"] != "http.request": + await send_response(send, HTTPStatus.INTERNAL_SERVER_ERROR, b"Invalid request") + return + body = message.get("body", b"") + if not body: + await send_response(send, HTTPStatus.UNPROCESSABLE_ENTITY, b"Empty body") + return + try: + data = json.loads(body) + if not isinstance(data, list): + await send_response(send, HTTPStatus.UNPROCESSABLE_ENTITY, b"Body must be a list") + return + if not data: + await send_response(send, HTTPStatus.BAD_REQUEST, b"Empty list") + return + numbers = [] + for item in data: + if not isinstance(item, (int, float)): + await send_response(send, HTTPStatus.UNPROCESSABLE_ENTITY, b"All elements must be numbers") + return + numbers.append(float(item)) + mean_value = sum(numbers) / len(numbers) + await send_json(send, {"result": mean_value}) + except json.JSONDecodeError: + await send_response(send, HTTPStatus.UNPROCESSABLE_ENTITY, b"Invalid JSON") + return + else: + await send_response(send, HTTPStatus.NOT_FOUND, b"Not Found") + else: + return if __name__ == "__main__": import uvicorn - uvicorn.run("app:application", host="0.0.0.0", port=8000, reload=True) + uvicorn.run("app:application", host="0.0.0.0", port=8000) From b8e48f21ec615f47d8714b574cdef8e6b6efc08b Mon Sep 17 00:00:00 2001 From: gordei228 Date: Mon, 6 Oct 2025 16:13:41 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D1=8F=20=D0=BD=D0=B5=20=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B4=D0=BE=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hw2/hw/shop_api/main.py | 170 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 169 insertions(+), 1 deletion(-) diff --git a/hw2/hw/shop_api/main.py b/hw2/hw/shop_api/main.py index f60a8c60..02619244 100644 --- a/hw2/hw/shop_api/main.py +++ b/hw2/hw/shop_api/main.py @@ -1,3 +1,171 @@ -from fastapi import FastAPI +from fastapi import FastAPI, HTTPException, Query +from pydantic import BaseModel, ValidationError +from typing import List, Optional +from fastapi.responses import JSONResponse +from fastapi.exceptions import RequestValidationError +from fastapi import Request app = FastAPI(title="Shop API") + +items_db = {} +carts_db = {} +cart_counter = 0 +item_counter = 0 + +class Item(BaseModel): + id: int + name: str + price: float + deleted: bool = False + +class CartItem(BaseModel): + id: int + name: str + quantity: int + available: bool + +class Cart(BaseModel): + id: int + items: List[CartItem] + price: float + +class ItemCreate(BaseModel): + name: str + price: float + +class ItemUpdate(BaseModel): + name: Optional[str] = None + price: Optional[float] = None + + class Config: + extra = "forbid" + +@app.exception_handler(RequestValidationError) +async def validation_exception_handler(request: Request, exc: RequestValidationError): + return JSONResponse(status_code=422, content={"detail": exc.errors()}) + +@app.post("/item", response_model=Item, status_code=201) +async def create_item(item: ItemCreate): + global item_counter + item_counter += 1 + new_item = Item(id=item_counter, name=item.name, price=item.price, deleted=False) + items_db[item_counter] = new_item + return new_item + +@app.get("/item/{id}", response_model=Item) +async def get_item(id: int): + item = items_db.get(id) + if not item or item.deleted: + raise HTTPException(status_code=404, detail="Item not found") + return item + +@app.get("/item") +async def list_items( + offset: int = Query(0, ge=0), + limit: int = Query(10, ge=1), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + show_deleted: bool = False +): + filtered_items = list(items_db.values()) + if not show_deleted: + filtered_items = [item for item in filtered_items if not item.deleted] + if min_price is not None: + filtered_items = [item for item in filtered_items if item.price >= min_price] + if max_price is not None: + filtered_items = [item for item in filtered_items if item.price <= max_price] + return filtered_items[offset:offset + limit] + +@app.put("/item/{id}", response_model=Item) +async def update_item(id: int, item: ItemCreate): + if id not in items_db: + raise HTTPException(status_code=404, detail="Item not found") + updated_item = Item(id=id, name=item.name, price=item.price, deleted=items_db[id].deleted) + items_db[id] = updated_item + return updated_item + +@app.patch("/item/{id}", response_model=Item) +async def partial_update_item(id: int, item: ItemUpdate): + if id not in items_db: + raise HTTPException(status_code=404, detail="Item not found") + stored_item = items_db[id] + if stored_item.deleted: + raise HTTPException(status_code=304, detail="Item is deleted") + try: + update_data = item.model_dump(exclude_unset=True) + updated_item = stored_item.model_copy(update=update_data) + items_db[id] = updated_item + return updated_item + except ValidationError as e: + raise HTTPException(status_code=422, detail="Invalid fields in request") + +@app.delete("/item/{id}", response_model=dict) +async def delete_item(id: int): + if id not in items_db: + raise HTTPException(status_code=404, detail="Item not found") + items_db[id].deleted = True + return {"status": "success"} + +@app.post("/cart", response_model=dict, status_code=201) +async def create_cart(): + global cart_counter + cart_counter += 1 + carts_db[cart_counter] = Cart(id=cart_counter, items=[], price=0.0) + return JSONResponse( + content={"id": cart_counter}, + headers={"Location": f"/cart/{cart_counter}"}, + status_code=201 + ) + +@app.get("/cart/{id}", response_model=Cart) +async def get_cart(id: int): + cart = carts_db.get(id) + if not cart: + raise HTTPException(status_code=404, detail="Cart not found") + return cart + +@app.get("/cart") +async def list_carts( + offset: int = Query(0, ge=0), + limit: int = Query(10, ge=1), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + min_quantity: Optional[int] = Query(None, ge=0), + max_quantity: Optional[int] = Query(None, ge=0) +): + filtered_carts = list(carts_db.values()) + if min_price is not None: + filtered_carts = [cart for cart in filtered_carts if cart.price >= min_price] + if max_price is not None: + filtered_carts = [cart for cart in filtered_carts if cart.price <= max_price] + if min_quantity is not None: + filtered_carts = [cart for cart in filtered_carts if sum(item.quantity for item in cart.items) >= min_quantity] + if max_quantity is not None: + filtered_carts = [cart for cart in filtered_carts if sum(item.quantity for item in cart.items) <= max_quantity] + return filtered_carts[offset:offset + limit] + +@app.post("/cart/{cart_id}/add/{item_id}") +async def add_item_to_cart(cart_id: int, item_id: int): + if cart_id not in carts_db: + raise HTTPException(status_code=404, detail="Cart not found") + if item_id not in items_db: + raise HTTPException(status_code=404, detail="Item not found") + + cart = carts_db[cart_id] + item = items_db[item_id] + + for cart_item in cart.items: + if cart_item.id == item_id: + cart_item.quantity += 1 + cart.price += item.price + return {"status": "success"} + + cart_item = CartItem( + id=item.id, + name=item.name, + quantity=1, + available=not item.deleted + ) + cart.items.append(cart_item) + cart.price += item.price + return {"status": "success"} From 69c78ec10e127158038ef23484a0919dda1ab1ff Mon Sep 17 00:00:00 2001 From: gordei228 Date: Mon, 13 Oct 2025 00:07:43 +0300 Subject: [PATCH 3/7] hw3 --- hw2/hw/Dockerfile | 10 +++++++++ hw2/hw/docker-compose.yml | 44 ++++++++++++++++++++++++++++++++++++++ hw2/hw/img.png | Bin 0 -> 146243 bytes hw2/hw/prometheus.yml | 8 +++++++ hw2/hw/requirements.txt | 1 + hw2/hw/shop_api/main.py | 3 +++ hw2/hw/start.bash | 9 ++++++++ 7 files changed, 75 insertions(+) create mode 100644 hw2/hw/Dockerfile create mode 100644 hw2/hw/docker-compose.yml create mode 100644 hw2/hw/img.png create mode 100644 hw2/hw/prometheus.yml create mode 100755 hw2/hw/start.bash diff --git a/hw2/hw/Dockerfile b/hw2/hw/Dockerfile new file mode 100644 index 00000000..d1f8f4d1 --- /dev/null +++ b/hw2/hw/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.12-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY shop_api/ ./shop_api/ + +CMD ["uvicorn", "shop_api.main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/hw2/hw/docker-compose.yml b/hw2/hw/docker-compose.yml new file mode 100644 index 00000000..04a2c65c --- /dev/null +++ b/hw2/hw/docker-compose.yml @@ -0,0 +1,44 @@ +version: "3" + +services: + app: + build: . + restart: unless-stopped + ports: + - "8000:8000" + networks: + - monitoring + depends_on: + - prometheus + + prometheus: + image: prom/prometheus:latest + restart: unless-stopped + ports: + - "9090:9090" + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + networks: + - monitoring + + grafana: + image: grafana/grafana:latest + restart: unless-stopped + ports: + - "3000:3000" + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + volumes: + - grafana_data:/var/lib/grafana + networks: + - monitoring + +networks: + monitoring: + +volumes: + grafana_data: {} \ No newline at end of file diff --git a/hw2/hw/img.png b/hw2/hw/img.png new file mode 100644 index 0000000000000000000000000000000000000000..82c633c394f20412a2208079f3ebcbe0ff8da0f1 GIT binary patch literal 146243 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 Mr>mdKI;Vst0CJjS%K!iX literal 0 HcmV?d00001 diff --git a/hw2/hw/prometheus.yml b/hw2/hw/prometheus.yml new file mode 100644 index 00000000..2fbb35fb --- /dev/null +++ b/hw2/hw/prometheus.yml @@ -0,0 +1,8 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: 'shop-api' + static_configs: + - targets: ['app:8000'] + metrics_path: '/metrics' \ No newline at end of file diff --git a/hw2/hw/requirements.txt b/hw2/hw/requirements.txt index 207dcf5c..89162f30 100644 --- a/hw2/hw/requirements.txt +++ b/hw2/hw/requirements.txt @@ -1,6 +1,7 @@ # Основные зависимости для ASGI приложения fastapi>=0.117.1 uvicorn>=0.24.0 +prometheus-fastapi-instrumentator==6.1.0 # Зависимости для тестирования pytest>=7.4.0 diff --git a/hw2/hw/shop_api/main.py b/hw2/hw/shop_api/main.py index 02619244..5fe2c5b0 100644 --- a/hw2/hw/shop_api/main.py +++ b/hw2/hw/shop_api/main.py @@ -4,9 +4,12 @@ from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from fastapi import Request +from prometheus_fastapi_instrumentator import Instrumentator app = FastAPI(title="Shop API") +instrumentator = Instrumentator().instrument(app).expose(app) + items_db = {} carts_db = {} cart_counter = 0 diff --git a/hw2/hw/start.bash b/hw2/hw/start.bash new file mode 100755 index 00000000..6c0c2fe7 --- /dev/null +++ b/hw2/hw/start.bash @@ -0,0 +1,9 @@ +docker-compose down && docker-compose up --build -d + +sleep 30 + +curl http://localhost:8000/metrics | head -20 + +for i in {1..5}; do curl http://localhost:8000/cart; done + +curl http://localhost:9090/api/v1/query?query=http_server_requests_seconds_count_total From 0be45bcdb6082dfc7c65a7395c8ad9b5eee03bd1 Mon Sep 17 00:00:00 2001 From: gordei228 Date: Sun, 26 Oct 2025 23:53:41 +0300 Subject: [PATCH 4/7] hw 4 donw but withot hw 5 sorry --- hw2/hw/docker-compose.yml | 24 ++- hw2/hw/requirements.txt | 3 + hw2/hw/run_scripts.bash | 5 + hw2/hw/scripts/dirty_read.py | 30 +++ hw2/hw/scripts/isolation_demo.py | 182 ++++++++++++++++ hw2/hw/scripts/non_repeatable_read.py | 30 +++ hw2/hw/scripts/phantom_read.py | 31 +++ hw2/hw/scripts_out.txt | 0 hw2/hw/shop_api/main.py | 296 +++++++++++++++----------- 9 files changed, 478 insertions(+), 123 deletions(-) create mode 100644 hw2/hw/run_scripts.bash create mode 100644 hw2/hw/scripts/dirty_read.py create mode 100644 hw2/hw/scripts/isolation_demo.py create mode 100644 hw2/hw/scripts/non_repeatable_read.py create mode 100644 hw2/hw/scripts/phantom_read.py create mode 100644 hw2/hw/scripts_out.txt diff --git a/hw2/hw/docker-compose.yml b/hw2/hw/docker-compose.yml index 04a2c65c..ec339994 100644 --- a/hw2/hw/docker-compose.yml +++ b/hw2/hw/docker-compose.yml @@ -1,4 +1,4 @@ -version: "3" +version: '3.8' services: app: @@ -8,8 +8,26 @@ services: - "8000:8000" networks: - monitoring + - db_network depends_on: + - db - prometheus + environment: + - DATABASE_URL=postgresql://shop:shop@db:5432/shop + + db: + image: postgres:15 + restart: unless-stopped + environment: + POSTGRES_USER: shop + POSTGRES_PASSWORD: shop + POSTGRES_DB: shop + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - db_network + ports: + - "5432:5432" prometheus: image: prom/prometheus:latest @@ -39,6 +57,8 @@ services: networks: monitoring: + db_network: volumes: - grafana_data: {} \ No newline at end of file + grafana_data: + postgres_data: {} \ No newline at end of file diff --git a/hw2/hw/requirements.txt b/hw2/hw/requirements.txt index 89162f30..40f474bd 100644 --- a/hw2/hw/requirements.txt +++ b/hw2/hw/requirements.txt @@ -2,6 +2,9 @@ fastapi>=0.117.1 uvicorn>=0.24.0 prometheus-fastapi-instrumentator==6.1.0 +sqlalchemy==2.0.23 +pydantic==2.5.0 +psycopg2-binary==2.9.9 # Зависимости для тестирования pytest>=7.4.0 diff --git a/hw2/hw/run_scripts.bash b/hw2/hw/run_scripts.bash new file mode 100644 index 00000000..2e30c971 --- /dev/null +++ b/hw2/hw/run_scripts.bash @@ -0,0 +1,5 @@ +docker-compose up --build -d + +sleep 20 + +python3 scripts/isolation_demo.py \ No newline at end of file diff --git a/hw2/hw/scripts/dirty_read.py b/hw2/hw/scripts/dirty_read.py new file mode 100644 index 00000000..8032f4a3 --- /dev/null +++ b/hw2/hw/scripts/dirty_read.py @@ -0,0 +1,30 @@ +from sqlalchemy import create_engine, text +from sqlalchemy.orm import sessionmaker +import time + +engine = create_engine("postgresql://shop:shop@localhost:5432/shop") +Session = sessionmaker(bind=engine) + +s1 = Session() +s1.connection(execution_options={"isolation_level": "READ UNCOMMITTED"}) +s2 = Session() +s2.connection(execution_options={"isolation_level": "READ UNCOMMITTED"}) + +s1.execute(text("DELETE FROM items WHERE name LIKE 'dirty%'")) +s1.commit() + +print("DIRTY READ (READ UNCOMMITTED):") +s1.execute(text("BEGIN")) +s1.execute(text("INSERT INTO items (name, price) VALUES ('dirty_item', 999)")) +print("S1: inserted dirty_item") + +print("S2: sees uncommitted data?") +res = s2.execute(text("SELECT name FROM items WHERE name = 'dirty_item'")).fetchone() +print("S2 sees:", res) + +s1.rollback() +print("S1 rolled back") +res = s2.execute(text("SELECT name FROM items WHERE name = 'dirty_item'")).fetchone() +print("S2 after rollback sees:", res) + +s1.close(); s2.close() \ No newline at end of file diff --git a/hw2/hw/scripts/isolation_demo.py b/hw2/hw/scripts/isolation_demo.py new file mode 100644 index 00000000..f8d908c7 --- /dev/null +++ b/hw2/hw/scripts/isolation_demo.py @@ -0,0 +1,182 @@ +from sqlalchemy import create_engine, text +from sqlalchemy.orm import sessionmaker +import time +import threading + +engine = create_engine("postgresql://shop:shop@localhost:5432/shop") +Session = sessionmaker(bind=engine) + + +def cleanup(): + with engine.connect() as conn: + conn.execute(text("DELETE FROM items WHERE name LIKE 'demo_%'")) + conn.commit() + + +cleanup() + +print("=== ДЕМОНСТРАЦИЯ УРОВНЕЙ ИЗОЛЯЦИИ ===\n") + +print("1. DIRTY READ (READ UNCOMMITTED):") +s1 = Session() +s2 = Session() +s1.connection(execution_options={"isolation_level": "READ UNCOMMITTED"}) +s2.connection(execution_options={"isolation_level": "READ UNCOMMITTED"}) + +s1.execute(text("BEGIN")) +s1.execute(text("INSERT INTO items (name, price) VALUES ('demo_dirty', 999)")) +print(" S1: вставил demo_dirty (не закоммичено)") + +res = s2.execute(text("SELECT name FROM items WHERE name = 'demo_dirty'")).fetchone() +print(f" S2 (READ UNCOMMITTED): видит → {res}") + +s1.rollback() +print(" S1: откатил транзакцию") +s1.close() +s2.close() + + + + + + + +print("\n2. NO DIRTY READ (READ COMMITTED):") +s1 = Session() +s2 = Session() +s1.connection(execution_options={"isolation_level": "READ COMMITTED"}) +s2.connection(execution_options={"isolation_level": "READ COMMITTED"}) + +s1.execute(text("BEGIN")) +s1.execute(text("INSERT INTO items (name, price) VALUES ('demo_dirty2', 888)")) + +res = s2.execute(text("SELECT name FROM items WHERE name = 'demo_dirty2'")).fetchone() +print(f" S2 (READ COMMITTED): НЕ видит → {res}") + +s1.commit() +res = s2.execute(text("SELECT name FROM items WHERE name = 'demo_dirty2'")).fetchone() +print(f" S2 после COMMIT: видит → {res}") + +s1.close() +s2.close() + + + + + + +print("\n3. NON-REPEATABLE READ (READ COMMITTED):") +s1 = Session() +s2 = Session() +s1.connection(execution_options={"isolation_level": "READ COMMITTED"}) +s2.connection(execution_options={"isolation_level": "READ COMMITTED"}) + +with engine.connect() as conn: + conn.execute(text("DELETE FROM items WHERE name = 'demo_nr'")) + conn.commit() + +s1.execute(text("BEGIN")) +res1 = s1.execute(text("SELECT price FROM items WHERE name = 'demo_nr'")).fetchone() +print(f" S1: первый SELECT → {res1}") + +s2.execute(text("INSERT INTO items (name, price) VALUES ('demo_nr', 500)")) +s2.commit() +print(" S2: вставил demo_nr = 500") + +res2 = s1.execute(text("SELECT price FROM items WHERE name = 'demo_nr'")).fetchone() +print(f" S1: второй SELECT → {res2} ← НЕПОВТОРЯЕМОЕ ЧТЕНИЕ!") + +s1.rollback() +s1.close() +s2.close() + + + + + + +print("\n4. NO NON-REPEATABLE READ (REPEATABLE READ):") +s1 = Session() +s2 = Session() +s1.connection(execution_options={"isolation_level": "REPEATABLE READ"}) +s2.connection(execution_options={"isolation_level": "REPEATABLE READ"}) + +s1.execute(text("BEGIN")) +res1 = s1.execute(text("SELECT price FROM items WHERE name = 'demo_rr'")).fetchone() +print(f" S1: первый SELECT → {res1}") + +s2.execute(text("INSERT INTO items (name, price) VALUES ('demo_rr', 700)")) +s2.commit() +print(" S2: вставил demo_rr = 700") + +res2 = s1.execute(text("SELECT price FROM items WHERE name = 'demo_rr'")).fetchone() +print(f" S1: второй SELECT → {res2} ← ДАННЫЕ НЕ ИЗМЕНИЛИСЬ!") + +s1.rollback() +s1.close() +s2.close() + + + + + + +print("\n5. PHANTOM READ (REPEATABLE READ):") +s1 = Session() +s2 = Session() +s1.connection(execution_options={"isolation_level": "REPEATABLE READ"}) +s2.connection(execution_options={"isolation_level": "REPEATABLE READ"}) + +s1.execute(text("BEGIN")) +count1 = s1.execute(text("SELECT COUNT(*) FROM items WHERE price > 100")).fetchone()[0] +print(f" S1: первый COUNT(price > 100) → {count1}") + +s2.execute(text("INSERT INTO items (name, price) VALUES ('demo_p1', 200), ('demo_p2', 300)")) +s2.commit() +print(" S2: вставил 2 товара с price > 100") + +count2 = s1.execute(text("SELECT COUNT(*) FROM items WHERE price > 100")).fetchone()[0] +print(f" S1: второй COUNT → {count2} ← ФАНТОМНЫЕ СТРОКИ!") + +s1.rollback() +s1.close() +s2.close() + + + + + +print("\n6. NO PHANTOM READ (SERIALIZABLE):") +s1 = Session() +s2 = Session() +s1.connection(execution_options={"isolation_level": "SERIALIZABLE"}) +s2.connection(execution_options={"isolation_level": "SERIALIZABLE"}) + +s1.execute(text("BEGIN")) +count1 = s1.execute(text("SELECT COUNT(*) FROM items WHERE price > 100")).fetchone()[0] +print(f" S1: первый COUNT(price > 100) → {count1}") + + +def insert_phantom(): + time.sleep(1) + s2.execute(text("BEGIN")) + s2.execute(text("INSERT INTO items (name, price) VALUES ('demo_s1', 400), ('demo_s2', 500)")) + print(" S2: пытается вставить 2 товара...") + s2.commit() + print(" S2: успешно вставил") + + +thread = threading.Thread(target=insert_phantom) +thread.start() + +time.sleep(2) +count2 = s1.execute(text("SELECT COUNT(*) FROM items WHERE price > 100")).fetchone()[0] +print(f" S1: второй COUNT → {count2} ← ФАНТОМОВ НЕТ!") + +s1.rollback() +thread.join() +s1.close() +s2.close() + +print("\n=== ДЕМОНСТРАЦИЯ ЗАВЕРШЕНА ===") +cleanup() diff --git a/hw2/hw/scripts/non_repeatable_read.py b/hw2/hw/scripts/non_repeatable_read.py new file mode 100644 index 00000000..62225abe --- /dev/null +++ b/hw2/hw/scripts/non_repeatable_read.py @@ -0,0 +1,30 @@ +from sqlalchemy import create_engine, text +from sqlalchemy.orm import sessionmaker + +engine = create_engine("postgresql://shop:shop@localhost:5432/shop") +Session = sessionmaker(bind=engine) + +s1 = Session() +s2 = Session() + +s1.connection(execution_options={"isolation_level": "READ COMMITTED"}) +s2.connection(execution_options={"isolation_level": "READ COMMITTED"}) + +s1.execute(text("DELETE FROM items WHERE name = 'test_item'")) +s1.commit() + +print("\nNON-REPEATABLE READ (READ COMMITTED):") +print("S1: first read") +res1 = s1.execute(text("SELECT price FROM items WHERE name = 'test_item'")).fetchone() +print("S1 sees:", res1) + +s2.execute(text("INSERT INTO items (name, price) VALUES ('test_item', 100)")) +s2.commit() + +print("S2: inserted test_item with price 100") + +print("S1: second read in same transaction") +res2 = s1.execute(text("SELECT price FROM items WHERE name = 'test_item'")).fetchone() +print("S1 sees different value:", res2) # ← Non-repeatable! + +s1.close(); s2.close() \ No newline at end of file diff --git a/hw2/hw/scripts/phantom_read.py b/hw2/hw/scripts/phantom_read.py new file mode 100644 index 00000000..75c586e1 --- /dev/null +++ b/hw2/hw/scripts/phantom_read.py @@ -0,0 +1,31 @@ +from sqlalchemy import create_engine, text +from sqlalchemy.orm import sessionmaker +import time + +engine = create_engine("postgresql://shop:shop@localhost:5432/shop") +Session = sessionmaker(bind=engine) + +s1 = Session() +s2 = Session() + +s1.connection(execution_options={"isolation_level": "REPEATABLE READ"}) +s2.connection(execution_options={"isolation_level": "REPEATABLE READ"}) + +s1.execute(text("DELETE FROM items WHERE name LIKE 'phantom%'")) +s1.commit() + +print("\nPHANTOM READ (REPEATABLE READ):") +print("S1: first read") +res1 = s1.execute(text("SELECT COUNT(*) FROM items WHERE price > 50")).fetchone() +print("S1 sees count:", res1[0]) + +s2.execute(text("INSERT INTO items (name, price) VALUES ('phantom1', 100), ('phantom2', 200)")) +s2.commit() + +print("S2: inserted 2 items with price > 50") + +print("S1: second read in same transaction") +res2 = s1.execute(text("SELECT COUNT(*) FROM items WHERE price > 50")).fetchone() +print("S1 sees new rows (phantom):", res2[0]) + +s1.close(); s2.close() \ No newline at end of file diff --git a/hw2/hw/scripts_out.txt b/hw2/hw/scripts_out.txt new file mode 100644 index 00000000..e69de29b diff --git a/hw2/hw/shop_api/main.py b/hw2/hw/shop_api/main.py index 5fe2c5b0..7d9ba0a7 100644 --- a/hw2/hw/shop_api/main.py +++ b/hw2/hw/shop_api/main.py @@ -1,174 +1,228 @@ -from fastapi import FastAPI, HTTPException, Query -from pydantic import BaseModel, ValidationError +from fastapi import FastAPI, HTTPException, Query, Depends +from pydantic import BaseModel, Field from typing import List, Optional -from fastapi.responses import JSONResponse -from fastapi.exceptions import RequestValidationError -from fastapi import Request +from sqlalchemy import create_engine, Column, Integer, String, Float, Boolean, text +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, Session +from sqlalchemy.exc import IntegrityError from prometheus_fastapi_instrumentator import Instrumentator +import os + +DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://shop:shop@localhost:5432/shop") +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) +Base = declarative_base() + + +class ItemDB(Base): + __tablename__ = "items" + id = Column(Integer, primary_key=True, index=True) + name = Column(String, nullable=False) + price = Column(Float, nullable=False) + deleted = Column(Boolean, default=False) -app = FastAPI(title="Shop API") -instrumentator = Instrumentator().instrument(app).expose(app) +class CartDB(Base): + __tablename__ = "carts" + id = Column(Integer, primary_key=True, index=True) -items_db = {} -carts_db = {} -cart_counter = 0 -item_counter = 0 -class Item(BaseModel): +class CartItemDB(Base): + __tablename__ = "cart_items" + id = Column(Integer, primary_key=True, index=True) + cart_id = Column(Integer, nullable=False) + item_id = Column(Integer, nullable=False) + quantity = Column(Integer, default=1) + + +class ItemCreate(BaseModel): + name: str = Field(..., min_length=1) + price: float = Field(..., gt=0) + + +class Item(ItemCreate): id: int - name: str - price: float deleted: bool = False + class CartItem(BaseModel): id: int name: str quantity: int available: bool + class Cart(BaseModel): id: int - items: List[CartItem] - price: float + items: List[CartItem] = [] + price: float = 0.0 -class ItemCreate(BaseModel): - name: str - price: float -class ItemUpdate(BaseModel): - name: Optional[str] = None - price: Optional[float] = None +app = FastAPI(title="Shop API") +Instrumentator().instrument(app).expose(app) - class Config: - extra = "forbid" -@app.exception_handler(RequestValidationError) -async def validation_exception_handler(request: Request, exc: RequestValidationError): - return JSONResponse(status_code=422, content={"detail": exc.errors()}) +@app.on_event("startup") +def on_startup(): + Base.metadata.create_all(bind=engine) + + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + @app.post("/item", response_model=Item, status_code=201) -async def create_item(item: ItemCreate): - global item_counter - item_counter += 1 - new_item = Item(id=item_counter, name=item.name, price=item.price, deleted=False) - items_db[item_counter] = new_item - return new_item +def create_item(item: ItemCreate, db: Session = Depends(get_db)): + db_item = ItemDB(name=item.name, price=item.price) + db.add(db_item) + db.commit() + db.refresh(db_item) + return Item(id=db_item.id, **item.dict(), deleted=False) + @app.get("/item/{id}", response_model=Item) -async def get_item(id: int): - item = items_db.get(id) +def get_item(id: int, db: Session = Depends(get_db)): + item = db.get(ItemDB, id) if not item or item.deleted: - raise HTTPException(status_code=404, detail="Item not found") - return item + raise HTTPException(404, "Item not found") + return Item.from_orm(item) + @app.get("/item") -async def list_items( - offset: int = Query(0, ge=0), - limit: int = Query(10, ge=1), - min_price: Optional[float] = Query(None, ge=0), - max_price: Optional[float] = Query(None, ge=0), - show_deleted: bool = False +def list_items( + offset: int = Query(0, ge=0), + limit: int = Query(10, ge=1), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + show_deleted: bool = False, + db: Session = Depends(get_db) ): - filtered_items = list(items_db.values()) + query = db.query(ItemDB) if not show_deleted: - filtered_items = [item for item in filtered_items if not item.deleted] + query = query.filter(ItemDB.deleted == False) if min_price is not None: - filtered_items = [item for item in filtered_items if item.price >= min_price] + query = query.filter(ItemDB.price >= min_price) if max_price is not None: - filtered_items = [item for item in filtered_items if item.price <= max_price] - return filtered_items[offset:offset + limit] + query = query.filter(ItemDB.price <= max_price) + items = query.offset(offset).limit(limit).all() + return [Item.from_orm(i) for i in items] + @app.put("/item/{id}", response_model=Item) -async def update_item(id: int, item: ItemCreate): - if id not in items_db: - raise HTTPException(status_code=404, detail="Item not found") - updated_item = Item(id=id, name=item.name, price=item.price, deleted=items_db[id].deleted) - items_db[id] = updated_item - return updated_item +def update_item(id: int, item: ItemCreate, db: Session = Depends(get_db)): + db_item = db.get(ItemDB, id) + if not db_item: + raise HTTPException(404, "Item not found") + db_item.name = item.name + db_item.price = item.price + db.commit() + db.refresh(db_item) + return Item.from_orm(db_item) + @app.patch("/item/{id}", response_model=Item) -async def partial_update_item(id: int, item: ItemUpdate): - if id not in items_db: - raise HTTPException(status_code=404, detail="Item not found") - stored_item = items_db[id] - if stored_item.deleted: - raise HTTPException(status_code=304, detail="Item is deleted") - try: - update_data = item.model_dump(exclude_unset=True) - updated_item = stored_item.model_copy(update=update_data) - items_db[id] = updated_item - return updated_item - except ValidationError as e: - raise HTTPException(status_code=422, detail="Invalid fields in request") - -@app.delete("/item/{id}", response_model=dict) -async def delete_item(id: int): - if id not in items_db: - raise HTTPException(status_code=404, detail="Item not found") - items_db[id].deleted = True +def partial_update_item(id: int, item: dict, db: Session = Depends(get_db)): + db_item = db.get(ItemDB, id) + if not db_item: + raise HTTPException(404, "Item not found") + if db_item.deleted: + raise HTTPException(304, "Item is deleted") + for key, value in item.items(): + if key in ["name", "price"]: + setattr(db_item, key, value) + db.commit() + db.refresh(db_item) + return Item.from_orm(db_item) + + +@app.delete("/item/{id}") +def delete_item(id: int, db: Session = Depends(get_db)): + db_item = db.get(ItemDB, id) + if not db_item: + raise HTTPException(404, "Item not found") + db_item.deleted = True + db.commit() return {"status": "success"} -@app.post("/cart", response_model=dict, status_code=201) -async def create_cart(): - global cart_counter - cart_counter += 1 - carts_db[cart_counter] = Cart(id=cart_counter, items=[], price=0.0) + +@app.post("/cart", status_code=201) +def create_cart(db: Session = Depends(get_db)): + cart = CartDB() + db.add(cart) + db.commit() + db.refresh(cart) + from fastapi.responses import JSONResponse return JSONResponse( - content={"id": cart_counter}, - headers={"Location": f"/cart/{cart_counter}"}, - status_code=201 + content={"id": cart.id}, + headers={"Location": f"/cart/{cart.id}"} ) + @app.get("/cart/{id}", response_model=Cart) -async def get_cart(id: int): - cart = carts_db.get(id) +def get_cart(id: int, db: Session = Depends(get_db)): + cart = db.get(CartDB, id) if not cart: - raise HTTPException(status_code=404, detail="Cart not found") - return cart + raise HTTPException(404, "Cart not found") + + items = db.query(CartItemDB).filter(CartItemDB.cart_id == id).all() + total = 0.0 + cart_items = [] + for ci in items: + item = db.get(ItemDB, ci.item_id) + if item and not item.deleted: + cart_items.append(CartItem( + id=item.id, name=item.name, quantity=ci.quantity, available=True + )) + total += item.price * ci.quantity + else: + cart_items.append(CartItem( + id=ci.item_id, name="Unknown", quantity=ci.quantity, available=False + )) + return Cart(id=cart.id, items=cart_items, price=total) + @app.get("/cart") -async def list_carts( - offset: int = Query(0, ge=0), - limit: int = Query(10, ge=1), - min_price: Optional[float] = Query(None, ge=0), - max_price: Optional[float] = Query(None, ge=0), - min_quantity: Optional[int] = Query(None, ge=0), - max_quantity: Optional[int] = Query(None, ge=0) +def list_carts( + offset: int = Query(0, ge=0), + limit: int = Query(10, ge=1), + min_price: Optional[float] = None, + max_price: Optional[float] = None, + min_quantity: Optional[int] = None, + max_quantity: Optional[int] = None, + db: Session = Depends(get_db) ): - filtered_carts = list(carts_db.values()) + carts = db.query(CartDB).offset(offset).limit(limit).all() + result = [] + for cart in carts: + cart_data = get_cart(cart.id, db) + result.append(cart_data) if min_price is not None: - filtered_carts = [cart for cart in filtered_carts if cart.price >= min_price] + result = [c for c in result if c.price >= min_price] if max_price is not None: - filtered_carts = [cart for cart in filtered_carts if cart.price <= max_price] + result = [c for c in result if c.price <= max_price] if min_quantity is not None: - filtered_carts = [cart for cart in filtered_carts if sum(item.quantity for item in cart.items) >= min_quantity] + result = [c for c in result if sum(i.quantity for i in c.items) >= min_quantity] if max_quantity is not None: - filtered_carts = [cart for cart in filtered_carts if sum(item.quantity for item in cart.items) <= max_quantity] - return filtered_carts[offset:offset + limit] + result = [c for c in result if sum(i.quantity for i in c.items) <= max_quantity] + return result + @app.post("/cart/{cart_id}/add/{item_id}") -async def add_item_to_cart(cart_id: int, item_id: int): - if cart_id not in carts_db: - raise HTTPException(status_code=404, detail="Cart not found") - if item_id not in items_db: - raise HTTPException(status_code=404, detail="Item not found") - - cart = carts_db[cart_id] - item = items_db[item_id] - - for cart_item in cart.items: - if cart_item.id == item_id: - cart_item.quantity += 1 - cart.price += item.price - return {"status": "success"} - - cart_item = CartItem( - id=item.id, - name=item.name, - quantity=1, - available=not item.deleted - ) - cart.items.append(cart_item) - cart.price += item.price +def add_to_cart(cart_id: int, item_id: int, db: Session = Depends(get_db)): + cart = db.get(CartDB, cart_id) + item = db.get(ItemDB, item_id) + if not cart or not item: + raise HTTPException(404, "Not found") + + ci = db.query(CartItemDB).filter_by(cart_id=cart_id, item_id=item_id).first() + if ci: + ci.quantity += 1 + else: + ci = CartItemDB(cart_id=cart_id, item_id=item_id) + db.add(ci) + db.commit() return {"status": "success"} From 827fcfb47d7e835e9cfa305149e3be900ad901ef Mon Sep 17 00:00:00 2001 From: Gordei Vakhrushev <143230406+vakhrushevgp@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:44:42 +0300 Subject: [PATCH 5/7] Update requirements.txt --- hw2/hw/requirements.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hw2/hw/requirements.txt b/hw2/hw/requirements.txt index 40f474bd..01db03b6 100644 --- a/hw2/hw/requirements.txt +++ b/hw2/hw/requirements.txt @@ -1,9 +1,10 @@ # Основные зависимости для ASGI приложения -fastapi>=0.117.1 -uvicorn>=0.24.0 +fastapi==0.104.1 +uvicorn[standard]==0.24.0 prometheus-fastapi-instrumentator==6.1.0 +pydantic==2.5.3 +pydantic-core==2.14.6 sqlalchemy==2.0.23 -pydantic==2.5.0 psycopg2-binary==2.9.9 # Зависимости для тестирования From fb6d26a58df81baa20dbb2dc3630d21f9c1877c2 Mon Sep 17 00:00:00 2001 From: Gordei Vakhrushev <143230406+vakhrushevgp@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:52:05 +0300 Subject: [PATCH 6/7] import in function -> to other imports --- hw2/hw/shop_api/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw2/hw/shop_api/main.py b/hw2/hw/shop_api/main.py index 7d9ba0a7..99acb2e1 100644 --- a/hw2/hw/shop_api/main.py +++ b/hw2/hw/shop_api/main.py @@ -1,4 +1,5 @@ from fastapi import FastAPI, HTTPException, Query, Depends +from fastapi.responses import JSONResponse from pydantic import BaseModel, Field from typing import List, Optional from sqlalchemy import create_engine, Column, Integer, String, Float, Boolean, text @@ -155,7 +156,6 @@ def create_cart(db: Session = Depends(get_db)): db.add(cart) db.commit() db.refresh(cart) - from fastapi.responses import JSONResponse return JSONResponse( content={"id": cart.id}, headers={"Location": f"/cart/{cart.id}"} From 10618ba8a99ed98fce79c08f50d42e7174380e66 Mon Sep 17 00:00:00 2001 From: Gordei Vakhrushev <143230406+vakhrushevgp@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:59:43 +0300 Subject: [PATCH 7/7] fix bugs --- hw2/hw/shop_api/main.py | 50 +++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/hw2/hw/shop_api/main.py b/hw2/hw/shop_api/main.py index 99acb2e1..0586a10a 100644 --- a/hw2/hw/shop_api/main.py +++ b/hw2/hw/shop_api/main.py @@ -5,7 +5,6 @@ from sqlalchemy import create_engine, Column, Integer, String, Float, Boolean, text from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, Session -from sqlalchemy.exc import IntegrityError from prometheus_fastapi_instrumentator import Instrumentator import os @@ -59,11 +58,20 @@ class Cart(BaseModel): price: float = 0.0 -app = FastAPI(title="Shop API") -Instrumentator().instrument(app).expose(app) +fastapi_app = FastAPI(title="Shop API") +Instrumentator().instrument(fastapi_app).expose(fastapi_app) +from starlette.applications import Starlette +from starlette.routing import Mount -@app.on_event("startup") +app = Starlette( + routes=[ + Mount("/", app=fastapi_app) + ] +) + + +@fastapi_app.on_event("startup") def on_startup(): Base.metadata.create_all(bind=engine) @@ -76,7 +84,7 @@ def get_db(): db.close() -@app.post("/item", response_model=Item, status_code=201) +@fastapi_app.post("/item", response_model=Item, status_code=201) def create_item(item: ItemCreate, db: Session = Depends(get_db)): db_item = ItemDB(name=item.name, price=item.price) db.add(db_item) @@ -85,7 +93,7 @@ def create_item(item: ItemCreate, db: Session = Depends(get_db)): return Item(id=db_item.id, **item.dict(), deleted=False) -@app.get("/item/{id}", response_model=Item) +@fastapi_app.get("/item/{id}", response_model=Item) def get_item(id: int, db: Session = Depends(get_db)): item = db.get(ItemDB, id) if not item or item.deleted: @@ -93,27 +101,27 @@ def get_item(id: int, db: Session = Depends(get_db)): return Item.from_orm(item) -@app.get("/item") +@fastapi_app.get("/item") def list_items( offset: int = Query(0, ge=0), limit: int = Query(10, ge=1), - min_price: Optional[float] = Query(None, ge=0), - max_price: Optional[float] = Query(None, ge=0), + min_prices: Optional[float] = Query(None, ge=0), + max_prices: Optional[float] = Query(None, ge=0), show_deleted: bool = False, db: Session = Depends(get_db) ): query = db.query(ItemDB) if not show_deleted: query = query.filter(ItemDB.deleted == False) - if min_price is not None: - query = query.filter(ItemDB.price >= min_price) - if max_price is not None: - query = query.filter(ItemDB.price <= max_price) + if min_prices is not None: + query = query.filter(ItemDB.price >= min_prices) + if max_prices is not None: + query = query.filter(ItemDB.price <= max_prices) items = query.offset(offset).limit(limit).all() return [Item.from_orm(i) for i in items] -@app.put("/item/{id}", response_model=Item) +@fastapi_app.put("/item/{id}", response_model=Item) def update_item(id: int, item: ItemCreate, db: Session = Depends(get_db)): db_item = db.get(ItemDB, id) if not db_item: @@ -125,7 +133,7 @@ def update_item(id: int, item: ItemCreate, db: Session = Depends(get_db)): return Item.from_orm(db_item) -@app.patch("/item/{id}", response_model=Item) +@fastapi_app.patch("/item/{id}", response_model=Item) def partial_update_item(id: int, item: dict, db: Session = Depends(get_db)): db_item = db.get(ItemDB, id) if not db_item: @@ -140,7 +148,7 @@ def partial_update_item(id: int, item: dict, db: Session = Depends(get_db)): return Item.from_orm(db_item) -@app.delete("/item/{id}") +@fastapi_app.delete("/item/{id}") def delete_item(id: int, db: Session = Depends(get_db)): db_item = db.get(ItemDB, id) if not db_item: @@ -150,7 +158,7 @@ def delete_item(id: int, db: Session = Depends(get_db)): return {"status": "success"} -@app.post("/cart", status_code=201) +@fastapi_app.post("/cart", status_code=201) def create_cart(db: Session = Depends(get_db)): cart = CartDB() db.add(cart) @@ -162,12 +170,11 @@ def create_cart(db: Session = Depends(get_db)): ) -@app.get("/cart/{id}", response_model=Cart) +@fastapi_app.get("/cart/{id}", response_model=Cart) def get_cart(id: int, db: Session = Depends(get_db)): cart = db.get(CartDB, id) if not cart: raise HTTPException(404, "Cart not found") - items = db.query(CartItemDB).filter(CartItemDB.cart_id == id).all() total = 0.0 cart_items = [] @@ -185,7 +192,7 @@ def get_cart(id: int, db: Session = Depends(get_db)): return Cart(id=cart.id, items=cart_items, price=total) -@app.get("/cart") +@fastapi_app.get("/cart") def list_carts( offset: int = Query(0, ge=0), limit: int = Query(10, ge=1), @@ -211,13 +218,12 @@ def list_carts( return result -@app.post("/cart/{cart_id}/add/{item_id}") +@fastapi_app.post("/cart/{cart_id}/add/{item_id}") def add_to_cart(cart_id: int, item_id: int, db: Session = Depends(get_db)): cart = db.get(CartDB, cart_id) item = db.get(ItemDB, item_id) if not cart or not item: raise HTTPException(404, "Not found") - ci = db.query(CartItemDB).filter_by(cart_id=cart_id, item_id=item_id).first() if ci: ci.quantity += 1