diff --git a/.gitea/workflows/deploy_backend.yml b/.gitea/workflows/deploy_backend.yml index 5da8b86..481a034 100644 --- a/.gitea/workflows/deploy_backend.yml +++ b/.gitea/workflows/deploy_backend.yml @@ -25,7 +25,7 @@ jobs: run: dotnet restore backend/Tnsu.ApprovalRoute.sln - name: Publish (local) - run: dotnet publish backend/src/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj -c Release -o "$LOCAL_PUBLISH" + run: dotnet publish backend/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj -c Release -o "$LOCAL_PUBLISH" - name: Install cifs-utils run: | diff --git a/README.md b/README.md index 82c2206..05d4a9b 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,10 @@ backend/ Directory.Build.props # общие настройки таргета (net10.0, nullable, etc.) Directory.Packages.props # централизованные версии пакетов Tnsu.ApprovalRoute.sln - src/ - Tnsu.ApprovalRoute.Domain/ # сущности и enum'ы домена - Tnsu.ApprovalRoute.Application/ # сервисы, DTO, валидаторы - Tnsu.ApprovalRoute.Infrastructure/ # EF Core DbContext, миграции, клиент tnsu-portal - Tnsu.ApprovalRoute.Api/ # ASP.NET Core Controllers, Program.cs, авторизация + Tnsu.ApprovalRoute.Domain/ # сущности и enum'ы домена + Tnsu.ApprovalRoute.Application/ # сервисы, DTO, валидаторы + Tnsu.ApprovalRoute.Infrastructure/ # EF Core DbContext, миграции, клиент tnsu-portal + Tnsu.ApprovalRoute.Api/ # ASP.NET Core Controllers, Program.cs, авторизация tests/ Tnsu.ApprovalRoute.IntegrationTests/ frontend/ @@ -61,7 +60,7 @@ npm run build # heft test + package-solution --production ```bash cd backend -dotnet run --project src/Tnsu.ApprovalRoute.Api +dotnet run --project Tnsu.ApprovalRoute.Api ``` Требуется PostgreSQL (строка подключения — `ConnectionStrings:Postgres` в `appsettings.json`). diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Auth/AuthSchemes.cs b/backend/Tnsu.ApprovalRoute.Api/Auth/AuthSchemes.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Auth/AuthSchemes.cs rename to backend/Tnsu.ApprovalRoute.Api/Auth/AuthSchemes.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Auth/AuthSetup.cs b/backend/Tnsu.ApprovalRoute.Api/Auth/AuthSetup.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Auth/AuthSetup.cs rename to backend/Tnsu.ApprovalRoute.Api/Auth/AuthSetup.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Auth/CurrentUserAccessor.cs b/backend/Tnsu.ApprovalRoute.Api/Auth/CurrentUserAccessor.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Auth/CurrentUserAccessor.cs rename to backend/Tnsu.ApprovalRoute.Api/Auth/CurrentUserAccessor.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Auth/DevAuthHandler.cs b/backend/Tnsu.ApprovalRoute.Api/Auth/DevAuthHandler.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Auth/DevAuthHandler.cs rename to backend/Tnsu.ApprovalRoute.Api/Auth/DevAuthHandler.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Common/ApiResponse.cs b/backend/Tnsu.ApprovalRoute.Api/Common/ApiResponse.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Common/ApiResponse.cs rename to backend/Tnsu.ApprovalRoute.Api/Common/ApiResponse.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Common/ResultExtensions.cs b/backend/Tnsu.ApprovalRoute.Api/Common/ResultExtensions.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Common/ResultExtensions.cs rename to backend/Tnsu.ApprovalRoute.Api/Common/ResultExtensions.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Controllers/RequestTypesController.cs b/backend/Tnsu.ApprovalRoute.Api/Controllers/RequestTypesController.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Controllers/RequestTypesController.cs rename to backend/Tnsu.ApprovalRoute.Api/Controllers/RequestTypesController.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Controllers/TemplateRouteStepsController.cs b/backend/Tnsu.ApprovalRoute.Api/Controllers/TemplateRouteStepsController.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Controllers/TemplateRouteStepsController.cs rename to backend/Tnsu.ApprovalRoute.Api/Controllers/TemplateRouteStepsController.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Controllers/TemplateRoutesController.cs b/backend/Tnsu.ApprovalRoute.Api/Controllers/TemplateRoutesController.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Controllers/TemplateRoutesController.cs rename to backend/Tnsu.ApprovalRoute.Api/Controllers/TemplateRoutesController.cs diff --git a/backend/Tnsu.ApprovalRoute.Api/Dockerfile b/backend/Tnsu.ApprovalRoute.Api/Dockerfile new file mode 100644 index 0000000..d32c8de --- /dev/null +++ b/backend/Tnsu.ApprovalRoute.Api/Dockerfile @@ -0,0 +1,21 @@ +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +WORKDIR /src +COPY Directory.Build.props Directory.Packages.props ./ +COPY Tnsu.ApprovalRoute.Domain/Tnsu.ApprovalRoute.Domain.csproj Tnsu.ApprovalRoute.Domain/ +COPY Tnsu.ApprovalRoute.Application/Tnsu.ApprovalRoute.Application.csproj Tnsu.ApprovalRoute.Application/ +COPY Tnsu.ApprovalRoute.Infrastructure/Tnsu.ApprovalRoute.Infrastructure.csproj Tnsu.ApprovalRoute.Infrastructure/ +COPY Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj Tnsu.ApprovalRoute.Api/ +RUN dotnet restore Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj +COPY Tnsu.ApprovalRoute.Domain/ Tnsu.ApprovalRoute.Domain/ +COPY Tnsu.ApprovalRoute.Application/ Tnsu.ApprovalRoute.Application/ +COPY Tnsu.ApprovalRoute.Infrastructure/ Tnsu.ApprovalRoute.Infrastructure/ +COPY Tnsu.ApprovalRoute.Api/ Tnsu.ApprovalRoute.Api/ +RUN dotnet publish Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj -c Release -o /app/publish /p:UseAppHost=false + +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final +WORKDIR /app +RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* +COPY --from=build /app/publish . +ENV ASPNETCORE_URLS=http://+:8080 +EXPOSE 8080 +ENTRYPOINT ["dotnet", "Tnsu.ApprovalRoute.Api.dll"] diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Filters/ValidationActionFilter.cs b/backend/Tnsu.ApprovalRoute.Api/Filters/ValidationActionFilter.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Filters/ValidationActionFilter.cs rename to backend/Tnsu.ApprovalRoute.Api/Filters/ValidationActionFilter.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Program.cs b/backend/Tnsu.ApprovalRoute.Api/Program.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Program.cs rename to backend/Tnsu.ApprovalRoute.Api/Program.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Properties/launchSettings.json b/backend/Tnsu.ApprovalRoute.Api/Properties/launchSettings.json similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Properties/launchSettings.json rename to backend/Tnsu.ApprovalRoute.Api/Properties/launchSettings.json diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj b/backend/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj rename to backend/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj diff --git a/backend/src/Tnsu.ApprovalRoute.Api/appsettings.Development.json b/backend/Tnsu.ApprovalRoute.Api/appsettings.Development.json similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/appsettings.Development.json rename to backend/Tnsu.ApprovalRoute.Api/appsettings.Development.json diff --git a/backend/src/Tnsu.ApprovalRoute.Api/appsettings.json b/backend/Tnsu.ApprovalRoute.Api/appsettings.json similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Api/appsettings.json rename to backend/Tnsu.ApprovalRoute.Api/appsettings.json diff --git a/backend/src/Tnsu.ApprovalRoute.Application/ApplicationServiceCollectionExtensions.cs b/backend/Tnsu.ApprovalRoute.Application/ApplicationServiceCollectionExtensions.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/ApplicationServiceCollectionExtensions.cs rename to backend/Tnsu.ApprovalRoute.Application/ApplicationServiceCollectionExtensions.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/Common/Errors/Errors.cs b/backend/Tnsu.ApprovalRoute.Application/Common/Errors/Errors.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/Common/Errors/Errors.cs rename to backend/Tnsu.ApprovalRoute.Application/Common/Errors/Errors.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/Common/Interfaces/ICurrentUser.cs b/backend/Tnsu.ApprovalRoute.Application/Common/Interfaces/ICurrentUser.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/Common/Interfaces/ICurrentUser.cs rename to backend/Tnsu.ApprovalRoute.Application/Common/Interfaces/ICurrentUser.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeDto.cs b/backend/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeDto.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeDto.cs rename to backend/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeDto.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeService.cs b/backend/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeService.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeService.cs rename to backend/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeService.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeValidators.cs b/backend/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeValidators.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeValidators.cs rename to backend/Tnsu.ApprovalRoute.Application/RequestTypes/RequestTypeValidators.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepDto.cs b/backend/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepDto.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepDto.cs rename to backend/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepDto.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepService.cs b/backend/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepService.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepService.cs rename to backend/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepService.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepValidators.cs b/backend/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepValidators.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepValidators.cs rename to backend/Tnsu.ApprovalRoute.Application/TemplateRouteSteps/TemplateRouteStepValidators.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/ResolveTemplateRouteDto.cs b/backend/Tnsu.ApprovalRoute.Application/TemplateRoutes/ResolveTemplateRouteDto.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/ResolveTemplateRouteDto.cs rename to backend/Tnsu.ApprovalRoute.Application/TemplateRoutes/ResolveTemplateRouteDto.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteDto.cs b/backend/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteDto.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteDto.cs rename to backend/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteDto.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteService.cs b/backend/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteService.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteService.cs rename to backend/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteService.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteValidators.cs b/backend/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteValidators.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteValidators.cs rename to backend/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteValidators.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Application/Tnsu.ApprovalRoute.Application.csproj b/backend/Tnsu.ApprovalRoute.Application/Tnsu.ApprovalRoute.Application.csproj similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Application/Tnsu.ApprovalRoute.Application.csproj rename to backend/Tnsu.ApprovalRoute.Application/Tnsu.ApprovalRoute.Application.csproj diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Entities/RequestType.cs b/backend/Tnsu.ApprovalRoute.Domain/Entities/RequestType.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Domain/Entities/RequestType.cs rename to backend/Tnsu.ApprovalRoute.Domain/Entities/RequestType.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Entities/TemplateRoute.cs b/backend/Tnsu.ApprovalRoute.Domain/Entities/TemplateRoute.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Domain/Entities/TemplateRoute.cs rename to backend/Tnsu.ApprovalRoute.Domain/Entities/TemplateRoute.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Entities/TemplateRouteStep.cs b/backend/Tnsu.ApprovalRoute.Domain/Entities/TemplateRouteStep.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Domain/Entities/TemplateRouteStep.cs rename to backend/Tnsu.ApprovalRoute.Domain/Entities/TemplateRouteStep.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Enums/ComparisonOperator.cs b/backend/Tnsu.ApprovalRoute.Domain/Enums/ComparisonOperator.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Domain/Enums/ComparisonOperator.cs rename to backend/Tnsu.ApprovalRoute.Domain/Enums/ComparisonOperator.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Enums/HeadType.cs b/backend/Tnsu.ApprovalRoute.Domain/Enums/HeadType.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Domain/Enums/HeadType.cs rename to backend/Tnsu.ApprovalRoute.Domain/Enums/HeadType.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Enums/ProjectRole.cs b/backend/Tnsu.ApprovalRoute.Domain/Enums/ProjectRole.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Domain/Enums/ProjectRole.cs rename to backend/Tnsu.ApprovalRoute.Domain/Enums/ProjectRole.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Enums/RouteStepStatus.cs b/backend/Tnsu.ApprovalRoute.Domain/Enums/RouteStepStatus.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Domain/Enums/RouteStepStatus.cs rename to backend/Tnsu.ApprovalRoute.Domain/Enums/RouteStepStatus.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Tnsu.ApprovalRoute.Domain.csproj b/backend/Tnsu.ApprovalRoute.Domain/Tnsu.ApprovalRoute.Domain.csproj similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Domain/Tnsu.ApprovalRoute.Domain.csproj rename to backend/Tnsu.ApprovalRoute.Domain/Tnsu.ApprovalRoute.Domain.csproj diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/InfrastructureServiceCollectionExtensions.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/InfrastructureServiceCollectionExtensions.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/InfrastructureServiceCollectionExtensions.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/InfrastructureServiceCollectionExtensions.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/ApprovalRouteDbContext.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/ApprovalRouteDbContext.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/ApprovalRouteDbContext.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/ApprovalRouteDbContext.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/DatabaseMigrationInitializer.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/DatabaseMigrationInitializer.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/DatabaseMigrationInitializer.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/DatabaseMigrationInitializer.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260727103117_InitialCreate.Designer.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260727103117_InitialCreate.Designer.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260727103117_InitialCreate.Designer.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260727103117_InitialCreate.Designer.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260727103117_InitialCreate.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260727103117_InitialCreate.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260727103117_InitialCreate.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260727103117_InitialCreate.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731111928_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731111928_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731111928_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731111928_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731111928_AddRequestTypeListNameSectionAndStepConditionFields.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731111928_AddRequestTypeListNameSectionAndStepConditionFields.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731111928_AddRequestTypeListNameSectionAndStepConditionFields.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731111928_AddRequestTypeListNameSectionAndStepConditionFields.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260803110943_RenameRequestTypeListNameToListId.Designer.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260803110943_RenameRequestTypeListNameToListId.Designer.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260803110943_RenameRequestTypeListNameToListId.Designer.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260803110943_RenameRequestTypeListNameToListId.Designer.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260803110943_RenameRequestTypeListNameToListId.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260803110943_RenameRequestTypeListNameToListId.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260803110943_RenameRequestTypeListNameToListId.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260803110943_RenameRequestTypeListNameToListId.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Tnsu.ApprovalRoute.Infrastructure.csproj b/backend/Tnsu.ApprovalRoute.Infrastructure/Tnsu.ApprovalRoute.Infrastructure.csproj similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Tnsu.ApprovalRoute.Infrastructure.csproj rename to backend/Tnsu.ApprovalRoute.Infrastructure/Tnsu.ApprovalRoute.Infrastructure.csproj diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/HttpTnsuPortalClient.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/HttpTnsuPortalClient.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/HttpTnsuPortalClient.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/HttpTnsuPortalClient.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/ITnsuPortalClient.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/ITnsuPortalClient.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/ITnsuPortalClient.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/ITnsuPortalClient.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalDtos.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalDtos.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalDtos.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalDtos.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalOptions.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalOptions.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalOptions.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalOptions.cs diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalTokenProvider.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalTokenProvider.cs similarity index 100% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalTokenProvider.cs rename to backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalTokenProvider.cs diff --git a/backend/Tnsu.ApprovalRoute.sln b/backend/Tnsu.ApprovalRoute.sln index ee88a58..25d34e5 100644 --- a/backend/Tnsu.ApprovalRoute.sln +++ b/backend/Tnsu.ApprovalRoute.sln @@ -3,15 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tnsu.ApprovalRoute.Domain", "Tnsu.ApprovalRoute.Domain\Tnsu.ApprovalRoute.Domain.csproj", "{67C6FECB-26BF-4A7E-AC40-574F4D88EEAC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tnsu.ApprovalRoute.Domain", "src\Tnsu.ApprovalRoute.Domain\Tnsu.ApprovalRoute.Domain.csproj", "{67C6FECB-26BF-4A7E-AC40-574F4D88EEAC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tnsu.ApprovalRoute.Application", "Tnsu.ApprovalRoute.Application\Tnsu.ApprovalRoute.Application.csproj", "{2EEA333B-16C7-460E-BD07-AB1F32D6A9A9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tnsu.ApprovalRoute.Application", "src\Tnsu.ApprovalRoute.Application\Tnsu.ApprovalRoute.Application.csproj", "{2EEA333B-16C7-460E-BD07-AB1F32D6A9A9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tnsu.ApprovalRoute.Infrastructure", "Tnsu.ApprovalRoute.Infrastructure\Tnsu.ApprovalRoute.Infrastructure.csproj", "{46EF4247-8B98-4CC9-A981-186C8D24163C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tnsu.ApprovalRoute.Infrastructure", "src\Tnsu.ApprovalRoute.Infrastructure\Tnsu.ApprovalRoute.Infrastructure.csproj", "{46EF4247-8B98-4CC9-A981-186C8D24163C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tnsu.ApprovalRoute.Api", "src\Tnsu.ApprovalRoute.Api\Tnsu.ApprovalRoute.Api.csproj", "{4697B342-BE47-435B-B854-75F9277AD769}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tnsu.ApprovalRoute.Api", "Tnsu.ApprovalRoute.Api\Tnsu.ApprovalRoute.Api.csproj", "{4697B342-BE47-435B-B854-75F9277AD769}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" EndProject @@ -92,10 +90,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {67C6FECB-26BF-4A7E-AC40-574F4D88EEAC} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} - {2EEA333B-16C7-460E-BD07-AB1F32D6A9A9} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} - {46EF4247-8B98-4CC9-A981-186C8D24163C} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} - {4697B342-BE47-435B-B854-75F9277AD769} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} {F5E2BA0E-7978-414C-98D4-D3C91C162FDE} = {0AB3BF05-4346-4AA6-1389-037BE0695223} EndGlobalSection EndGlobal diff --git a/backend/src/.vs/VSWorkspaceState.json b/backend/src/.vs/VSWorkspaceState.json deleted file mode 100644 index a35ce30..0000000 --- a/backend/src/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ExpandedNodes": [ - "", - "\\Tnsu.ApprovalRoute.Api", - "\\Tnsu.ApprovalRoute.Application" - ], - "SelectedNode": "\\Tnsu.ApprovalRoute.Application", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/backend/src/.vs/slnx.sqlite b/backend/src/.vs/slnx.sqlite deleted file mode 100644 index 43f81fe..0000000 Binary files a/backend/src/.vs/slnx.sqlite and /dev/null differ diff --git a/backend/src/.vs/src.slnx/FileContentIndex/c41e12f7-4a3d-4c40-9653-41a24091003e.vsidx b/backend/src/.vs/src.slnx/FileContentIndex/c41e12f7-4a3d-4c40-9653-41a24091003e.vsidx deleted file mode 100644 index 78115d3..0000000 Binary files a/backend/src/.vs/src.slnx/FileContentIndex/c41e12f7-4a3d-4c40-9653-41a24091003e.vsidx and /dev/null differ diff --git a/backend/src/.vs/src.slnx/FileContentIndex/f9a35f81-13ae-4547-9684-90f51c188103.vsidx b/backend/src/.vs/src.slnx/FileContentIndex/f9a35f81-13ae-4547-9684-90f51c188103.vsidx deleted file mode 100644 index d4cbc0d..0000000 Binary files a/backend/src/.vs/src.slnx/FileContentIndex/f9a35f81-13ae-4547-9684-90f51c188103.vsidx and /dev/null differ diff --git a/backend/src/.vs/src.slnx/config/applicationhost.config b/backend/src/.vs/src.slnx/config/applicationhost.config deleted file mode 100644 index 223dc4c..0000000 --- a/backend/src/.vs/src.slnx/config/applicationhost.config +++ /dev/null @@ -1,1011 +0,0 @@ - - - - - - - - -
-
-
-
-
-
-
-
- - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- -
-
-
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/backend/src/.vs/src.slnx/v18/.wsuo b/backend/src/.vs/src.slnx/v18/.wsuo deleted file mode 100644 index 0476f63..0000000 Binary files a/backend/src/.vs/src.slnx/v18/.wsuo and /dev/null differ diff --git a/backend/src/.vs/src.slnx/v18/DocumentLayout.backup.json b/backend/src/.vs/src.slnx/v18/DocumentLayout.backup.json deleted file mode 100644 index 8712180..0000000 --- a/backend/src/.vs/src.slnx/v18/DocumentLayout.backup.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "Version": 1, - "WorkspaceRootPath": "C:\\Users\\trishina.mariya\\Documents\\Projects\\tnsu-approval-route\\backend\\src\\", - "Documents": [ - { - "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\trishina.mariya\\Documents\\Projects\\tnsu-approval-route\\backend\\src\\Tnsu.ApprovalRoute.Api\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", - "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Tnsu.ApprovalRoute.Api\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" - } - ], - "DocumentGroupContainers": [ - { - "Orientation": 0, - "VerticalTabListWidth": 256, - "DocumentGroups": [ - { - "DockedWidth": 200, - "SelectedChildIndex": 0, - "Children": [ - { - "$type": "Document", - "DocumentIndex": 0, - "Title": "appsettings.json", - "DocumentMoniker": "C:\\Users\\trishina.mariya\\Documents\\Projects\\tnsu-approval-route\\backend\\src\\Tnsu.ApprovalRoute.Api\\appsettings.json", - "RelativeDocumentMoniker": "Tnsu.ApprovalRoute.Api\\appsettings.json", - "ToolTip": "C:\\Users\\trishina.mariya\\Documents\\Projects\\tnsu-approval-route\\backend\\src\\Tnsu.ApprovalRoute.Api\\appsettings.json", - "RelativeToolTip": "Tnsu.ApprovalRoute.Api\\appsettings.json", - "ViewState": "AgIAAAAAAAAAAAAAAAAAABUAAAAXAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", - "WhenOpened": "2026-07-28T05:52:49.686Z", - "EditorCaption": "" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/backend/src/.vs/src.slnx/v18/DocumentLayout.json b/backend/src/.vs/src.slnx/v18/DocumentLayout.json deleted file mode 100644 index 8712180..0000000 --- a/backend/src/.vs/src.slnx/v18/DocumentLayout.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "Version": 1, - "WorkspaceRootPath": "C:\\Users\\trishina.mariya\\Documents\\Projects\\tnsu-approval-route\\backend\\src\\", - "Documents": [ - { - "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\trishina.mariya\\Documents\\Projects\\tnsu-approval-route\\backend\\src\\Tnsu.ApprovalRoute.Api\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", - "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Tnsu.ApprovalRoute.Api\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" - } - ], - "DocumentGroupContainers": [ - { - "Orientation": 0, - "VerticalTabListWidth": 256, - "DocumentGroups": [ - { - "DockedWidth": 200, - "SelectedChildIndex": 0, - "Children": [ - { - "$type": "Document", - "DocumentIndex": 0, - "Title": "appsettings.json", - "DocumentMoniker": "C:\\Users\\trishina.mariya\\Documents\\Projects\\tnsu-approval-route\\backend\\src\\Tnsu.ApprovalRoute.Api\\appsettings.json", - "RelativeDocumentMoniker": "Tnsu.ApprovalRoute.Api\\appsettings.json", - "ToolTip": "C:\\Users\\trishina.mariya\\Documents\\Projects\\tnsu-approval-route\\backend\\src\\Tnsu.ApprovalRoute.Api\\appsettings.json", - "RelativeToolTip": "Tnsu.ApprovalRoute.Api\\appsettings.json", - "ViewState": "AgIAAAAAAAAAAAAAAAAAABUAAAAXAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", - "WhenOpened": "2026-07-28T05:52:49.686Z", - "EditorCaption": "" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Dockerfile b/backend/src/Tnsu.ApprovalRoute.Api/Dockerfile deleted file mode 100644 index a9f4110..0000000 --- a/backend/src/Tnsu.ApprovalRoute.Api/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build -WORKDIR /src -COPY Directory.Build.props Directory.Packages.props ./ -COPY src/Tnsu.ApprovalRoute.Domain/Tnsu.ApprovalRoute.Domain.csproj src/Tnsu.ApprovalRoute.Domain/ -COPY src/Tnsu.ApprovalRoute.Application/Tnsu.ApprovalRoute.Application.csproj src/Tnsu.ApprovalRoute.Application/ -COPY src/Tnsu.ApprovalRoute.Infrastructure/Tnsu.ApprovalRoute.Infrastructure.csproj src/Tnsu.ApprovalRoute.Infrastructure/ -COPY src/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj src/Tnsu.ApprovalRoute.Api/ -RUN dotnet restore src/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj -COPY src/ src/ -RUN dotnet publish src/Tnsu.ApprovalRoute.Api/Tnsu.ApprovalRoute.Api.csproj -c Release -o /app/publish /p:UseAppHost=false - -FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final -WORKDIR /app -RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* -COPY --from=build /app/publish . -ENV ASPNETCORE_URLS=http://+:8080 -EXPOSE 8080 -ENTRYPOINT ["dotnet", "Tnsu.ApprovalRoute.Api.dll"] diff --git a/backend/tests/Tnsu.ApprovalRoute.IntegrationTests/Tnsu.ApprovalRoute.IntegrationTests.csproj b/backend/tests/Tnsu.ApprovalRoute.IntegrationTests/Tnsu.ApprovalRoute.IntegrationTests.csproj index 4b9680b..74da7e1 100644 --- a/backend/tests/Tnsu.ApprovalRoute.IntegrationTests/Tnsu.ApprovalRoute.IntegrationTests.csproj +++ b/backend/tests/Tnsu.ApprovalRoute.IntegrationTests/Tnsu.ApprovalRoute.IntegrationTests.csproj @@ -5,8 +5,8 @@ - - + + diff --git a/docker-compose.yml b/docker-compose.yml index a664dbb..8112d3c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: api: build: context: ./backend - dockerfile: src/Tnsu.ApprovalRoute.Api/Dockerfile + dockerfile: Tnsu.ApprovalRoute.Api/Dockerfile container_name: tnsu-approval-route-api restart: unless-stopped depends_on: diff --git a/frontend/src/webparts/approvalAdmin/components/ui/AsyncSearchableSelect.tsx b/frontend/src/webparts/approvalAdmin/components/ui/AsyncSearchableSelect.tsx index 85288c6..9a2e1b8 100644 --- a/frontend/src/webparts/approvalAdmin/components/ui/AsyncSearchableSelect.tsx +++ b/frontend/src/webparts/approvalAdmin/components/ui/AsyncSearchableSelect.tsx @@ -62,6 +62,12 @@ export function AsyncSearchableSelect({ // Растущий счётчик запросов: если ответ пришёл не от последнего запроса // (например, пользователь допечатал ещё символ) — просто игнорируем его. const requestIdRef = React.useRef(0); + // getValue нужен внутри runSearch (дедуп при доклейке страницы), но в deps его + // класть нельзя: пропс приходит инлайновой стрелкой и меняет ссылку на каждом + // рендере — runSearch пересоздавался бы постоянно и перезапускал эффект + // бесконечной прокрутки. Держим последнюю версию в ref. + const getValueRef = React.useRef(getValue); + getValueRef.current = getValue; const runSearch = React.useCallback((q: string, targetPage: number, append: boolean) => { const requestId = ++requestIdRef.current; @@ -71,7 +77,16 @@ export function AsyncSearchableSelect({ search(q, targetPage) .then(result => { if (requestIdRef.current !== requestId) return; // устарел - setItems(prev => (append ? [...prev, ...result.items] : result.items)); + // Дедуп при доклейке: соседние страницы могут пересекаться, если индекс + // переупорядочился между запросами (StartRow смещает окно по РАНГУ, а не + // по устойчивому курсору). Дубликат здесь = два пункта с одинаковым + // React-ключом, то есть заявка в списке дважды. Внутри одной страницы + // дубли отсекает уже источник (см. searchRequests в requestManageService). + setItems(prev => { + if (!append) return result.items; + const shown = new Set(prev.map(i => getValueRef.current(i))); + return [...prev, ...result.items.filter(i => !shown.has(getValueRef.current(i)))]; + }); setHasMore(result.hasMore); setPage(targetPage); }) diff --git a/frontend/src/webparts/approvalAdmin/services/api.ts b/frontend/src/webparts/approvalAdmin/services/api.ts index 2283beb..42a254f 100644 --- a/frontend/src/webparts/approvalAdmin/services/api.ts +++ b/frontend/src/webparts/approvalAdmin/services/api.ts @@ -17,7 +17,7 @@ import { } from '../models'; // Тонкий 1:1 фасад над контроллерами бэкенда: -// backend/src/Tnsu.ApprovalRoute.Api/Controllers/{RequestTypes,TemplateRoutes,TemplateRouteSteps}Controller.cs +// backend/Tnsu.ApprovalRoute.Api/Controllers/{RequestTypes,TemplateRoutes,TemplateRouteSteps}Controller.cs export class ApprovalRouteApi { constructor(private readonly http: IHttpClient) {} diff --git a/frontend/src/webparts/approvalAdmin/services/requestManageService.ts b/frontend/src/webparts/approvalAdmin/services/requestManageService.ts index d975c56..1254201 100644 --- a/frontend/src/webparts/approvalAdmin/services/requestManageService.ts +++ b/frontend/src/webparts/approvalAdmin/services/requestManageService.ts @@ -152,7 +152,22 @@ export class RequestManageService { }); const rawRows = (result.PrimarySearchResults ?? []) as Array<{ ListItemID?: string }>; - const ids = rawRows.map(r => Number(r.ListItemID)).filter(id => !isNaN(id) && id > 0); + // Дедуп по Id обязателен: TrimDuplicates: false выше выключает штатную + // дедупликацию Search (она иногда схлопывает нужные нам заявки), и тогда + // индекс может отдать один и тот же элемент несколькими хитами + // (переиндексация, несколько «версий» в crawl). Без этого фильтра хиты + // превращались в пункты комбобокса один-в-один, и заявка показывалась в + // списке дважды — с одинаковым React-ключом. Та же причина и то же лечение, + // что в request-portal (features/myRequests/myRequests.service.ts/hitsToEntries). + const seen = new Set(); + const ids = rawRows + .map(r => Number(r.ListItemID)) + .filter(id => !isNaN(id) && id > 0) + .filter(id => { + if (seen.has(id)) return false; + seen.add(id); + return true; + }); if (ids.length === 0) return { items: [], hasMore: false }; const list = sp.web.getList(requestType.listId);