Hooray! Updates to updates!

This commit is contained in:
Yaro Kasear 2025-10-02 14:38:02 -05:00
parent 85b0e576c7
commit bcf14cf251
3 changed files with 106 additions and 33 deletions

View file

@ -649,15 +649,16 @@ class CRUDService(Generic[T]):
return rows
def create(self, data: dict, actor=None) -> T:
def create(self, data: dict, actor=None, *, commit: bool = True) -> T:
session = self.session
obj = self.model(**data)
session.add(obj)
session.commit()
self._log_version("create", obj, actor)
if commit:
session.commit()
self._log_version("create", obj, actor, commit=commit)
return obj
def update(self, id: int, data: dict, actor=None) -> T:
def update(self, id: int, data: dict, actor=None, *, commit: bool = True) -> T:
session = self.session
obj = session.get(self.model, id)
if not obj:
@ -695,7 +696,8 @@ class CRUDService(Generic[T]):
return obj
# Commit atomically
session.commit()
if commit:
session.commit()
# AFTER snapshot for audit
after = obj.as_dict()
@ -712,10 +714,10 @@ class CRUDService(Generic[T]):
return obj
# Log both what we *intended* and what *actually* happened
self._log_version("update", obj, actor, metadata={"diff": actual, "patch": patch})
self._log_version("update", obj, actor, metadata={"diff": actual, "patch": patch}, commit=commit)
return obj
def delete(self, id: int, hard: bool = False, actor = None):
def delete(self, id: int, hard: bool = False, actor = None, *, commit: bool = True):
session = self.session
obj = session.get(self.model, id)
if not obj:
@ -725,11 +727,12 @@ class CRUDService(Generic[T]):
else:
soft = cast(_SoftDeletable, obj)
soft.is_deleted = True
session.commit()
self._log_version("delete", obj, actor)
if commit:
session.commit()
self._log_version("delete", obj, actor, commit=commit)
return obj
def _log_version(self, change_type: str, obj: T, actor=None, metadata: dict | None = None):
def _log_version(self, change_type: str, obj: T, actor=None, metadata: dict | None = None, *, commit: bool = True):
session = self.session
try:
snapshot = {}
@ -747,7 +750,8 @@ class CRUDService(Generic[T]):
meta=to_jsonable(metadata) if metadata else None,
)
session.add(version)
session.commit()
if commit:
session.commit()
except Exception as e:
log.warning(f"Version logging failed for {self.model.__name__} id={getattr(obj, "id", "?")}: {str(e)}")
log.warning(f"Version logging failed for {self.model.__name__} id={getattr(obj, 'id', '?')}: {str(e)}")
session.rollback()