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
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:
SoftDeleteMixinmusí být předDocumentv 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c3a2dcbd1c38bde94629c3d5c8733d68fa029d12961fceabceb27f88d65e0bb1
|
|
| MD5 |
6dc542ffa99476434802e5f25d0f235b
|
|
| BLAKE2b-256 |
56a30838db1b8da60a6841e679dc4f800a630ac2e895ec636ae80be97354e0c8
|
File details
Details for the file sysnet_soft_delete-0.2.1-py3-none-any.whl.
File metadata
- Download URL: sysnet_soft_delete-0.2.1-py3-none-any.whl
- Upload date:
- Size: 14.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f18b7ad92a09d2791fcf20fff42a83a62b1188e0444c5bea98fc16afc86005ea
|
|
| MD5 |
46e6402afa05ea051e22c506fa10db85
|
|
| BLAKE2b-256 |
e2a0851a6f49e0d1430caca523a9127e48590cf2047d6a7d23a424792d759fdd
|