From f34c05095ac9c9cd7369437eb864230796c636bd Mon Sep 17 00:00:00 2001 From: Kirill Date: Thu, 28 May 2026 21:46:17 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=8B=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/app/providers/SseProvider.tsx | 23 +- .../providers/__tests__/SseProvider.test.tsx | 12 +- .../order-detail/ui/OrderDetailContent.tsx | 2 +- .../ui/__tests__/OrderDetailContent.test.tsx | 33 + .../shared/constants/__tests__/order.test.ts | 17 + client/src/shared/constants/order.ts | 4 +- .../2026-05-28-orders-payments-audit.md | 60 ++ ...-28-project-audit-orders-implementation.md | 643 ++++++++++++++++++ .../2026-05-28-project-audit-orders-design.md | 138 ++++ server/prisma/prisma/dev.db | Bin 352256 -> 352256 bytes .../routes/api/__tests__/admin-orders.test.js | 118 ++++ server/src/routes/api/admin-orders.js | 7 + 12 files changed, 1039 insertions(+), 18 deletions(-) create mode 100644 client/src/shared/constants/__tests__/order.test.ts create mode 100644 docs/superpowers/audits/2026-05-28-orders-payments-audit.md create mode 100644 docs/superpowers/plans/2026-05-28-project-audit-orders-implementation.md create mode 100644 docs/superpowers/specs/2026-05-28-project-audit-orders-design.md create mode 100644 server/src/routes/api/__tests__/admin-orders.test.js diff --git a/client/src/app/providers/SseProvider.tsx b/client/src/app/providers/SseProvider.tsx index c0258ad..0d16a73 100644 --- a/client/src/app/providers/SseProvider.tsx +++ b/client/src/app/providers/SseProvider.tsx @@ -21,6 +21,14 @@ export function SseProvider() { const es = createEventStream(token) sourceRef.current = es + function invalidateOrderQueries(orderId: unknown) { + if (!orderId) return + queryClient.invalidateQueries({ queryKey: ['me', 'orders', orderId] }) + queryClient.invalidateQueries({ queryKey: ['admin', 'orders', 'detail', orderId] }) + queryClient.invalidateQueries({ queryKey: ['admin', 'orders'] }) + queryClient.invalidateQueries({ queryKey: ['admin', 'orders', 'summary'] }) + } + function handleEvent(eventName: string) { return function (event: MessageEvent) { try { @@ -31,22 +39,13 @@ export function SseProvider() { case 'message:new': queryClient.invalidateQueries({ queryKey: ['me', 'messages', 'unread-count'] }) queryClient.invalidateQueries({ queryKey: ['me', 'conversations'] }) - if (orderId) { - queryClient.invalidateQueries({ queryKey: ['me', 'orders', orderId] }) - queryClient.invalidateQueries({ queryKey: ['admin', 'orders', orderId] }) - } + invalidateOrderQueries(orderId) break case 'order:statusChanged': - if (orderId) { - queryClient.invalidateQueries({ queryKey: ['me', 'orders', orderId] }) - queryClient.invalidateQueries({ queryKey: ['admin', 'orders', orderId] }) - } + invalidateOrderQueries(orderId) break case 'order:updated': - if (orderId) { - queryClient.invalidateQueries({ queryKey: ['me', 'orders', orderId] }) - queryClient.invalidateQueries({ queryKey: ['admin', 'orders', orderId] }) - } + invalidateOrderQueries(orderId) break case 'order:new': queryClient.invalidateQueries({ queryKey: ['admin', 'orders', 'summary'] }) diff --git a/client/src/app/providers/__tests__/SseProvider.test.tsx b/client/src/app/providers/__tests__/SseProvider.test.tsx index c9f55c4..3da6488 100644 --- a/client/src/app/providers/__tests__/SseProvider.test.tsx +++ b/client/src/app/providers/__tests__/SseProvider.test.tsx @@ -108,7 +108,9 @@ describe('SseProvider', () => { expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'messages', 'unread-count'] }) expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'conversations'] }) expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'orders', 'o1'] }) - expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'o1'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'detail', 'o1'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'summary'] }) }) it('invalidates order queries on order:statusChanged', () => { @@ -117,7 +119,9 @@ describe('SseProvider', () => { const handler = mockEventHandlers['order:statusChanged'] handler(new MessageEvent('order:statusChanged', { data: JSON.stringify({ orderId: 'o2' }) })) expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'orders', 'o2'] }) - expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'o2'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'detail', 'o2'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'summary'] }) }) it('invalidates order queries on order:updated', () => { @@ -126,7 +130,9 @@ describe('SseProvider', () => { const handler = mockEventHandlers['order:updated'] handler(new MessageEvent('order:updated', { data: JSON.stringify({ orderId: 'o3' }) })) expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'orders', 'o3'] }) - expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'o3'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'detail', 'o3'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'summary'] }) }) it('invalidates admin queries on order:new', () => { diff --git a/client/src/features/order-detail/ui/OrderDetailContent.tsx b/client/src/features/order-detail/ui/OrderDetailContent.tsx index 357cfc1..ca19b9f 100644 --- a/client/src/features/order-detail/ui/OrderDetailContent.tsx +++ b/client/src/features/order-detail/ui/OrderDetailContent.tsx @@ -215,7 +215,7 @@ export function OrderDetailContent({ detail, orderId }: { detail: AdminOrderDeta /> ) return ( - + {isAdminMsg ? 'Админ (вы)' : 'Пользователь'} · {new Date(m.createdAt).toLocaleString()} diff --git a/client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx b/client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx index 9887403..385261f 100644 --- a/client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx +++ b/client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx @@ -1,3 +1,4 @@ +import type { ReactNode } from 'react' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' @@ -29,6 +30,12 @@ vi.mock('@/shared/ui/RichTextMessageEditor.lazy', () => ({ }) =>