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_deleted(*conditions, ...)         # v0.2.1+ (koš)
await repo.count_deleted(*conditions)             # v0.2.1+
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.1.tar.gz (32.3 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.1-py3-none-any.whl (14.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: sysnet_soft_delete-0.2.1.tar.gz
  • Upload date:
  • Size: 32.3 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.1.tar.gz
Algorithm Hash digest
SHA256 c3a2dcbd1c38bde94629c3d5c8733d68fa029d12961fceabceb27f88d65e0bb1
MD5 6dc542ffa99476434802e5f25d0f235b
BLAKE2b-256 56a30838db1b8da60a6841e679dc4f800a630ac2e895ec636ae80be97354e0c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sysnet_soft_delete-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f18b7ad92a09d2791fcf20fff42a83a62b1188e0444c5bea98fc16afc86005ea
MD5 46e6402afa05ea051e22c506fa10db85
BLAKE2b-256 e2a0851a6f49e0d1430caca523a9127e48590cf2047d6a7d23a424792d759fdd

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