chore: document project-wide soft delete pattern and add deleted_by column to all tables
This commit is contained in:
@@ -4,7 +4,7 @@ from typing import Annotated
|
||||
from datetime import datetime, timezone
|
||||
from fastapi import APIRouter, Request, Form
|
||||
from fastapi.responses import RedirectResponse, JSONResponse
|
||||
from devplacepy.database import get_table, db
|
||||
from devplacepy.database import get_table, db, _now_iso
|
||||
from devplacepy.utils import generate_uid, require_user
|
||||
from devplacepy.models import ReactionForm
|
||||
from devplacepy.services.audit import record as audit
|
||||
@@ -34,9 +34,17 @@ async def react(
|
||||
target_type=target_type,
|
||||
emoji=emoji,
|
||||
)
|
||||
if existing:
|
||||
reactions.delete(id=existing["id"])
|
||||
reaction_event = "reaction.remove"
|
||||
if existing and existing.get("deleted_at"):
|
||||
reactions.update(
|
||||
{"id": existing["id"], "deleted_at": None, "deleted_by": None}, ["id"]
|
||||
)
|
||||
added = True
|
||||
elif existing:
|
||||
reactions.update(
|
||||
{"id": existing["id"], "deleted_at": _now_iso(), "deleted_by": user["uid"]},
|
||||
["id"],
|
||||
)
|
||||
added = False
|
||||
else:
|
||||
reactions.insert(
|
||||
{
|
||||
@@ -46,9 +54,13 @@ async def react(
|
||||
"target_type": target_type,
|
||||
"emoji": emoji,
|
||||
"created_at": datetime.now(timezone.utc).isoformat(),
|
||||
"deleted_at": None,
|
||||
"deleted_by": None,
|
||||
}
|
||||
)
|
||||
reaction_event = "reaction.add"
|
||||
added = True
|
||||
|
||||
reaction_event = "reaction.add" if added else "reaction.remove"
|
||||
|
||||
audit.record(
|
||||
request,
|
||||
@@ -57,14 +69,14 @@ async def react(
|
||||
target_type=target_type,
|
||||
target_uid=target_uid,
|
||||
metadata={"emoji": emoji},
|
||||
summary=f"{user['username']} {'removed' if existing else 'added'} {emoji} on {target_type} {target_uid}",
|
||||
summary=f"{user['username']} {'added' if added else 'removed'} {emoji} on {target_type} {target_uid}",
|
||||
links=[audit.target(target_type, target_uid)],
|
||||
)
|
||||
|
||||
counts = {
|
||||
row["emoji"]: row["c"]
|
||||
for row in db.query(
|
||||
"SELECT emoji, COUNT(*) as c FROM reactions WHERE target_type=:tt AND target_uid=:tu GROUP BY emoji",
|
||||
"SELECT emoji, COUNT(*) as c FROM reactions WHERE target_type=:tt AND target_uid=:tu AND deleted_at IS NULL GROUP BY emoji",
|
||||
tt=target_type,
|
||||
tu=target_uid,
|
||||
)
|
||||
@@ -72,7 +84,10 @@ async def react(
|
||||
mine = [
|
||||
row["emoji"]
|
||||
for row in reactions.find(
|
||||
user_uid=user["uid"], target_uid=target_uid, target_type=target_type
|
||||
user_uid=user["uid"],
|
||||
target_uid=target_uid,
|
||||
target_type=target_type,
|
||||
deleted_at=None,
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user