/
DisVic
/
task-tracker
Обзор
Документация
Войти
/
DisVic
/
task-tracker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/core/idempotency.py
41 строка
1 KB
DisappearedVictory
code done
27 дек 2025, 13:32
27 дек 2025, 13:32
213e05e
Код
Авторство
О чём код?
import hashlib, json from fastapi import HTTPException from sqlalchemy.orm import Session from app.models import IdempotencyKey def hash_payload(payload: dict) -> str: raw = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode("utf-8") return hashlib.sha256(raw).hexdigest() def idem_begin(db: Session, *, user_id: int, idem_key: str, request_hash: str): row = db.query(IdempotencyKey).filter( IdempotencyKey.user_id == user_id, IdempotencyKey.idem_key == idem_key, ).one_or_none() if row: if row.request_hash != request_hash: raise HTTPException(status_code=422, detail="Idempotency-Key already used with different payload") if row.state == "in_progress": raise HTTPException(status_code=409, detail="Request with this Idempotency-Key is still in progress") return ("replay", row.response_code, row.response_body) row = IdempotencyKey( user_id=user_id, idem_key=idem_key, request_hash=request_hash, state="in_progress", ) db.add(row) db.flush() return ("new", None, None) def idem_commit(db: Session, *, user_id: int, idem_key: str, code: int, body: dict): row = db.query(IdempotencyKey).filter( IdempotencyKey.user_id == user_id, IdempotencyKey.idem_key == idem_key, ).one() row.state = "completed" row.response_code = code row.response_body = body db.add(row)