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.
Metadata
Release files for sysnet-soft-delete 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| sysnet_soft_delete-0.2.1.tar.gz | 32.3 kB | Without provenance | Details for sysnet_soft_delete-0.2.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| sysnet_soft_delete-0.2.1-py3-none-any.whl | Python 3 | none | any | Details for sysnet_soft_delete-0.2.1-py3-none-any.whl |
Total release size: 47.1 kB
Release files / sysnet_soft_delete-0.2.1.tar.gz
| Download URL | sysnet_soft_delete-0.2.1.tar.gz |
|---|---|
| Size | 32.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c3a2dcbd1c38bde94629c3d5c8733d68fa029d12961fceabceb27f88d65e0bb1
|
|
BLAKE2b-256 checksum How to use checksums |
56a30838db1b8da60a6841e679dc4f800a630ac2e895ec636ae80be97354e0c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / sysnet_soft_delete-0.2.1-py3-none-any.whl
| Download URL | sysnet_soft_delete-0.2.1-py3-none-any.whl |
|---|---|
| Size | 14.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f18b7ad92a09d2791fcf20fff42a83a62b1188e0444c5bea98fc16afc86005ea
|
|
BLAKE2b-256 checksum How to use checksums |
e2a0851a6f49e0d1430caca523a9127e48590cf2047d6a7d23a424792d759fdd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Security for sysnet-soft-delete 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.