Skip to main content

Soft-delete mixin a repository pro Beanie ODM

Project description

sysnet-soft-delete

Sdílená knihovna poskytující konzistentní, bezpečný a snadno použitelný soft-delete mechanismus pro mikroservisy postavené na FastAPI + Beanie + MongoDB.

pip install sysnet-soft-delete

Python 3.10+ Beanie 2.x pymongo 4+ MongoDB 5+ asyncio

Tests mypy Typing

PyPI AGPLv3+


Dokumentace

Dokument Popis
Uživatelská příručka Instalace, API reference, příklady integrace s FastAPI, auditní logging
Technická dokumentace Architektura, designová rozhodnutí, testovací strategie, jak přispívat
Manažerský přehled Přínosy, rizika, roadmap, migrace
Changelog Historie verzí

Repozitář: github.com/sysnet-cz/sysnet-soft-delete


Problém, který knihovna řeší

Problém Řešení
Nekonzistentní filtrování is_deleted SoftDeleteRepository vynucuje filtr vždy
Opakovaný boilerplate kód Jeden mixin, jeden import
Chybějící audit (deleted_at, deleted_by) Součást mixinu, volitelný audit port
Riziko návratu smazaných dokumentů find_active() / get_active() jako primární API
Konflikty s unikátními indexy Vzor partialFilterExpression (viz dokumentace)

Rychlý start

1. Model

from beanie import Document
from sysnet_soft_delete import SoftDeleteMixin

class Article(SoftDeleteMixin, Document):
    title: str
    author: str

    class Settings:
        name = "articles"

Pořadí dědičnosti: SoftDeleteMixin musí být před Document v MRO.

2. Repository

from sysnet_soft_delete import SoftDeleteRepository

class ArticleRepository(SoftDeleteRepository[Article]):
    pass

repo = ArticleRepository(Article)

3. Použití

# Vytvoření
article = Article(title="Hello World", author="Jan")
await article.insert()

# Soft delete
await article.soft_delete(deleted_by="admin@example.com")
# article.is_deleted == True
# article.deleted_at  == datetime(...)
# article.deleted_by  == "admin@example.com"

# Dotazy — smazaný článek se neobjeví
active = await repo.find_active()                        # []
one    = await repo.get_active(article.id)               # None
one    = await repo.find_one_active({"author": "Jan"})   # None (smazaný)
count  = await repo.count_active()                       # 0

# Obnovení
await article.restore(restored_by="admin@example.com")
# article.is_deleted == False

# Explicitní opt-in pro smazané záznamy
all_docs = await repo.find_all_including_deleted()

API — přehled

SoftDeleteMixin

async def soft_delete(self, deleted_by: str | None = None) -> None
async def restore(self, restored_by: str | None = None) -> None

Pole: is_deleted: bool, deleted_at: datetime | None, deleted_by: str | None

SoftDeleteRepository[D]

await repo.find_active(*conditions, sort=None, limit=None, skip=None)
await repo.find_one_active(*conditions)          # v0.2.0+
await repo.get_active(document_id)
await repo.count_active(*conditions)
await repo.find_all_including_deleted(*conditions, ...)

Auditní port

from sysnet_soft_delete import configure_audit_logger

configure_audit_logger(SysnetAuditAdapter())  # volat jednou při startu

Adapter musí implementovat: async def log(action, entity, entity_id, actor, metadata, timestamp).

Výjimky

from sysnet_soft_delete import AlreadyDeletedException, NotDeletedException

Kompletní API reference → docs/user-guide.md


Verzování

Projekt dodržuje Semantic Versioning. AuditLogger Protocol je veřejné API — breaking změna = major verze.

Viz CHANGELOG.md pro historii změn.


Vývoj a testování

pip install -e ".[dev]"
pytest

Testy běží proti real MongoDB instanci (žádné mocky). Výchozí URL: mongodb://root:s3cr3t@localhost:27017. Přepíšete přes proměnnou prostředí:

TEST_MONGO_URL="mongodb://user:pass@host:27017" pytest

Licence

AGPLv3+ — SYSNET s.r.o.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sysnet_soft_delete-0.2.0.tar.gz (32.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sysnet_soft_delete-0.2.0-py3-none-any.whl (14.7 kB view details)

Uploaded Python 3

File details

Details for the file sysnet_soft_delete-0.2.0.tar.gz.

File metadata

  • Download URL: sysnet_soft_delete-0.2.0.tar.gz
  • Upload date:
  • Size: 32.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for sysnet_soft_delete-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a9129ca9516a7d068bbdb147a76f19f89efe7ae0d67024bb58407a289e19e87b
MD5 ed0c1397647615ffe36e81f1e2b84975
BLAKE2b-256 b0dfa80fe970d784d4a524741781f7922769da00b4269df3d635cc23de531bff

See more details on using hashes here.

File details

Details for the file sysnet_soft_delete-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for sysnet_soft_delete-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e7e6dc0af1c1a26e250f708d98b744a502e1b9cffa4a7255d400f0fa71f665c3
MD5 07cb180ee2d58f39df39d8316c6f81d4
BLAKE2b-256 f92ea8d525244b9320b5c8a6939615fa59b78a01a1ee75dc0c8f253fdc441f33

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page