update: Add Global Search on Header, Add Global Audit log for all actions.

This commit is contained in:
2026-04-19 15:41:29 +03:00
parent 4f35bef6e3
commit 6a958a8d7d
27 changed files with 2086 additions and 267 deletions

View File

@@ -6,6 +6,7 @@ from auth.dependencies import require_permission
from auth.models import TokenPayload
from tickets import service
from tickets.models import TicketCreate, TicketUpdate, MessageCreate, EscalateIn, TicketOut, TicketListResponse
from shared.audit import log_action
router = APIRouter(prefix="/api/tickets", tags=["tickets"])
@@ -57,7 +58,10 @@ async def create_ticket(
db: AsyncSession = Depends(get_pg_session),
_user: TokenPayload = Depends(require_permission("crm", "add")),
):
return await service.create_ticket(db, body)
ticket = await service.create_ticket(db, body)
await log_action(db, _user.sub, _user.name or _user.email, "CREATE", "ticket",
str(ticket.id), ticket.subject)
return ticket
@router.patch("/{ticket_id}", response_model=TicketOut)
@@ -66,7 +70,11 @@ async def update_ticket(
db: AsyncSession = Depends(get_pg_session),
_user: TokenPayload = Depends(require_permission("crm", "edit")),
):
return await service.update_ticket(db, ticket_id, body)
ticket = await service.update_ticket(db, ticket_id, body)
action = "STATUS_CHANGE" if body.status is not None else "UPDATE"
await log_action(db, _user.sub, _user.name or _user.email, action, "ticket",
str(ticket_id), ticket.subject)
return ticket
@router.post("/{ticket_id}/messages", response_model=TicketOut)
@@ -75,7 +83,10 @@ async def add_message(
db: AsyncSession = Depends(get_pg_session),
_user: TokenPayload = Depends(require_permission("crm", "edit")),
):
return await service.add_message(db, ticket_id, body)
ticket = await service.add_message(db, ticket_id, body)
await log_action(db, _user.sub, _user.name or _user.email, "UPDATE", "ticket",
str(ticket_id), ticket.subject, meta={"action_detail": "message_added"})
return ticket
@router.post("/{ticket_id}/escalate", response_model=TicketOut)
@@ -84,4 +95,7 @@ async def escalate(
db: AsyncSession = Depends(get_pg_session),
_user: TokenPayload = Depends(require_permission("crm", "edit")),
):
return await service.escalate_to_issue(db, ticket_id, body.entry_id)
ticket = await service.escalate_to_issue(db, ticket_id, body.entry_id)
await log_action(db, _user.sub, _user.name or _user.email, "STATUS_CHANGE", "ticket",
str(ticket_id), ticket.subject, meta={"action_detail": "escalated_to_issue"})
return ticket