Some checks are pending
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
P2-7 Sprint 8 пункт 1.
Backend:
- src/food-market.api/Realtime/NotificationsHub.cs — SignalR-хаб, группы
org:{orgId:N}. JWT через Authorization-хедер (стандартно) или через
query ?access_token=... (для WebSocket — браузерные не могут слать
кастомные хедеры). SuperAdmin override через ?orgOverride=<id>.
- NotificationsPublisher.cs — singleton, IHubContext-обёртка.
- Program.cs — AddSignalR + MapHub. Middleware копирует ?access_token=
в Authorization для /hubs/* до UseAuthentication.
- RetailSalesController.Post → публикует SalePosted + LowStockPayload
если после движения товара остаток < MinStock. Best-effort: notify
ошибка не валит транзакцию.
- SuppliesController.Post → SupplyPosted.
Events (camelCase в JSON):
- SalePosted { saleId, number, total, storeId, cashierName, retailPointId, postedAt }
- SupplyPosted { supplyId, number, total, supplierId, supplierName, postedAt }
- LowStock { productId, productName, storeId, storeName, quantity, minStock }
Web:
- @microsoft/signalr 10.0.0 client.
- src/lib/useNotificationsHub.ts — hook с автореконнектом, accessTokenFactory.
- DashboardPage:
• liveRevenueDelta / liveCountDelta — оптимистическое приращение
«Выручка сегодня» сразу при SalePosted (до refetch stats);
• toast.info на SupplyPosted; toast.error на LowStock;
• Wifi/WifiOff индикатор в header.
Тесты:
- SignalRNotificationsTests: A постит retail-sale → A получает SalePosted,
B (другая org) НЕ получает — multi-tenant. ✓ 1/1 локально.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
72 lines
3.8 KiB
XML
72 lines
3.8 KiB
XML
<Project>
|
|
<PropertyGroup>
|
|
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
|
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- ASP.NET Core 8 -->
|
|
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.11" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="8.0.11" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.SignalR" Version="1.2.0" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.11" />
|
|
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.9.0" />
|
|
|
|
<!-- EF Core 8 + PostgreSQL -->
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.11" />
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.11" />
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.11" />
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.11" />
|
|
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
|
|
|
|
<!-- OpenIddict 5 (aligned to .NET 8 LTS) -->
|
|
<PackageVersion Include="OpenIddict.AspNetCore" Version="5.8.0" />
|
|
<PackageVersion Include="OpenIddict.EntityFrameworkCore" Version="5.8.0" />
|
|
|
|
<!-- Identity -->
|
|
<PackageVersion Include="Microsoft.AspNetCore.Identity" Version="2.3.1" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.11" />
|
|
|
|
<!-- App services -->
|
|
<PackageVersion Include="CsvHelper" Version="33.0.1" />
|
|
<PackageVersion Include="ClosedXML" Version="0.104.2" />
|
|
<PackageVersion Include="MailKit" Version="4.10.0" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.DataProtection" Version="8.0.11" />
|
|
<PackageVersion Include="MediatR" Version="12.4.1" />
|
|
<PackageVersion Include="FluentValidation" Version="11.11.0" />
|
|
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="11.11.0" />
|
|
<PackageVersion Include="Mapster" Version="7.4.0" />
|
|
<PackageVersion Include="Mapster.DependencyInjection" Version="1.0.1" />
|
|
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.3" />
|
|
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
|
|
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" />
|
|
|
|
<!-- Background jobs -->
|
|
<PackageVersion Include="Hangfire.AspNetCore" Version="1.8.17" />
|
|
<PackageVersion Include="Hangfire.PostgreSql" Version="1.20.10" />
|
|
|
|
<!-- Observability / Prometheus -->
|
|
<PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" />
|
|
|
|
<!-- POS: local storage + API client -->
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.11" />
|
|
<PackageVersion Include="Refit" Version="7.2.22" />
|
|
<PackageVersion Include="Refit.HttpClientFactory" Version="7.2.22" />
|
|
<PackageVersion Include="Polly" Version="8.5.0" />
|
|
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
|
|
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
|
<PackageVersion Include="System.IO.Ports" Version="8.0.0" />
|
|
|
|
<!-- Testing -->
|
|
<PackageVersion Include="xunit" Version="2.9.3" />
|
|
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.1" />
|
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
|
|
<PackageVersion Include="FluentAssertions" Version="7.0.0" />
|
|
<PackageVersion Include="NSubstitute" Version="5.3.0" />
|
|
<PackageVersion Include="coverlet.collector" Version="6.0.3" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.11" />
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.11" />
|
|
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.1.0" />
|
|
</ItemGroup>
|
|
</Project>
|