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);