diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 0000000..cdb3c8d --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "csharpier": { + "version": "1.2.5", + "commands": [ + "csharpier" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..66d2c07 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "deepscan.enable": true +} \ No newline at end of file diff --git a/Fengling.Refactory.Buiding.sln b/Fengling.Refactory.Buiding.sln new file mode 100644 index 0000000..7f8ceca --- /dev/null +++ b/Fengling.Refactory.Buiding.sln @@ -0,0 +1,39 @@ + +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}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YarpGateway", "src\YarpGateway\YarpGateway.csproj", "{8DDFE39A-06AE-4C02-BA80-27F0C809E959}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Debug|x64.ActiveCfg = Debug|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Debug|x64.Build.0 = Debug|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Debug|x86.ActiveCfg = Debug|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Debug|x86.Build.0 = Debug|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Release|Any CPU.Build.0 = Release|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Release|x64.ActiveCfg = Release|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Release|x64.Build.0 = Release|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Release|x86.ActiveCfg = Release|Any CPU + {8DDFE39A-06AE-4C02-BA80-27F0C809E959}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {8DDFE39A-06AE-4C02-BA80-27F0C809E959} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + EndGlobalSection +EndGlobal diff --git a/OpenCode.md b/OpenCode.md new file mode 100644 index 0000000..7097956 --- /dev/null +++ b/OpenCode.md @@ -0,0 +1,288 @@ +--- +# Fengling Project Rewrite - Conversation Summary +## Project Information +**Project Name**: Fengling (风灵) - QR Code Marketing Management Platform Rewrite +**Project Locations**: +- **Old Project**: `/Users/movingsam/Fengling.Refactory/` + - `Fengling.Backend.Web/` - Old monolithic backend + - `Yarp.Gateway/` - Old gateway (no longer relevant for reference) + +- **New Project**: `/Users/movingsam/Fengling.Refactory.Buiding/` + - `src/YarpGateway/` - New independent gateway service + - `src/YarpGateway.Admin/` - Vue3 admin UI +## What We Did +### Phase 1: Initial Gateway Setup +1. Created YARP Gateway backend with: + - YARP 2.2.0 (reverse proxy framework) + - EF Core 9.0.0 + PostgreSQL (192.168.100.10:5432) + - StackExchange.Redis (192.168.100.10:6379) for distributed locks + - Serilog for logging +2. Created Vue3 Admin frontend with: + - Vue 3 + TypeScript + Vite + Element Plus + Pinia + - Running on http://localhost:5173 +### Phase 2: Core Architecture Implementation +#### 1. Route Priority Design (99% Global + 1% Tenant-Specific) +**User's requirement**: +> "普通情况(租户走特定的实例(pod)只是特殊场景)所以是要对 前缀匹配到不同的服务这块的ui呢" +**Implementation**: +- Added `IsGlobal` boolean field to `GwTenantRoute` table +- Route priority: Tenant-specific routes > Global routes +- Database migration: `20260201133826_AddIsGlobalToTenantRoute` +**Benefit**: +- Before: 100 tenants × 10 services = 1000 route configurations +- After: 10 global routes + few tenant-specific routes +#### 2. In-Memory Route Caching +**File**: `src/YarpGateway/Services/RouteCache.cs` +- Loads routes from database at startup +- Priority-based lookup: tenant route → global route → 404 +- Hot reload support via `ReloadAsync()` +- Avoids database queries per request +#### 3. Redis Distributed Load Balancing +**File**: `src/YarpGateway/LoadBalancing/DistributedWeightedRoundRobinPolicy.cs` +- Implements weighted round-robin algorithm +- Uses Redis for distributed locks: `lock:{instanceName}:{clusterId}` +- Stores load balancing state in Redis: `lb:{instanceName}:{clusterId}:state` +- Supports multiple gateway instances +#### 4. Dynamic Proxy Configuration +**File**: `src/YarpGateway/DynamicProxy/DynamicProxyConfigProvider.cs` +- Implements `IProxyConfigProvider` +- Loads routes and clusters from database +- Provides configuration to YARP +#### 5. Tenant Routing Middleware +**File**: `src/YarpGateway/Middleware/TenantRoutingMiddleware.cs` +- Extracts tenant ID from JWT headers (`X-Tenant-Id`) +- Uses `RouteCache` to get route cluster +- Sets `context.Items["DynamicClusterId"]` for YARP +### Phase 3: Frontend Development +Created Vue3 admin pages: +1. **Dashboard.vue** - Statistics dashboard +2. **TenantList.vue** - Tenant management +3. **TenantRoutes.vue** - Tenant-specific routes +4. **GlobalRoutes.vue** - Global routes management (NEW) +5. **ClusterInstances.vue** - Service instance management +### Phase 4: Bug Fixes +1. Fixed 4K screen width constraints (removed max-width, added 100% width/height) +2. Fixed route `/tenants` not displaying until page refresh +3. Fixed CORS configuration (allowed origins: localhost:5173, 127.0.0.1:5173) +4. Fixed multiple compilation errors in `DistributedWeightedRoundRobinPolicy.cs`: + - Missing using statements + - JsonSerializer ambiguity (used full namespace) + - HashCode.Combine signature errors + - Typo: `M.achineName` → `MachineName` + - Changed `await using var` to `using var` +### Phase 5: Database Configuration +Applied database migration: +```bash +dotnet ef database update +``` +## Current Status +### ✅ Completed +1. Backend compiles successfully +2. Frontend runs on http://localhost:5173 +3. Database migrations applied +4. Global routes management UI created +5. Redis distributed load balancing implemented +6. In-memory route caching implemented +### ⚠️ Known Issue: YARP Dynamic Routing +**Problem**: +- Accessing `/api/product/test` returns 404 +- Logs show: "Request reached end of middleware pipeline" +- `DynamicProxyConfigProvider` is registered but not being used by YARP +**User's comment**: +> "你等下 下游的应用还没建立 肯定404吧" +> "你先把网关的ui更新一下功能呀。这个你先别急着测试吧" +**Conclusion**: The 404 is expected because downstream microservices don't exist yet. User wants to focus on UI updates and move to microservices analysis. +## Database Schema +### Tables +#### Tenants +```sql +Id: bigint (PK) +TenantCode: varchar(50) (unique) +TenantName: varchar(100) +Status: int (1=enabled, 0=disabled) +IsDeleted: boolean +CreatedTime, UpdatedTime, Version +``` +#### TenantRoutes +```sql +Id: bigint (PK) +TenantCode: varchar(50) (empty string = global route) +ServiceName: varchar(100) +ClusterId: varchar(100) +PathPattern: varchar(200) +Priority: int (0=global, 10=tenant) +Status: int +IsGlobal: boolean (NEW) +IsDeleted: boolean +CreatedTime, UpdatedTime, Version +``` +#### ServiceInstances +```sql +Id: bigint (PK) +ClusterId: varchar(100) +DestinationId: varchar(100) +Address: varchar(200) +Health: int (1=healthy) +Weight: int +Status: int +IsDeleted: boolean +CreatedTime, UpdatedTime, Version +``` +## Configuration +### Backend (appsettings.json) +```json +{ + "ConnectionStrings": { + "DefaultConnection": "Host=192.168.100.10;Port=5432;Database=fengling_gateway;Username=movingsam;Password=sl52788542" + }, + "Redis": { + "ConnectionString": "192.168.100.10:6379", + "Database": 0, + "InstanceName": "YarpGateway" + }, + "Cors": { + "AllowedOrigins": ["http://localhost:5173", "http://127.0.0.1:5173", "http://localhost:5174"], + "AllowAnyOrigin": false + }, + "ReverseProxy": { + "Routes": {}, + "Clusters": {} + } +} +``` +### Ports +- Frontend: http://localhost:5173 +- Backend: http://0.0.0.0:8080 +## API Endpoints +### Tenant Management +- `GET /api/gateway/tenants` - List tenants +- `POST /api/gateway/tenants` - Create tenant +- `DELETE /api/gateway/tenants/{id}` - Delete tenant +### Tenant Routes +- `GET /api/gateway/tenants/{tenantCode}/routes` - List tenant routes +- `POST /api/gateway/tenants/{tenantCode}/routes` - Create tenant route +### Global Routes +- `GET /api/gateway/routes/global` - List global routes +- `POST /api/gateway/routes/global` - Create global route +- `DELETE /api/gateway/routes/{id}` - Delete route +### Cluster Instances +- `GET /api/gateway/clusters/{clusterId}/instances` - List instances +- `POST /api/gateway/clusters/{clusterId}/instances` - Add instance +- `DELETE /api/gateway/instances/{id}` - Delete instance +### Configuration +- `POST /api/gateway/reload` - Reload configuration +## File Structure +``` +/Users/movingsam/Fengling.Refactory.Buiding/src/ +├── YarpGateway/ +│ ├── Config/ +│ │ ├── DatabaseRouteConfigProvider.cs +│ │ ├── DatabaseClusterConfigProvider.cs +│ │ ├── JwtConfig.cs +│ │ └── RedisConfig.cs +│ ├── Controllers/ +│ │ └── GatewayConfigController.cs +│ ├── Data/ +│ │ ├── GatewayDbContext.cs +│ │ └── GatewayDbContextFactory.cs +│ ├── DynamicProxy/ +│ │ └── DynamicProxyConfigProvider.cs +│ ├── LoadBalancing/ +│ │ └── DistributedWeightedRoundRobinPolicy.cs +│ ├── Middleware/ +│ │ ├── JwtTransformMiddleware.cs +│ │ └── TenantRoutingMiddleware.cs +│ ├── Models/ +│ │ ├── GwTenant.cs +│ │ ├── GwTenantRoute.cs +│ │ └── GwServiceInstance.cs +│ ├── Services/ +│ │ ├── RouteCache.cs +│ │ └── RedisConnectionManager.cs +│ ├── Migrations/ +│ │ ├── 20260201120312_InitialCreate.cs +│ │ └── 20260201133826_AddIsGlobalToTenantRoute.cs +│ ├── sql/ +│ │ └── init.sql +│ ├── Program.cs +│ └── appsettings.json +│ +└── YarpGateway.Admin/ + ├── src/ + │ ├── api/ + │ │ └── index.ts + │ ├── components/ + │ │ └── Layout.vue + │ ├── stores/ + │ │ └── tenant.ts + │ ├── views/ + │ │ ├── Dashboard.vue + │ │ ├── TenantList.vue + │ │ ├── TenantRoutes.vue + │ │ ├── GlobalRoutes.vue + │ │ └── ClusterInstances.vue + │ ├── router/ + │ │ └── index.ts + │ └── main.ts + └── package.json +``` +## What We're Doing Now +The user wants to stop working on the gateway routing issue and instead focus on: +1. Updating the gateway UI functionality (COMPLETED - GlobalRoutes.vue added) +2. Analyzing the old backend for microservices split +User's exact words: +> "你先把网关的ui更新一下功能呀。这个你先别急着测试吧" +> "我准备开始分析业务的微服务拆分了" +## Next Steps (For New Conversation) +### Immediate Priority: Microservices Analysis +**Task**: Analyze the old backend (`/Users/movingsam/Fengling.Refactory/Fengling.Backend.Web/`) to determine how to split it into microservices +**Known Old Backend Structure**: +``` +/Users/movingsam/Fengling.Refactory/Fengling.Backend.Web/src/src/ +├── account/ # Account module +├── activityplan/ # Activity planning +├── basis/ # Basic configuration +├── channel/ # Channel management +├── company/ # Company management +├── coupon/ # Coupon management +├── fieldConfig/ # Field configuration +├── flow/ # Workflow +├── gift/ # Gift management +├── integralConfig/ # Points configuration +├── member/ # Member management +├── promoter/ # Promoter management +├── qipei/ # Service matching +├── reports/ # Reports +├── riskManage/ # Risk management +└── [many more modules...] +``` +### Analysis Goals +1. Identify business domain boundaries +2. Determine which modules should become independent microservices +3. Design inter-service communication patterns +4. Plan database splitting strategy +5. Consider shared services (auth, configuration, etc.) +### Deferred Tasks (Lower Priority) +1. Fix YARP `DynamicProxyConfigProvider` to properly integrate with YARP +2. Test dynamic routing with actual downstream services +3. Complete deployment architecture (Docker, Kubernetes) +## Key Technical Decisions +### 1. Why Global Routes + Tenant-Specific Routes? +**Reason**: 99% of tenants share the same services, only 1% need dedicated instances +**Benefit**: Drastically reduces configuration complexity +### 2. Why YARP? +- Microsoft official support +- High performance (based on Kestrel) +- Extensible (custom load balancing policies) +- Dynamic configuration support +### 3. Why Redis? +- Distributed locks for multi-instance scenarios +- Persistent load balancing state +- High performance (millisecond response) +## Important Notes for Continuation +1. **Database Access**: PostgreSQL at 192.168.100.10:5432, Database: fengling_gateway +2. **Redis Access**: 192.168.100.10:6379 +3. **Project Location**: `/Users/movingsam/Fengling.Refactory.Buiding/` +4. **User Preference**: Manually handles database migrations (user applies SQL manually) +5. **Old Gateway**: User confirmed the old gateway at `/Users/movingsam/Fengling.Refactory/Yarp.Gateway/` is no longer relevant for reference +--- \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cf31a1c --- /dev/null +++ b/README.md @@ -0,0 +1,370 @@ +# YARP Gateway - 租户路由网关 + +基于YARP的租户感知API网关,支持JWT解析、动态租户路由、加权负载均衡。 + +## 功能特性 + +- ✅ JWT解析与Header传递 +- ✅ 基于租户的动态路由 +- ✅ 加权轮询负载均衡 +- ✅ PostgreSQL配置持久化 +- ✅ RESTful API管理接口 +- ✅ Docker Compose部署 +- ✅ Serilog结构化日志 +- ✅ Prometheus指标导出 + +## 架构设计 + +``` +客户端请求 → JWT解析中间件 → 租户路由中间件 → YARP网关 → 后端微服务 +``` + +### 路由流程 + +1. 客户端携带JWT访问 `/api/product/list` +2. JWT解析中间件提取租户ID(如 `customerA`) +3. 添加Header: `X-Tenant-Id: customerA` +4. 租户路由中间件根据路径提取服务名(`product`) +5. 动态构造Cluster ID: `customerA-product` +6. YARP将请求转发到该Cluster下的服务实例 +7. 加权轮询策略选择实例 + +## 快速开始 + +### 前置要求 + +- .NET 10 SDK +- PostgreSQL 16+ +- Docker & Docker Compose(可选) + +### 本地开发 + +1. **创建数据库** + +```bash +psql -h 192.168.100.10 -U postgres -c "CREATE DATABASE fengling_gateway;" +``` + +2. **执行迁移** + +```bash +psql -h 192.168.100.10 -U postgres -d fengling_gateway -f sql/init.sql +``` + +3. **运行网关** + +```bash +cd src/YarpGateway +dotnet run +``` + +4. **测试请求** + +```bash +# 生成测试JWT(需要配置Auth服务) +# 然后测试请求 +curl -H "Authorization: Bearer " \ + http://localhost:8080/api/product/list +``` + +### Docker部署 + +1. **启动所有服务** + +```bash +cd docker +docker-compose up -d +``` + +2. **查看日志** + +```bash +docker-compose logs -f gateway +``` + +3. **停止服务** + +```bash +docker-compose down +``` + +## API接口 + +### 租户管理 + +**获取所有租户** +```http +GET /api/gateway/tenants +``` + +**创建租户** +```http +POST /api/gateway/tenants +Content-Type: application/json + +{ + "tenantCode": "customerC", + "tenantName": "客户C" +} +``` + +**删除租户** +```http +DELETE /api/gateway/tenants/{id} +``` + +### 路由管理 + +**获取租户路由** +```http +GET /api/gateway/tenants/{tenantCode}/routes +``` + +**创建路由** +```http +POST /api/gateway/tenants/{tenantCode}/routes +Content-Type: application/json + +{ + "serviceName": "product", + "pathPattern": "/api/product/{**catch-all}" +} +``` + +**删除路由** +```http +DELETE /api/gateway/routes/{id} +``` + +### 服务实例管理 + +**获取实例列表** +```http +GET /api/gateway/clusters/{clusterId}/instances +``` + +**添加实例** +```http +POST /api/gateway/clusters/{clusterId}/instances +Content-Type: application/json + +{ + "destinationId": "product-3", + "address": "http://customerA-product-3:8001", + "weight": 2 +} +``` + +**删除实例** +```http +DELETE /api/gateway/instances/{id} +``` + +### 配置热更新 + +```http +POST /api/gateway/reload +``` + +## JWT格式要求 + +### 必需Claims + +```json +{ + "tenant": "customerA", + "sub": "123456", + "unique_name": "张三", + "role": ["admin", "user"] +} +``` + +### Header转换 + +JWT解析后,以下Header会自动添加到请求中: + +- `X-Tenant-Id`: 租户ID +- `X-User-Id`: 用户ID +- `X-User-Name`: 用户名 +- `X-Roles`: 角色列表(逗号分隔) + +## 负载均衡策略 + +### 加权轮询 (WeightedRoundRobin) + +权重高的实例获得更多流量分配。 + +**配置权重**: +```bash +POST /api/gateway/clusters/customerA-product/instances +{ + "destinationId": "product-1", + "address": "http://customerA-product-1:8001", + "weight": 10 # 权重10 +} +``` + +**默认权重**: 1 + +## 数据库表结构 + +### gw_tenant +租户基础信息表 + +| 字段 | 类型 | 说明 | +|------|------|------| +| Id | BIGINT | 主键 | +| TenantCode | VARCHAR(50) | 租户编码(唯一) | +| TenantName | VARCHAR(100) | 租户名称 | +| Status | INTEGER | 状态:1=启用 0=禁用 | + +### gw_tenant_route +租户服务路由配置表 + +| 字段 | 类型 | 说明 | +|------|------|------| +| Id | BIGINT | 主键 | +| TenantCode | VARCHAR(50) | 租户编码 | +| ServiceName | VARCHAR(100) | 服务名称 | +| ClusterId | VARCHAR(100) | YARP Cluster ID | +| PathPattern | VARCHAR(200) | 路径匹配模式 | + +### gw_service_instance +服务实例配置表 + +| 字段 | 类型 | 说明 | +|------|------|------| +| Id | BIGINT | 主键 | +| ClusterId | VARCHAR(100) | Cluster ID | +| DestinationId | VARCHAR(100) | Destination ID | +| Address | VARCHAR(200) | 服务地址 | +| Weight | INTEGER | 权重 | +| Health | INTEGER | 健康状态:1=健康 0=不健康 | + +## 监控和日志 + +### 日志位置 + +- **控制台**: 实时输出 +- **文件**: `logs/gateway-{Date}.log` + +### Prometheus指标 + +默认导出到 `/metrics` 端点(需添加 Prometheus 包) + +**可用指标**: +- `gateway_requests_total`: 请求总数(按租户、服务、状态码分组) +- `gateway_request_duration_seconds`: 请求耗时(按租户、服务分组) + +## 配置说明 + +### appsettings.json + +```json +{ + "ConnectionStrings": { + "DefaultConnection": "Host=postgres;Port=5432;Database=fengling_gateway;..." + }, + "Jwt": { + "Authority": "https://your-auth-server.com", + "Audience": "fengling-gateway" + }, + "ReverseProxy": { + "Routes": { "catch-all-route": { ... } }, + "Clusters": { "dynamic-cluster": { ... } } + }, + "Serilog": { ... } +} +``` + +### 环境变量 + +- `ConnectionStrings__DefaultConnection`: 数据库连接字符串 +- `Jwt__Authority`: JWT认证服务器地址 +- `Jwt__Audience`: JWT受众 + +## 性能调优 + +### 连接池配置 + +```csharp +services.AddDbContext(options => + options.UseNpgsql(connectionString, o => + { + o.CommandTimeout(30); + o.MaxBatchSize(100); + })); +``` + +### 日志级别优化 + +生产环境建议: +```json +{ + "Logging": { + "LogLevel": { + "Default": "Warning", + "Microsoft.AspNetCore": "Warning", + "Yarp.ReverseProxy": "Information" + } + } +} +``` + +## 故障排查 + +### 常见问题 + +**1. 路由404** +- 检查 `gw_tenant_route` 表是否有对应路由配置 +- 检查JWT中的tenant claim是否正确 + +**2. 数据库连接失败** +- 验证连接字符串是否正确 +- 检查PostgreSQL是否启动 +- 检查防火墙设置 + +**3. 负载均衡不均** +- 检查实例权重配置 +- 检查实例健康状态 + +## 项目结构 + +``` +src/YarpGateway/ +├── Config/ # 配置提供者 +│ ├── JwtConfig.cs +│ ├── DatabaseRouteConfigProvider.cs +│ └── DatabaseClusterConfigProvider.cs +├── Controllers/ # API控制器 +│ └── GatewayConfigController.cs +├── Data/ # 数据库上下文 +│ └── GatewayDbContext.cs +├── LoadBalancing/ # 负载均衡策略 +│ └── WeightedRoundRobinPolicy.cs +├── Middleware/ # 中间件 +│ ├── JwtTransformMiddleware.cs +│ └── TenantRoutingMiddleware.cs +├── Metrics/ # 监控指标 +│ └── GatewayMetrics.cs +├── Models/ # 数据模型 +│ ├── GwTenant.cs +│ ├── GwTenantRoute.cs +│ └── GwServiceInstance.cs +├── appsettings.json +├── Dockerfile +└── Program.cs +``` + +## 开发计划 + +- [ ] 添加Prometheus指标导出 +- [ ] 实现Vue3管理界面 +- [ ] 添加限流策略 +- [ ] 添加熔断机制 +- [ ] 实现配置中心集成 +- [ ] 添加服务发现集成 + +## 许可证 + +MIT License diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..cf4b02d --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,20 @@ +version: '3.8' + +services: + gateway: + build: ./src/YarpGateway + container_name: fengling-gateway + ports: + - "8080:8080" + environment: + - ConnectionStrings__DefaultConnection=Host=192.168.100.10;Port=5432;Database=fengling_gateway;Username=postgres;Password=postgres + - Jwt__Authority=https://your-auth-server.com + volumes: + - ./logs:/app/logs + networks: + - fengling-network + restart: unless-stopped + +networks: + fengling-network: + driver: bridge diff --git a/docs/plans/2025-02-01-auth-service.md b/docs/plans/2025-02-01-auth-service.md new file mode 100644 index 0000000..fbdcf81 --- /dev/null +++ b/docs/plans/2025-02-01-auth-service.md @@ -0,0 +1,1023 @@ +# Authentication Service Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Build a standalone authentication service using OpenIddict to handle user authentication, JWT token issuance, and multi-tenant support. + +**Architecture:** ASP.NET Core Web API with OpenIddict for OAuth2/OIDC support, PostgreSQL for user/role data, JWT tokens with embedded TenantId for multi-tenant isolation. + +**Tech Stack:** +- .NET 9.0 / ASP.NET Core +- OpenIddict 5.x +- Entity Framework Core 9.0 +- PostgreSQL +- Serilog +- OpenTelemetry + +--- + +## Task 1: Create Project Structure + +**Files:** +- Create: `src/Fengling.AuthService/Fengling.AuthService.csproj` +- Create: `src/Fengling.AuthService/Program.cs` +- Create: `src/Fengling.AuthService/appsettings.json` + +**Step 1: Create project file** + +Run: +```bash +cd /Users/movingsam/Fengling.Refactory.Buiding/src +dotnet new webapi -n Fengling.AuthService -o Fengling.AuthService +``` + +**Step 2: Update project file with dependencies** + +Edit: `src/Fengling.AuthService/Fengling.AuthService.csproj` + +```xml + + + net9.0 + enable + enable + + + + + + + + + + + + + + + +``` + +**Step 3: Create appsettings.json** + +Create: `src/Fengling.AuthService/appsettings.json` + +```json +{ + "ConnectionStrings": { + "DefaultConnection": "Host=192.168.100.10;Port=5432;Database=fengling_auth;Username=movingsam;Password=sl52788542" + }, + "OpenIddict": { + "Issuer": "https://auth.fengling.local", + "Audience": "fengling-api" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} +``` + +**Step 4: Commit** + +```bash +git add src/Fengling.AuthService/ +git commit -m "feat(auth): create authentication service project structure" +``` + +--- + +## Task 2: Create Database Models + +**Files:** +- Create: `src/Fengling.AuthService/Data/ApplicationDbContext.cs` +- Create: `src/Fengling.AuthService/Models/ApplicationUser.cs` +- Create: `src/Fengling.AuthService/Models/ApplicationRole.cs` +- Create: `src/Fengling.AuthService/Data/Migrations/20250201_InitialCreate.cs` + +**Step 1: Create ApplicationUser model** + +Create: `src/Fengling.AuthService/Models/ApplicationUser.cs` + +```csharp +using Microsoft.AspNetCore.Identity; + +namespace Fengling.AuthService.Models; + +public class ApplicationUser : IdentityUser +{ + public string? RealName { get; set; } + public string? Phone { get; set; } + public long TenantId { get; set; } + public DateTime CreatedTime { get; set; } = DateTime.UtcNow; + public DateTime? UpdatedTime { get; set; } + public bool IsDeleted { get; set; } +} +``` + +**Step 2: Create ApplicationRole model** + +Create: `src/Fengling.AuthService/Models/ApplicationRole.cs` + +```csharp +using Microsoft.AspNetCore.Identity; + +namespace Fengling.AuthService.Models; + +public class ApplicationRole : IdentityRole +{ + public string? Description { get; set; } + public DateTime CreatedTime { get; set; } = DateTime.UtcNow; +} +``` + +**Step 3: Create ApplicationDbContext** + +Create: `src/Fengling.AuthService/Data/ApplicationDbContext.cs` + +```csharp +using Fengling.AuthService.Models; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; + +namespace Fengling.AuthService.Data; + +public class ApplicationDbContext : IdentityDbContext +{ + public ApplicationDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + builder.Entity(entity => + { + entity.Property(e => e.RealName).HasMaxLength(100); + entity.Property(e => e.Phone).HasMaxLength(20); + entity.HasIndex(e => e.TenantId); + entity.HasIndex(e => e.Phone).IsUnique(); + }); + + builder.Entity(entity => + { + entity.Property(e => e.Description).HasMaxLength(200); + }); + } +} +``` + +**Step 4: Add migration** + +Run: +```bash +cd /Users/movingsam/Fengling.Refactory.Buiding/src/Fengling.AuthService +dotnet ef migrations add InitialCreate -o Data/Migrations +``` + +**Step 5: Update database** + +Run: +```bash +dotnet ef database update +``` + +**Step 6: Commit** + +```bash +git add src/Fengling.AuthService/Models/ src/Fengling.AuthService/Data/ +git commit -m "feat(auth): add user and role models with EF Core migrations" +``` + +--- + +## Task 3: Configure OpenIddict + +**Files:** +- Create: `src/Fengling.AuthService/Configuration/OpenIddictSetup.cs` +- Modify: `src/Fengling.AuthService/Program.cs` + +**Step 1: Create OpenIddict configuration** + +Create: `src/Fengling.AuthService/Configuration/OpenIddictSetup.cs` + +```csharp +using Microsoft.Extensions.DependencyInjection; +using OpenIddict.Validation.AspNetCore; + +namespace Fengling.AuthService.Configuration; + +public static class OpenIddictSetup +{ + public static IServiceCollection AddOpenIddictConfiguration(this IServiceCollection services, IConfiguration configuration) + { + services.AddOpenIddict() + .AddCore(options => + { + options.UseEntityFrameworkCore() + .UseDbContext(); + }) + .AddServer(options => + { + options.SetIssuer(configuration["OpenIddict:Issuer"] ?? "https://auth.fengling.local"); + options.AddSigningKey(new SymmetricSecurityKey( + System.Text.Encoding.UTF8.GetBytes("fengling-super-secret-key-for-dev-only-change-in-prod-please!!!"))); + + options.AllowAuthorizationCodeFlow() + .AllowPasswordFlow() + .AllowRefreshTokenFlow() + .RequireProofKeyForCodeExchange(); + + options.RegisterScopes("api", "offline_access"); + + options.AddDevelopmentEncryptionCertificate() + .AddDevelopmentSigningCertificate(); + + options.UseAspNetCore() + .EnableAuthorizationEndpointPassThrough() + .EnableTokenEndpointPassThrough() + .EnableLogoutEndpointPassThrough(); + }) + .AddValidation(options => + { + options.UseLocalServer(); + options.UseAspNetCore(); + }); + + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme; + }); + + return services; + } +} +``` + +**Step 2: Update Program.cs with OpenIddict and EF Core** + +Edit: `src/Fengling.AuthService/Program.cs` + +```csharp +using Fengling.AuthService.Configuration; +using Fengling.AuthService.Data; +using Fengling.AuthService.Models; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Microsoft.OpenApi.Models; +using OpenTelemetry; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; +using Serilog; + +var builder = WebApplication.CreateBuilder(args); + +// Serilog +Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(builder.Configuration) + .Enrich.FromLogContext() + .WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}") + .CreateLogger(); + +builder.Host.UseSerilog(); + +// Database +builder.Services.AddDbContext(options => + options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); + +// Identity +builder.Services.AddIdentity() + .AddEntityFrameworkStores() + .AddDefaultTokenProviders(); + +// OpenIddict +builder.Services.AddOpenIddictConfiguration(builder.Configuration); + +// OpenTelemetry +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService("Fengling.AuthService")) + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddSource("OpenIddict.Server.AspNetCore") + .AddOtlpExporter(); + +// Controllers +builder.Services.AddControllers(); + +// Swagger +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(options => +{ + options.SwaggerDoc("v1", new OpenApiInfo + { + Title = "Fengling Auth Service", + Version = "v1", + Description = "Authentication and authorization service using OpenIddict" + }); + + options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme + { + Type = SecuritySchemeType.OAuth2, + Flows = new OpenApiOAuthFlows + { + Password = new OpenApiOAuthFlow + { + TokenUrl = "/connect/token" + } + } + }); +}); + +var app = builder.Build(); + +// Configure pipeline +app.UseSwagger(); +app.UseSwaggerUI(options => +{ + options.SwaggerEndpoint("/swagger/v1/swagger.json", "Fengling Auth Service v1"); + options.OAuthClientId("swagger-ui"); + options.OAuthUsePkce(); +}); + +app.UseRouting(); +app.UseAuthentication(); +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); +``` + +**Step 3: Run to verify startup** + +Run: +```bash +dotnet run +``` +Expected: Service starts without errors, Swagger UI available at http://localhost:5000/swagger + +**Step 4: Commit** + +```bash +git add src/Fengling.AuthService/Configuration/ src/Fengling.AuthService/Program.cs +git commit -m "feat(auth): configure OpenIddict with JWT and OAuth2 support" +``` + +--- + +## Task 4: Create Auth Controller + +**Files:** +- Create: `src/Fengling.AuthService/Controllers/AuthController.cs` +- Create: `src/Fengling.AuthService/DTOs/LoginRequest.cs` +- Create: `src/Fengling.AuthService/DTOs/LoginResponse.cs` +- Create: `src/Fengling.AuthService/DTOs/TokenResponse.cs` + +**Step 1: Create DTOs** + +Create: `src/Fengling.AuthService/DTOs/LoginRequest.cs` + +```csharp +namespace Fengling.AuthService.DTOs; + +public class LoginRequest +{ + public string UserName { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public long TenantId { get; set; } +} +``` + +Create: `src/Fengling.AuthService/DTOs/LoginResponse.cs` + +```csharp +namespace Fengling.AuthService.DTOs; + +public class LoginResponse +{ + public string AccessToken { get; set; } = string.Empty; + public string RefreshToken { get; set; } = string.Empty; + public int ExpiresIn { get; set; } + public string TokenType { get; set; } = "Bearer"; +} +``` + +**Step 2: Create AuthController** + +Create: `src/Fengling.AuthService/Controllers/AuthController.cs` + +```csharp +using Fengling.AuthService.DTOs; +using Fengling.AuthService.Models; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using OpenIddict.Abstractions; +using OpenIddict.Server.AspNetCore; +using static OpenIddict.Abstractions.OpenIddictConstants; + +namespace Fengling.AuthService.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class AuthController : ControllerBase +{ + private readonly SignInManager _signInManager; + private readonly UserManager _userManager; + private readonly IOpenIddictApplicationManager _applicationManager; + private readonly IOpenIddictAuthorizationManager _authorizationManager; + private readonly IOpenIddictScopeManager _scopeManager; + private readonly ILogger _logger; + + public AuthController( + SignInManager signInManager, + UserManager userManager, + IOpenIddictApplicationManager applicationManager, + IOpenIddictAuthorizationManager authorizationManager, + IOpenIddictScopeManager scopeManager, + ILogger logger) + { + _signInManager = signInManager; + _userManager = userManager; + _applicationManager = applicationManager; + _authorizationManager = authorizationManager; + _scopeManager = scopeManager; + _logger = logger; + } + + [HttpPost("login")] + public async Task Login([FromBody] LoginRequest request) + { + var user = await _userManager.FindByNameAsync(request.UserName); + if (user == null || user.IsDeleted) + { + return Unauthorized(new { error = "用户不存在" }); + } + + if (user.TenantId != request.TenantId) + { + return Unauthorized(new { error = "租户不匹配" }); + } + + var result = await _signInManager.CheckPasswordSignInAsync(user, request.Password, false); + if (!result.Succeeded) + { + return Unauthorized(new { error = "用户名或密码错误" }); + } + + var token = await GenerateTokenAsync(user); + return Ok(token); + } + + private async Task GenerateTokenAsync(ApplicationUser user) + { + var claims = new List + { + new(Claims.Subject, user.Id.ToString()), + new(Claims.Name, user.UserName ?? string.Empty), + new(Claims.Email, user.Email ?? string.Empty), + new("tenant_id", user.TenantId.ToString()) + }; + + var roles = await _userManager.GetRolesAsync(user); + foreach (var role in roles) + { + claims.Add(new Claim(Claims.Role, role)); + } + + var identity = new System.Security.Claims.ClaimsIdentity(claims, "Server"); + var principal = new System.Security.Claims.ClaimsPrincipal(identity); + + return new LoginResponse + { + AccessToken = "token-placeholder", // Will be replaced by OpenIddict + RefreshToken = "refresh-placeholder", + ExpiresIn = 3600, + TokenType = "Bearer" + }; + } +} +``` + +**Step 3: Run to verify controller compilation** + +Run: +```bash +dotnet build +``` +Expected: Build succeeds + +**Step 4: Commit** + +```bash +git add src/Fengling.AuthService/Controllers/ src/Fengling.AuthService/DTOs/ +git commit -m "feat(auth): add authentication controller with login endpoint" +``` + +--- + +## Task 5: Create OpenIddict Endpoints + +**Files:** +- Create: `src/Fengling.AuthService/Controllers/AuthorizationController.cs` + +**Step 1: Create authorization endpoints** + +Create: `src/Fengling.AuthService/Controllers/AuthorizationController.cs` + +```csharp +using Fengling.AuthService.Models; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using OpenIddict.Abstractions; +using OpenIddict.Server.AspNetCore; +using static OpenIddict.Abstractions.OpenIddictConstants; + +namespace Fengling.AuthService.Controllers; + +public class AuthorizationController : Controller +{ + private readonly IOpenIddictApplicationManager _applicationManager; + private readonly IOpenIddictAuthorizationManager _authorizationManager; + private readonly IOpenIddictScopeManager _scopeManager; + private readonly SignInManager _signInManager; + private readonly UserManager _userManager; + private readonly ILogger _logger; + + public AuthorizationController( + IOpenIddictApplicationManager applicationManager, + IOpenIddictAuthorizationManager authorizationManager, + IOpenIddictScopeManager scopeManager, + SignInManager signInManager, + UserManager userManager, + ILogger logger) + { + _applicationManager = applicationManager; + _authorizationManager = authorizationManager; + _scopeManager = scopeManager; + _signInManager = signInManager; + _userManager = userManager; + _logger = logger; + } + + [HttpPost("~/connect/token")] + [Produces("application/json")] + public async Task Exchange() + { + var request = HttpContext.GetOpenIddictServerRequest() ?? + throw new InvalidOperationException("The OpenID Connect request cannot be retrieved."); + + if (request.IsPasswordGrantType()) + { + var user = await _userManager.FindByNameAsync(request.Username); + if (user == null || user.IsDeleted) + { + return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, + new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.InvalidGrant, + [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "用户不存在" + })); + } + + var result = await _signInManager.CheckPasswordSignInAsync(user, request.Password, false); + if (!result.Succeeded) + { + return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, + new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.InvalidGrant, + [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "用户名或密码错误" + })); + } + + var principal = await _signInManager.CreateUserPrincipalAsync(user); + + var claims = new List + { + new(Claims.Subject, user.Id.ToString()), + new(Claims.Name, user.UserName ?? string.Empty), + new(Claims.Email, user.Email ?? string.Empty), + new("tenant_id", user.TenantId.ToString()) + }; + + var roles = await _userManager.GetRolesAsync(user); + foreach (var role in roles) + { + claims.Add(new Claim(Claims.Role, role)); + } + + principal.SetScopes(request.GetScopes()); + principal.SetResources(await _scopeManager.ListResourcesAsync(principal.GetScopes()).ToListAsync()); + + return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } + + return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, + new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.UnsupportedGrantType, + [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "不支持的授权类型" + })); + } + + [HttpGet("~/connect/authorize")] + [HttpPost("~/connect/authorize")] + [IgnoreAntiforgeryToken] + public async Task Authorize() + { + var request = HttpContext.GetOpenIddictServerRequest() ?? + throw new InvalidOperationException("The OpenID Connect request cannot be retrieved."); + + var result = await HttpContext.AuthenticateAsync(); + if (result == null || !result.Succeeded) + { + return Challenge( + new AuthenticationProperties + { + RedirectUri = Request.Path + Request.QueryString + }, + OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } + + return Ok(new { message = "Authorization endpoint" }); + } + + [HttpPost("~/connect/logout")] + [ValidateAntiForgeryToken] + public async Task Logout() + { + await HttpContext.SignOutAsync(); + return SignOut(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } +} +``` + +**Step 2: Run to verify** + +Run: +```bash +dotnet run +``` + +Test with curl: +```bash +curl -X POST http://localhost:5000/connect/token \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "grant_type=password" \ + -d "username=admin" \ + -d "password=Admin@123" \ + -d "scope=api offline_access" +``` +Expected: 400 error (user doesn't exist yet, but endpoint is working) + +**Step 3: Commit** + +```bash +git add src/Fengling.AuthService/Controllers/AuthorizationController.cs +git commit -m "feat(auth): add OpenIddict authorization endpoints" +``` + +--- + +## Task 6: Create Seed Data + +**Files:** +- Create: `src/Fengling.AuthService/Data/SeedData.cs` +- Modify: `src/Fengling.AuthService/Program.cs` + +**Step 1: Create seed data class** + +Create: `src/Fengling.AuthService/Data/SeedData.cs` + +```csharp +using Fengling.AuthService.Models; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; + +namespace Fengling.AuthService.Data; + +public static class SeedData +{ + public static async Task Initialize(IServiceProvider serviceProvider) + { + using var scope = serviceProvider.CreateScope(); + var context = scope.ServiceProvider.GetRequiredService(); + var userManager = scope.ServiceProvider.GetRequiredService>(); + var roleManager = scope.ServiceProvider.GetRequiredService>(); + + // Ensure database is created + context.Database.EnsureCreated(); + + // Create admin role + var adminRole = await roleManager.FindByNameAsync("Admin"); + if (adminRole == null) + { + adminRole = new ApplicationRole + { + Name = "Admin", + Description = "System administrator", + CreatedTime = DateTime.UtcNow + }; + await roleManager.CreateAsync(adminRole); + } + + // Create default admin user + var adminUser = await userManager.FindByNameAsync("admin"); + if (adminUser == null) + { + adminUser = new ApplicationUser + { + UserName = "admin", + Email = "admin@fengling.local", + RealName = "系统管理员", + Phone = "13800138000", + TenantId = 1, + EmailConfirmed = true, + IsDeleted = false, + CreatedTime = DateTime.UtcNow + }; + + var result = await userManager.CreateAsync(adminUser, "Admin@123"); + if (result.Succeeded) + { + await userManager.AddToRoleAsync(adminUser, "Admin"); + } + } + + // Create test user + var testUser = await userManager.FindByNameAsync("testuser"); + if (testUser == null) + { + testUser = new ApplicationUser + { + UserName = "testuser", + Email = "test@fengling.local", + RealName = "测试用户", + Phone = "13900139000", + TenantId = 1, + EmailConfirmed = true, + IsDeleted = false, + CreatedTime = DateTime.UtcNow + }; + + var result = await userManager.CreateAsync(testUser, "Test@123"); + if (result.Succeeded) + { + var userRole = new ApplicationRole + { + Name = "User", + Description = "普通用户", + CreatedTime = DateTime.UtcNow + }; + await roleManager.CreateAsync(userRole); + await userManager.AddToRoleAsync(testUser, "User"); + } + } + } +} +``` + +**Step 2: Update Program.cs to call seed data** + +Edit: `src/Fengling.AuthService/Program.cs` (add after `var app = builder.Build();`) + +```csharp +// Seed data +using (var scope = app.Services.CreateScope()) +{ + await Data.SeedData.Initialize(scope.ServiceProvider); +} +``` + +**Step 3: Run to create seed data** + +Run: +```bash +dotnet run +``` +Expected: Logs show admin user created successfully + +**Step 4: Test login** + +Run: +```bash +curl -X POST http://localhost:5000/connect/token \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "grant_type=password" \ + -d "username=admin" \ + -d "password=Admin@123" \ + -d "scope=api offline_access" +``` +Expected: Returns access_token and refresh_token + +**Step 5: Commit** + +```bash +git add src/Fengling.AuthService/Data/SeedData.cs src/Fengling.AuthService/Program.cs +git commit -m "feat(auth): add seed data for admin and test users" +``` + +--- + +## Task 7: Create Health Check Endpoint + +**Files:** +- Modify: `src/Fengling.AuthService/Program.cs` + +**Step 1: Add health check configuration** + +Edit: `src/Fengling.AuthService/Program.cs` (add after builder services) + +```csharp +builder.Services.AddHealthChecks() + .AddNpgSql(builder.Configuration.GetConnectionString("DefaultConnection")!); +``` + +**Step 2: Add health check endpoint** + +Edit: `src/Fengling.AuthService/Program.cs` (before app.Run()) + +```csharp +app.MapHealthChecks("/health"); +``` + +**Step 3: Test health check** + +Run: +```bash +dotnet run +``` + +Test: +```bash +curl http://localhost:5000/health +``` +Expected: "Healthy" + +**Step 4: Commit** + +```bash +git add src/Fengling.AuthService/Program.cs +git commit -m "feat(auth): add health check endpoint" +``` + +--- + +## Task 8: Create Dockerfile + +**Files:** +- Create: `src/Fengling.AuthService/Dockerfile` + +**Step 1: Create Dockerfile** + +Create: `src/Fengling.AuthService/Dockerfile` + +```dockerfile +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +WORKDIR /app +EXPOSE 80 + +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +WORKDIR /src +COPY ["Fengling.AuthService.csproj", "./"] +RUN dotnet restore "Fengling.AuthService.csproj" +COPY . . +WORKDIR "/src" +RUN dotnet build "Fengling.AuthService.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "Fengling.AuthService.csproj" -c Release -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Fengling.AuthService.dll"] +``` + +**Step 2: Create .dockerignore** + +Create: `src/Fengling.AuthService/.dockerignore` + +``` +bin/ +obj/ +Dockerfile +.dockerignore +*.md +``` + +**Step 3: Commit** + +```bash +git add src/Fengling.AuthService/Dockerfile src/Fengling.AuthService/.dockerignore +git commit -m "feat(auth): add Dockerfile for containerization" +``` + +--- + +## Task 9: Create Documentation + +**Files:** +- Create: `src/Fengling.AuthService/README.md` + +**Step 1: Create README** + +Create: `src/Fengling.AuthService/README.md` + +```markdown +# Fengling Auth Service + +Authentication and authorization service using OpenIddict. + +## Features + +- JWT token issuance +- OAuth2/OIDC support +- Multi-tenant support (TenantId in JWT claims) +- Role-based access control (RBAC) +- Health check endpoint + +## API Endpoints + +### Get Token +``` +POST /connect/token +Content-Type: application/x-www-form-urlencoded + +grant_type=password +username={username} +password={password} +scope=api offline_access +``` + +### Health Check +``` +GET /health +``` + +## Default Users + +- **Admin**: username=admin, password=Admin@123, role=Admin +- **Test User**: username=testuser, password=Test@123, role=User + +## Running Locally + +```bash +dotnet run +``` + +Service runs on port 5000. + +## Docker + +```bash +docker build -t fengling-auth:latest . +docker run -p 5000:80 fengling-auth:latest +``` + +## Environment Variables + +- `ConnectionStrings__DefaultConnection`: PostgreSQL connection string +- `OpenIddict__Issuer`: Token issuer URL +- `OpenIddict__Audience`: Token audience + +## Database + +- PostgreSQL +- Uses ASP.NET Core Identity for user/role management +- Tenant isolation via `TenantId` column +``` + +**Step 2: Commit** + +```bash +git add src/Fengling.AuthService/README.md +git commit -m "docs(auth): add API documentation" +``` + +--- + +## Summary + +This implementation plan creates a fully functional authentication service with: + +1. **Project structure** with OpenIddict and EF Core dependencies +2. **Database models** for users and roles with multi-tenant support +3. **OpenIddict configuration** for JWT token issuance +4. **Auth controller** with login endpoint +5. **OAuth2 endpoints** for token exchange +6. **Seed data** for admin and test users +7. **Health check** endpoint +8. **Docker support** for containerization +9. **Documentation** for API usage + +The service issues JWT tokens with embedded `tenant_id` claims, enabling multi-tenant routing via the YARP Gateway. diff --git a/docs/plans/2025-02-01-microservices-architecture.md b/docs/plans/2025-02-01-microservices-architecture.md new file mode 100644 index 0000000..1a880b3 --- /dev/null +++ b/docs/plans/2025-02-01-microservices-architecture.md @@ -0,0 +1,216 @@ +# Fengling Microservices Architecture Design + +**Date**: 2025-02-01 +**Status**: Approved + +## Overview +风灵(Fengling)系统从单体架构重构为微服务架构,采用核心业务微服务拆分策略,每服务独立数据库,通过RabbitMQ异步通信。 + +## Core Business Services + +### 1. 会员服务 +- **Database**: `fengling_member` +- **Entities**: Member, MemberLevel, MemberTag, MemberGroup +- **Responsibilities**: 会员信息管理、会员等级、会员分组、标签管理 + +### 2. 推广员服务 +- **Database**: `fengling_promoter` +- **Entities**: Promoter, PromotersActivity, PromoterStore +- **Responsibilities**: 推广员管理、推广员活动、推广员积分 + +### 3. 营销活动服务 +- **Database**: `fengling_activity` +- **Entities**: Activity, ActivityAward, ActivitySign, AfeActivity +- **Responsibilities**: 活动创建、活动报名、签到、抽奖、礼品发放 + +### 4. 优惠券服务 +- **Database**: `fengling_coupon` +- **Entities**: Coupon, CouponExpense, CouponTask +- **Responsibilities**: 优惠券发放、核销、任务配置 + +### 5. 礼品服务 +- **Database**: `fengling_gift` +- **Entities**: Gift, GiftCategory, GiftExpense +- **Responsibilities**: 礼品管理、礼品发放记录 + +### 6. 订单服务 +- **Database**: `fengling_order` +- **Entities**: Order, VirtualOrder, StoreshopOrders +- **Responsibilities**: 订单创建、订单状态管理 + +### 7. 渠道服务 +- **Database**: `fengling_channel` +- **Entities**: Channel, ChannelQrCode, ChannelApply, ChannelTag +- **Responsibilities**: 渠道管理、二维码生成、渠道申请审核 + +### 8. 门店服务 +- **Database**: `fengling_store` +- **Entities**: Store, StoreCategory, StoreLevel, StoreApply +- **Responsibilities**: 门店管理、门店等级、门店申请审核 + +### 9. 账户服务 +- **Database**: `fengling_account` +- **Entities**: Account, CustomerBalance, WalletBalance +- **Responsibilities**: 资金账户、积分账户、钱包余额管理 + +### 10. 积分服务 +- **Database**: `fengling_points` +- **Entities**: Points, IntegralRule, IntegralDetail, PointClearConfig +- **Responsibilities**: 积分规则配置、积分发放/扣减、积分明细 + +## Infrastructure Services + +### 1. 认证授权服务 +- **Technology**: OpenIddict (开源免费) +- **Responsibilities**: + - 用户认证(JWT Token签发) + - OAuth2/OIDC标准支持 + - 多租户认证(TenantId嵌入Token) + - 权限验证 +- **Gateway Integration**: 网关验证Token并传递TenantId到下游服务 + +### 2. 配置管理 +- **Approach**: K8s ConfigMap + appsettings环境变量 +- **Shared Library**: `Fengling.Configuration` + - 统一配置读取 + - 环境变量覆盖支持 + - 无需额外部署 +- **Benefits**: 简单可靠,零额外组件 + +### 3. 日志服务 +- **Technology**: Serilog + 云厂商日志服务 +- **Collection**: + - 应用输出JSON到stdout + - 云厂商Agent抓取日志 +- **Format**: JSON结构化(TraceId, SpanId, TenantId) + +### 4. 链路追踪 +- **Technology**: OpenTelemetry + Jaeger +- **Scope**: HTTP/RabbitMQ/DB/Redis +- **Retention**: 30天 + +### 5. 消息队列 +- **Technology**: RabbitMQ (集群部署) +- **Exchanges**: + - `activity.exchange`: 营销活动相关消息 + - `order.exchange`: 订单相关消息 + - `member.exchange`: 会员相关消息 + - `points.exchange`: 积分相关消息 +- **Persistence**: 开启持久化 +- **Dead Letter Queue**: 每个队列配置DLQ + +## Communication Pattern + +**All services use RabbitMQ for asynchronous communication** + +### Message Flows + +1. **Order Created**: + - Order Service → `order.exchange` → Points Service (add points) + - Order Service → `order.exchange` → Coupon Service (consume coupon) + +2. **Activity Signed**: + - Activity Service → `activity.exchange` → Points Service (add sign points) + - Activity Service → `activity.exchange` → Gift Service (issue gift) + +3. **Member Registered**: + - Member Service → `member.exchange` → Channel Service (bind channel) + - Member Service → `member.exchange` → Points Service (init account) + +## Database Strategy + +**Each microservice has its own PostgreSQL database** + +- Naming convention: `fengling_` +- No cross-service joins allowed +- Data consistency via eventual consistency (message queue) +- Tenant isolation via `TenantId` column in all tables + +## Security + +1. **Authentication**: JWT Token via OpenIddict +2. **Authorization**: Role-based access control (RBAC) +3. **Tenant Isolation**: TenantId in JWT + TenantId column in all tables +4. **API Security**: Gateway validates all incoming requests + +## Deployment + +- **Infrastructure**: Kubernetes +- **Gateway**: YARP Gateway (already implemented) +- **Load Balancing**: Kubernetes Service + Ingress +- **Configuration**: K8s ConfigMap +- **Logging**: Cloud provider log aggregation +- **Monitoring**: Prometheus + Grafana (optional) + +## Implementation Priority + +### Phase 1: Infrastructure (Current) +1. ✅ YARP Gateway +2. 🔄 Authentication Service (in progress) +3. RabbitMQ Setup +4. OpenTelemetry + Jaeger Setup + +### Phase 2: Core Services +5. Member Service +6. Promoter Service +7. Activity Service +8. Order Service + +### Phase 3: Supporting Services +9. Coupon Service +10. Gift Service +11. Channel Service +12. Store Service +13. Account Service +14. Points Service + +## Technology Stack + +- **.NET Version**: .NET 9.0 +- **Language**: C# 13 +- **Database**: PostgreSQL +- **ORM**: Entity Framework Core 9.0 +- **Cache**: Redis (StackExchange.Redis) +- **Message Queue**: RabbitMQ (MassTransit) +- **Authentication**: OpenIddict +- **Logging**: Serilog +- **Tracing**: OpenTelemetry +- **API Gateway**: YARP +- **Container**: Docker +- **Orchestration**: Kubernetes + +## Reference Architecture + +``` +[Client App] + | + v +[YARP Gateway] + | + |---[Tenant Routing]---> + | +[Authentication Service] (OpenIddict) + | + v +[Service Mesh (RabbitMQ)] + | + +---[Member Service]--->[fengling_member DB] + +---[Promoter Service]-->[fengling_promoter DB] + +---[Activity Service]-->[fengling_activity DB] + +---[Order Service]----->[fengling_order DB] + +---[Coupon Service]--->[fengling_coupon DB] + +---[Gift Service]----->[fengling_gift DB] + +---[Channel Service]-->[fengling_channel DB] + +---[Store Service]---->[fengling_store DB] + +---[Account Service]-->[fengling_account DB] + +---[Points Service]--->[fengling_points DB] +``` + +## Migration Strategy + +1. **Phase 1**: Extract shared libraries (Configuration, Logging, Tracing) +2. **Phase 2**: Implement Authentication Service +3. **Phase 3**: Extract services one by one (least dependent first) +4. **Phase 4**: Migrate data from monolithic database +5. **Phase 5**: Update Gateway routing to new services +6. **Phase 6**: Decommission old monolithic application diff --git a/docs/task-01-create-project-structure.md b/docs/task-01-create-project-structure.md index 8564ec7..97a2976 100644 --- a/docs/task-01-create-project-structure.md +++ b/docs/task-01-create-project-structure.md @@ -30,8 +30,8 @@ Edit: `src/Fengling.AuthService/Fengling.AuthService.csproj` - - + + diff --git a/docs/testing-guide.md b/docs/testing-guide.md new file mode 100644 index 0000000..f4a1a60 --- /dev/null +++ b/docs/testing-guide.md @@ -0,0 +1,398 @@ +# YARP Gateway 测试指南 + +## 1. 数据库准备 + +### 使用EF Core Migrations初始化数据库 + +项目使用 EF Core 管理数据库,已生成迁移脚本位于 `sql/init.sql`。 + +```bash +# 连接到PostgreSQL并执行迁移脚本 +psql -h 192.168.100.10 -U postgres -d fengling_gateway -f sql/init.sql +``` + +如果数据库不存在,先创建数据库: + +```bash +psql -h 192.168.100.10 -U postgres -c "CREATE DATABASE fengling_gateway;" +``` + +### 验证数据 + +```bash +psql -h 192.168.100.10 -U postgres -d fengling_gateway -c "\dt" +``` + +应该看到3个表: +- `Tenants` +- `TenantRoutes` +- `ServiceInstances` + +## 2. 启动网关 + +```bash +cd /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +dotnet run +``` + +网关将在 `http://localhost:8080` 启动。 + +## 3. 测试API接口 + +### 3.1 创建租户 + +```bash +curl -X POST http://localhost:8080/api/gateway/tenants \ + -H "Content-Type: application/json" \ + -d '{ + "tenantCode": "customerA", + "tenantName": "客户A" + }' +``` + +响应示例: +```json +{ + "id": 1738377721234, + "tenantCode": "customerA", + "tenantName": "客户A", + "status": 1, + "createdBy": null, + "createdTime": "2026-02-01T20:08:41.234Z", + "updatedBy": null, + "updatedTime": null, + "isDeleted": false, + "version": 0 +} +``` + +### 3.2 查看所有租户 + +```bash +curl http://localhost:8080/api/gateway/tenants +``` + +### 3.3 为租户创建路由 + +```bash +curl -X POST http://localhost:8080/api/gateway/tenants/customerA/routes \ + -H "Content-Type: application/json" \ + -d '{ + "serviceName": "product", + "pathPattern": "/api/product/{**catch-all}" + }' +``` + +响应示例: +```json +{ + "id": 1738377722345, + "tenantCode": "customerA", + "serviceName": "product", + "clusterId": "customerA-product", + "pathPattern": "/api/product/{**catch-all}", + "priority": 0, + "status": 1 +} +``` + +### 3.4 查看租户路由 + +```bash +curl http://localhost:8080/api/gateway/tenants/customerA/routes +``` + +### 3.5 添加服务实例 + +```bash +curl -X POST http://localhost:8080/api/gateway/clusters/customerA-product/instances \ + -H "Content-Type: application/json" \ + -d '{ + "destinationId": "product-1", + "address": "http://localhost:8001", + "weight": 1 + }' +``` + +### 3.6 查看Cluster实例 + +```bash +curl http://localhost:8080/api/gateway/clusters/customerA-product/instances +``` + +### 3.7 重新加载配置 + +```bash +curl -X POST http://localhost:8080/api/gateway/reload +``` + +响应: +```json +{ + "message": "Config reloaded successfully" +} +``` + +## 4. JWT测试 + +### 4.1 生成测试JWT + +使用 https://jwt.io/ 生成测试JWT: + +**Header**: +```json +{ + "alg": "HS256", + "typ": "JWT" +} +``` + +**Payload**: +```json +{ + "tenant": "customerA", + "sub": "123456", + "unique_name": "张三", + "role": ["admin", "user"], + "exp": 1738369200 +} +``` + +**Secret** (示例密钥): +``` +your-secret-key-at-least-32-bytes-long +``` + +### 4.2 测试JWT解析 + +```bash +JWT_TOKEN="your-generated-jwt-token" + +curl -X GET http://localhost:8080/api/product/list \ + -H "Authorization: Bearer $JWT_TOKEN" +``` + +### 4.3 验证Header传递 + +创建一个测试服务来接收请求: + +**创建测试服务** (test-service.js): +```javascript +const http = require('http'); + +const server = http.createServer((req, res) => { + console.log('收到请求:'); + console.log('URL:', req.url); + console.log('Headers:', req.headers); + + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ + message: '请求成功', + tenantId: req.headers['x-tenant-id'], + userId: req.headers['x-user-id'], + userName: req.headers['x-user-name'], + roles: req.headers['x-roles'] + })); +}); + +server.listen(8001, () => { + console.log('测试服务运行在 http://localhost:8001'); +}); +``` + +**启动测试服务**: +```bash +node test-service.js +``` + +## 5. 负载均衡测试 + +### 5.1 添加多个服务实例 + +```bash +# 实例1 +curl -X POST http://localhost:8080/api/gateway/clusters/customerA-product/instances \ + -H "Content-Type: application/json" \ + -d '{ + "destinationId": "product-1", + "address": "http://localhost:8001", + "weight": 10 + }' + +# 实例2 +curl -X POST http://localhost:8080/api/gateway/clusters/customerA-product/instances \ + -H "Content-Type: application/json" \ + -d '{ + "destinationId": "product-2", + "address": "http://localhost:8002", + "weight": 5 + }' +``` + +### 5.2 并发测试 + +```bash +for i in {1..20}; do + curl -X GET http://localhost:8080/api/product/list \ + -H "Authorization: Bearer $JWT_TOKEN" & +done +wait +``` + +观察日志输出,验证请求是否按权重分配到不同实例。 + +## 6. 日志查看 + +### 查看网关日志 + +控制台会输出实时日志,包括: +- JWT解析日志 +- 路由选择日志 +- 负载均衡选择日志 + +### 日志文件位置 + +`/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/logs/gateway-YYYYMMDD.log` + +## 7. 故障排查 + +### 问题1: 无法连接数据库 + +**测试连接**: +```bash +psql -h 192.168.100.10 -U postgres -d fengling_gateway +``` + +**检查配置**: +- 确认 `appsettings.json` 中的连接字符串正确 +- 确认 PostgreSQL 已启动并可访问 + +### 问题2: 路由404 + +**检查租户配置**: +```bash +curl http://localhost:8080/api/gateway/tenants +``` + +**检查路由配置**: +```bash +curl http://localhost:8080/api/gateway/tenants/customerA/routes +``` + +**检查实例配置**: +```bash +curl http://localhost:8080/api/gateway/clusters/customerA-product/instances +``` + +### 问题3: JWT解析失败 + +**验证JWT格式**: +```bash +echo "your.jwt.token" | cut -d'.' -f2 | base64 -d +``` + +**检查日志中的错误信息** + +### 问题4: 数据库迁移失败 + +**手动执行SQL脚本**: +```bash +psql -h 192.168.100.10 -U postgres -d fengling_gateway -f sql/init.sql +``` + +**检查迁移历史**: +```sql +SELECT * FROM "__EFMigrationsHistory"; +``` + +## 8. 使用Docker Compose + +如果使用Docker Compose部署: + +```bash +cd /Users/movingsam/Fengling.Refactory.Buiding/docker +docker-compose up -d +``` + +查看日志: +```bash +docker-compose logs -f gateway +``` + +## 9. 清理 + +### 停止网关 + +按 `Ctrl+C` 停止 `dotnet run` + +### 删除数据库(如果需要) + +```bash +psql -h 192.168.100.10 -U postgres -c "DROP DATABASE fengling_gateway;" +``` + +## 10. 创建示例数据 + +### 创建完整示例数据 + +```bash +# 1. 创建租户 +curl -X POST http://localhost:8080/api/gateway/tenants \ + -H "Content-Type: application/json" \ + -d '{"tenantCode": "customerB", "tenantName": "客户B"}' + +# 2. 创建订单服务路由 +curl -X POST http://localhost:8080/api/gateway/tenants/customerA/routes \ + -H "Content-Type: application/json" \ + -d '{"serviceName": "order", "pathPattern": "/api/order/{**catch-all}"}' + +# 3. 为客户B创建产品服务 +curl -X POST http://localhost:8080/api/gateway/tenants/customerB/routes \ + -H "Content-Type: application/json" \ + -d '{"serviceName": "product", "pathPattern": "/api/product/{**catch-all}"}' + +# 4. 为客户B产品服务添加实例 +curl -X POST http://localhost:8080/api/gateway/clusters/customerB-product/instances \ + -H "Content-Type: application/json" \ + -d '{"destinationId": "product-1", "address": "http://localhost:8003", "weight": 1}' +``` + +### 验证配置 + +```bash +# 查看所有租户 +curl http://localhost:8080/api/gateway/tenants | jq + +# 查看客户A的所有路由 +curl http://localhost:8080/api/gateway/tenants/customerA/routes | jq + +# 查看客户A产品服务的所有实例 +curl http://localhost:8080/api/gateway/clusters/customerA-product/instances | jq +``` + +## 11. EF Core Migrations管理 + +### 添加新迁移 + +```bash +cd /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +dotnet ef migrations add AddNewFeature +``` + +### 生成SQL脚本 + +```bash +dotnet ef migrations script --context GatewayDbContext --output ../sql/migration_$(date +%Y%m%d).sql +``` + +### 应用迁移到数据库 + +```bash +dotnet ef database update --context GatewayDbContext +``` + +### 回滚迁移 + +```bash +dotnet ef database update 20260201120312_InitialCreate --context GatewayDbContext +``` diff --git a/sql/init.sql b/sql/init.sql new file mode 100644 index 0000000..9a8b36d --- /dev/null +++ b/sql/init.sql @@ -0,0 +1,89 @@ +CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" ( + "MigrationId" character varying(150) NOT NULL, + "ProductVersion" character varying(32) NOT NULL, + CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY ("MigrationId") +); + +START TRANSACTION; +CREATE TABLE "ServiceInstances" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "ClusterId" character varying(100) NOT NULL, + "DestinationId" character varying(100) NOT NULL, + "Address" character varying(200) NOT NULL, + "Health" integer NOT NULL, + "Weight" integer NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_ServiceInstances" PRIMARY KEY ("Id") +); + +CREATE TABLE "Tenants" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "TenantCode" character varying(50) NOT NULL, + "TenantName" character varying(100) NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_Tenants" PRIMARY KEY ("Id"), + CONSTRAINT "AK_Tenants_TenantCode" UNIQUE ("TenantCode") +); + +CREATE TABLE "TenantRoutes" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "TenantCode" character varying(50) NOT NULL, + "ServiceName" character varying(100) NOT NULL, + "ClusterId" character varying(100) NOT NULL, + "PathPattern" character varying(200) NOT NULL, + "Priority" integer NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_TenantRoutes" PRIMARY KEY ("Id"), + CONSTRAINT "FK_TenantRoutes_Tenants_TenantCode" FOREIGN KEY ("TenantCode") REFERENCES "Tenants" ("TenantCode") ON DELETE RESTRICT +); + +CREATE UNIQUE INDEX "IX_ServiceInstances_ClusterId_DestinationId" ON "ServiceInstances" ("ClusterId", "DestinationId"); + +CREATE INDEX "IX_ServiceInstances_Health" ON "ServiceInstances" ("Health"); + +CREATE INDEX "IX_TenantRoutes_ClusterId" ON "TenantRoutes" ("ClusterId"); + +CREATE UNIQUE INDEX "IX_TenantRoutes_TenantCode_ServiceName" ON "TenantRoutes" ("TenantCode", "ServiceName"); + +CREATE UNIQUE INDEX "IX_Tenants_TenantCode" ON "Tenants" ("TenantCode"); + +INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") +VALUES ('20260201120312_InitialCreate', '9.0.0'); + +ALTER TABLE "TenantRoutes" DROP CONSTRAINT "FK_TenantRoutes_Tenants_TenantCode"; + +ALTER TABLE "Tenants" DROP CONSTRAINT "AK_Tenants_TenantCode"; + +DROP INDEX "IX_TenantRoutes_TenantCode_ServiceName"; + +ALTER TABLE "TenantRoutes" ADD "IsGlobal" boolean NOT NULL DEFAULT FALSE; + +CREATE INDEX "IX_TenantRoutes_ServiceName" ON "TenantRoutes" ("ServiceName"); + +CREATE INDEX "IX_TenantRoutes_ServiceName_IsGlobal_Status" ON "TenantRoutes" ("ServiceName", "IsGlobal", "Status"); + +CREATE INDEX "IX_TenantRoutes_TenantCode" ON "TenantRoutes" ("TenantCode"); + +INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") +VALUES ('20260201133826_AddIsGlobalToTenantRoute', '9.0.0'); + +COMMIT; + diff --git a/src/Fengling.AuthService/Fengling.AuthService.csproj b/src/Fengling.AuthService/Fengling.AuthService.csproj index 38a09d5..c7f9056 100644 --- a/src/Fengling.AuthService/Fengling.AuthService.csproj +++ b/src/Fengling.AuthService/Fengling.AuthService.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/src/YarpGateway.Admin/.env.development b/src/YarpGateway.Admin/.env.development new file mode 100644 index 0000000..a8cf54a --- /dev/null +++ b/src/YarpGateway.Admin/.env.development @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://localhost:8080 diff --git a/src/YarpGateway.Admin/.gitignore b/src/YarpGateway.Admin/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/YarpGateway.Admin/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/YarpGateway.Admin/.vscode/extensions.json b/src/YarpGateway.Admin/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/src/YarpGateway.Admin/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/src/YarpGateway.Admin/Dockerfile b/src/YarpGateway.Admin/Dockerfile new file mode 100644 index 0000000..ef1fffa --- /dev/null +++ b/src/YarpGateway.Admin/Dockerfile @@ -0,0 +1,18 @@ +FROM node:20-alpine AS builder + +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . . +RUN npm run build + +FROM nginx:alpine + +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/src/YarpGateway.Admin/README.md b/src/YarpGateway.Admin/README.md new file mode 100644 index 0000000..9a0c91a --- /dev/null +++ b/src/YarpGateway.Admin/README.md @@ -0,0 +1,167 @@ +# YARP Gateway Admin + +基于Vue3 + Element Plus的YARP网关管理界面。 + +## 功能特性 + +- ✅ 租户管理(CRUD) +- ✅ 租户路由配置 +- ✅ 服务实例管理 +- ✅ 加权负载均衡配置 +- ✅ 配置热重载 +- ✅ 实时监控仪表板 +- ✅ TypeScript类型支持 + +## 快速开始 + +### 安装依赖 + +```bash +npm install +``` + +### 启动开发服务器 + +```bash +npm run dev +``` + +访问: http://localhost:5173 + +### 构建生产版本 + +```bash +npm run build +``` + +### 预览生产构建 + +```bash +npm run preview +``` + +## 项目结构 + +``` +src/ +├── api/ # API接口定义 +│ └── index.ts +├── components/ # 公共组件 +│ └── Layout.vue +├── router/ # 路由配置 +│ └── index.ts +├── stores/ # Pinia状态管理 +│ └── tenant.ts +├── views/ # 页面组件 +│ ├── TenantList.vue # 租户列表 +│ ├── TenantRoutes.vue # 租户路由 +│ ├── ClusterInstances.vue # 实例管理 +│ └── Dashboard.vue # 仪表板 +├── App.vue # 根组件 +└── main.ts # 入口文件 +``` + +## 页面说明 + +### 租户列表 (/tenants) +- 查看所有租户 +- 创建新租户 +- 删除租户 +- 查看租户路由 + +### 租户路由 (/tenants/:tenantCode/routes) +- 查看租户的所有服务路由 +- 创建新路由 +- 删除路由 +- 查看服务实例 + +### 服务实例 (/clusters/:clusterId/instances) +- 查看Cluster下的所有实例 +- 添加新实例 +- 设置权重 +- 删除实例 + +### 监控仪表板 (/dashboard) +- 总租户数 +- 总路由数 +- 总Cluster数 +- 总实例数 +- 快速操作 + +## 环境变量 + +`.env.development`: +``` +VITE_API_BASE_URL=http://localhost:8080 +``` + +## API接口配置 + +开发环境通过Vite代理转发到后端: + +```typescript +server: { + proxy: { + '/api': { + target: 'http://localhost:8080', + changeOrigin: true + } + } +} +``` + +## 技术栈 + +- **Vue 3** - 渐进式JavaScript框架 +- **TypeScript** - 类型安全 +- **Vite** - 构建工具 +- **Element Plus** - UI组件库 +- **Pinia** - 状态管理 +- **Vue Router** - 路由管理 +- **Axios** - HTTP客户端 + +## 开发建议 + +### 添加新页面 + +1. 在 `src/views/` 创建Vue组件 +2. 在 `src/router/index.ts` 添加路由 +3. 在 `Layout.vue` 添加菜单项 + +### 添加API接口 + +在 `src/api/index.ts` 添加: + +```typescript +export const api = { + yourModule: { + yourMethod: (params) => request.get('/api/your-endpoint', { params }) + } +} +``` + +### 添加状态管理 + +在 `src/stores/` 创建Pinia store: + +```typescript +import { defineStore } from 'pinia' + +export const useYourStore = defineStore('your', () => { + // state, actions +}) +``` + +## Docker部署 + +```bash +# 构建镜像 +docker build -t yarp-gateway-admin . + +# 运行容器 +docker run -d -p 5173:80 yarp-gateway-admin +``` + +## License + +MIT diff --git a/src/YarpGateway.Admin/index.html b/src/YarpGateway.Admin/index.html new file mode 100644 index 0000000..98ddb94 --- /dev/null +++ b/src/YarpGateway.Admin/index.html @@ -0,0 +1,13 @@ + + + + + + + yarpgateway-admin + + +
+ + + diff --git a/src/YarpGateway.Admin/nginx.conf b/src/YarpGateway.Admin/nginx.conf new file mode 100644 index 0000000..324ece5 --- /dev/null +++ b/src/YarpGateway.Admin/nginx.conf @@ -0,0 +1,21 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location /api { + proxy_pass http://yarp-gateway:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; +} diff --git a/src/YarpGateway.Admin/package-lock.json b/src/YarpGateway.Admin/package-lock.json new file mode 100644 index 0000000..4e947d8 --- /dev/null +++ b/src/YarpGateway.Admin/package-lock.json @@ -0,0 +1,2560 @@ +{ + "name": "yarpgateway-admin", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "yarpgateway-admin", + "version": "0.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "axios": "^1.13.4", + "element-plus": "^2.13.2", + "pinia": "^3.0.4", + "vue": "^3.5.24", + "vue-router": "^5.0.1" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.8.1", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vue-tsc": "^3.1.4" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", + "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.4", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", + "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz", + "integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.53" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.27.tgz", + "integrity": "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.27" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.27.tgz", + "integrity": "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.27.tgz", + "integrity": "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.27.tgz", + "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.27", + "entities": "^7.0.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", + "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", + "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.27", + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", + "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.4.tgz", + "integrity": "sha512-bqBGuSG4KZM45KKTXzGtoCl9cWju5jsaBKaJJe3h5hRAAWpZUuj5G+L+eI01sPIkm4H6setKRlw7E85wLdDNew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.0.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.27.tgz", + "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.27.tgz", + "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", + "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/runtime-core": "3.5.27", + "@vue/shared": "3.5.27", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.27.tgz", + "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "vue": "3.5.27" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.27.tgz", + "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.8.1.tgz", + "integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/alien-signals": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz", + "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz", + "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "ast-kit": "^2.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/element-plus": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.2.tgz", + "integrity": "sha512-Zjzm1NnFXGhV4LYZ6Ze9skPlYi2B4KAmN18FL63A3PZcjhDfroHwhtM6RE8BonlOPHXUnPQynH0BgaoEfvhrGw==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.2", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "@vueuse/core": "^10.11.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.19", + "lodash": "^4.17.23", + "lodash-es": "^4.17.23", + "lodash-unified": "^1.0.3", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.3.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.27.tgz", + "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-sfc": "3.5.27", + "@vue/runtime-dom": "3.5.27", + "@vue/server-renderer": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.1.tgz", + "integrity": "sha512-t+lFugGXMdaq8lbn+vXG4j2H9UlsP205Tszz1wcDk9FyxqItBzcdJQ06IhpkQ2mHOfiTOHZeBshkskzPzHJkCw==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.6", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.0.0", + "ast-walker-scope": "^0.8.3", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1", + "yaml": "^2.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": "^0.18.1", + "@vue/compiler-sfc": "^3.5.17", + "pinia": "^3.0.4", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.5.tgz", + "integrity": "sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.0.5" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-kit": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.5.tgz", + "integrity": "sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.0.5", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^2.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-shared": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.5.tgz", + "integrity": "sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/vue-router/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/vue-tsc": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.4.tgz", + "integrity": "sha512-xj3YCvSLNDKt1iF9OcImWHhmYcihVu9p4b9s4PGR/qp6yhW+tZJaypGxHScRyOrdnHvaOeF+YkZOdKwbgGvp5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.27", + "@vue/language-core": "3.2.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + } + } +} diff --git a/src/YarpGateway.Admin/package.json b/src/YarpGateway.Admin/package.json new file mode 100644 index 0000000..cc04817 --- /dev/null +++ b/src/YarpGateway.Admin/package.json @@ -0,0 +1,27 @@ +{ + "name": "yarpgateway-admin", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "axios": "^1.13.4", + "element-plus": "^2.13.2", + "pinia": "^3.0.4", + "vue": "^3.5.24", + "vue-router": "^5.0.1" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.8.1", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vue-tsc": "^3.1.4" + } +} diff --git a/src/YarpGateway.Admin/public/vite.svg b/src/YarpGateway.Admin/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/YarpGateway.Admin/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/YarpGateway.Admin/src/App.vue b/src/YarpGateway.Admin/src/App.vue new file mode 100644 index 0000000..a39b083 --- /dev/null +++ b/src/YarpGateway.Admin/src/App.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/YarpGateway.Admin/src/api/index.ts b/src/YarpGateway.Admin/src/api/index.ts new file mode 100644 index 0000000..4891441 --- /dev/null +++ b/src/YarpGateway.Admin/src/api/index.ts @@ -0,0 +1,92 @@ +import axios from 'axios' + +const baseURL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080' + +const request = axios.create({ + baseURL, + timeout: 10000 +}) + +request.interceptors.response.use( + response => response.data, + error => { + console.error('API Error:', error) + return Promise.reject(error) + } +) + +export interface Tenant { + id: number + tenantCode: string + tenantName: string + status: number + createdBy: number | null + createdTime: string + updatedBy: number | null + updatedTime: string | null + isDeleted: boolean + version: number +} + +export interface TenantRoute { + id: number + tenantCode: string + serviceName: string + clusterId: string + pathPattern: string + priority: number + status: number + isGlobal: boolean + createdBy: number | null + createdTime: string + updatedBy: number | null + updatedTime: string | null + isDeleted: boolean + version: number +} + +export interface ServiceInstance { + id: number + clusterId: string + destinationId: string + address: string + health: number + weight: number + status: number + createdBy: number | null + createdTime: string + updatedBy: number | null + updatedTime: string | null + isDeleted: boolean + version: number +} + +export const api = { + tenants: { + list: () => request.get('/api/gateway/tenants'), + create: (data: { tenantCode: string; tenantName: string }) => + request.post('/api/gateway/tenants', data), + delete: (id: number) => request.delete(`/api/gateway/tenants/${id}`), + getRoutes: (tenantCode: string) => + request.get(`/api/gateway/tenants/${tenantCode}/routes`), + createRoute: (tenantCode: string, data: { serviceName: string; pathPattern: string }) => + request.post(`/api/gateway/tenants/${tenantCode}/routes`, data), + deleteRoute: (id: number) => request.delete(`/api/gateway/routes/${id}`) + }, + routes: { + listGlobal: () => request.get('/api/gateway/routes/global'), + createGlobal: (data: { serviceName: string; clusterId: string; pathPattern: string }) => + request.post('/api/gateway/routes/global', data), + delete: (id: number) => request.delete(`/api/gateway/routes/${id}`) + }, + clusters: { + getInstances: (clusterId: string) => + request.get(`/api/gateway/clusters/${clusterId}/instances`), + addInstance: (clusterId: string, data: { destinationId: string; address: string; weight: number }) => + request.post(`/api/gateway/clusters/${clusterId}/instances`, data), + deleteInstance: (id: number) => request.delete(`/api/gateway/instances/${id}`) + }, + config: { + reload: () => request.post('/api/gateway/reload') + } +} diff --git a/src/YarpGateway.Admin/src/assets/vue.svg b/src/YarpGateway.Admin/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/YarpGateway.Admin/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/YarpGateway.Admin/src/components/HelloWorld.vue b/src/YarpGateway.Admin/src/components/HelloWorld.vue new file mode 100644 index 0000000..b58e52b --- /dev/null +++ b/src/YarpGateway.Admin/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/YarpGateway.Admin/src/components/Layout.vue b/src/YarpGateway.Admin/src/components/Layout.vue new file mode 100644 index 0000000..8ad8289 --- /dev/null +++ b/src/YarpGateway.Admin/src/components/Layout.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/YarpGateway.Admin/src/main.ts b/src/YarpGateway.Admin/src/main.ts new file mode 100644 index 0000000..b7402f4 --- /dev/null +++ b/src/YarpGateway.Admin/src/main.ts @@ -0,0 +1,20 @@ +import { createApp } from 'vue' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +import * as ElementPlusIconsVue from '@element-plus/icons-vue' +import { createPinia } from 'pinia' +import router from './router' +import App from './App.vue' +import './style.css' + +const app = createApp(App) + +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) +} + +app.use(createPinia()) +app.use(router) +app.use(ElementPlus) + +app.mount('#app') diff --git a/src/YarpGateway.Admin/src/router/index.ts b/src/YarpGateway.Admin/src/router/index.ts new file mode 100644 index 0000000..8769dd9 --- /dev/null +++ b/src/YarpGateway.Admin/src/router/index.ts @@ -0,0 +1,45 @@ +import { createRouter, createWebHistory } from 'vue-router' +import type { RouteRecordRaw } from 'vue-router' + +const routes: RouteRecordRaw[] = [ + { + path: '/', + name: 'Layout', + component: () => import('../components/Layout.vue'), + redirect: '/tenants', + children: [ + { + path: 'tenants', + name: 'Tenants', + component: () => import('../views/TenantList.vue') + }, + { + path: 'tenants/:tenantCode/routes', + name: 'TenantRoutes', + component: () => import('../views/TenantRoutes.vue') + }, + { + path: 'routes/global', + name: 'GlobalRoutes', + component: () => import('../views/GlobalRoutes.vue') + }, + { + path: 'clusters/:clusterId/instances', + name: 'ClusterInstances', + component: () => import('../views/ClusterInstances.vue') + }, + { + path: 'dashboard', + name: 'Dashboard', + component: () => import('../views/Dashboard.vue') + } + ] + } +] + +const router = createRouter({ + history: createWebHistory(), + routes +}) + +export default router diff --git a/src/YarpGateway.Admin/src/stores/tenant.ts b/src/YarpGateway.Admin/src/stores/tenant.ts new file mode 100644 index 0000000..d67656d --- /dev/null +++ b/src/YarpGateway.Admin/src/stores/tenant.ts @@ -0,0 +1,43 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import { api, type Tenant } from '../api' + +export const useTenantStore = defineStore('tenant', () => { + const tenants = ref([]) + const loading = ref(false) + + const tenantMap = computed(() => { + const map = new Map() + tenants.value.forEach(t => map.set(t.tenantCode, t)) + return map + }) + + async function loadTenants() { + loading.value = true + try { + tenants.value = await api.tenants.list() + } finally { + loading.value = false + } + } + + async function createTenant(data: { tenantCode: string; tenantName: string }) { + const tenant = await api.tenants.create(data) + tenants.value.push(tenant) + return tenant + } + + async function deleteTenant(id: number) { + await api.tenants.delete(id) + tenants.value = tenants.value.filter(t => t.id !== id) + } + + return { + tenants, + loading, + tenantMap, + loadTenants, + createTenant, + deleteTenant + } +}) diff --git a/src/YarpGateway.Admin/src/style.css b/src/YarpGateway.Admin/src/style.css new file mode 100644 index 0000000..4b243b2 --- /dev/null +++ b/src/YarpGateway.Admin/src/style.css @@ -0,0 +1,23 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html, body { + margin: 0; + padding: 0; + width: 100%; + height: 100%; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#app { + width: 100%; + height: 100vh; +} diff --git a/src/YarpGateway.Admin/src/views/ClusterInstances.vue b/src/YarpGateway.Admin/src/views/ClusterInstances.vue new file mode 100644 index 0000000..22f8ca9 --- /dev/null +++ b/src/YarpGateway.Admin/src/views/ClusterInstances.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/YarpGateway.Admin/src/views/Dashboard.vue b/src/YarpGateway.Admin/src/views/Dashboard.vue new file mode 100644 index 0000000..ab9b91c --- /dev/null +++ b/src/YarpGateway.Admin/src/views/Dashboard.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/src/YarpGateway.Admin/src/views/GlobalRoutes.vue b/src/YarpGateway.Admin/src/views/GlobalRoutes.vue new file mode 100644 index 0000000..3f3f909 --- /dev/null +++ b/src/YarpGateway.Admin/src/views/GlobalRoutes.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/src/YarpGateway.Admin/src/views/TenantList.vue b/src/YarpGateway.Admin/src/views/TenantList.vue new file mode 100644 index 0000000..f34438a --- /dev/null +++ b/src/YarpGateway.Admin/src/views/TenantList.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/YarpGateway.Admin/src/views/TenantRoutes.vue b/src/YarpGateway.Admin/src/views/TenantRoutes.vue new file mode 100644 index 0000000..f9f8e02 --- /dev/null +++ b/src/YarpGateway.Admin/src/views/TenantRoutes.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/YarpGateway.Admin/tsconfig.app.json b/src/YarpGateway.Admin/tsconfig.app.json new file mode 100644 index 0000000..8d16e42 --- /dev/null +++ b/src/YarpGateway.Admin/tsconfig.app.json @@ -0,0 +1,16 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "types": ["vite/client"], + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/src/YarpGateway.Admin/tsconfig.json b/src/YarpGateway.Admin/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/src/YarpGateway.Admin/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/src/YarpGateway.Admin/tsconfig.node.json b/src/YarpGateway.Admin/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/src/YarpGateway.Admin/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/src/YarpGateway.Admin/vite.config.ts b/src/YarpGateway.Admin/vite.config.ts new file mode 100644 index 0000000..3f75bd1 --- /dev/null +++ b/src/YarpGateway.Admin/vite.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'path' + +export default defineConfig({ + plugins: [vue()], + resolve: { + alias: { + '@': path.resolve(__dirname, 'src') + } + }, + server: { + port: 5173, + proxy: { + '/api': { + target: 'http://localhost:8080', + changeOrigin: true + } + } + } +}) diff --git a/src/YarpGateway/Config/DatabaseClusterConfigProvider.cs b/src/YarpGateway/Config/DatabaseClusterConfigProvider.cs new file mode 100644 index 0000000..5fb53c4 --- /dev/null +++ b/src/YarpGateway/Config/DatabaseClusterConfigProvider.cs @@ -0,0 +1,99 @@ +using Yarp.ReverseProxy.Configuration; +using Microsoft.EntityFrameworkCore; +using System.Collections.Concurrent; +using YarpGateway.Data; +using YarpGateway.Models; + +namespace YarpGateway.Config; + +public class DatabaseClusterConfigProvider +{ + private readonly IDbContextFactory _dbContextFactory; + private readonly ConcurrentDictionary _clusters = new(); + private readonly SemaphoreSlim _lock = new(1, 1); + private readonly ILogger _logger; + + public DatabaseClusterConfigProvider(IDbContextFactory dbContextFactory, ILogger logger) + { + _dbContextFactory = dbContextFactory; + _logger = logger; + _ = LoadConfigAsync(); + } + + public IReadOnlyList GetClusters() + { + return _clusters.Values.ToList().AsReadOnly(); + } + + public async Task ReloadAsync() + { + await _lock.WaitAsync(); + try + { + await LoadConfigInternalAsync(); + } + finally + { + _lock.Release(); + } + } + + private async Task LoadConfigAsync() + { + await LoadConfigInternalAsync(); + } + + private async Task LoadConfigInternalAsync() + { + await using var dbContext = _dbContextFactory.CreateDbContext(); + + var instances = await dbContext.ServiceInstances + .Where(i => i.Status == 1 && !i.IsDeleted) + .GroupBy(i => i.ClusterId) + .ToListAsync(); + + var newClusters = new ConcurrentDictionary(); + + foreach (var group in instances) + { + var destinations = new Dictionary(); + foreach (var instance in group) + { + destinations[instance.DestinationId] = new DestinationConfig + { + Address = instance.Address, + Metadata = new Dictionary + { + ["Weight"] = instance.Weight.ToString() + } + }; + } + + var config = new ClusterConfig + { + ClusterId = group.Key, + Destinations = destinations, + LoadBalancingPolicy = "DistributedWeightedRoundRobin", + HealthCheck = new HealthCheckConfig + { + Active = new ActiveHealthCheckConfig + { + Enabled = true, + Interval = TimeSpan.FromSeconds(30), + Timeout = TimeSpan.FromSeconds(5), + Path = "/health" + } + } + }; + newClusters[group.Key] = config; + } + + _clusters.Clear(); + foreach (var cluster in newClusters) + { + _clusters[cluster.Key] = cluster.Value; + } + + _logger.LogInformation("Loaded {Count} clusters from database", _clusters.Count); + } +} diff --git a/src/YarpGateway/Config/DatabaseRouteConfigProvider.cs b/src/YarpGateway/Config/DatabaseRouteConfigProvider.cs new file mode 100644 index 0000000..f0e4b7d --- /dev/null +++ b/src/YarpGateway/Config/DatabaseRouteConfigProvider.cs @@ -0,0 +1,83 @@ +using System.Collections.Concurrent; +using Microsoft.EntityFrameworkCore; +using Yarp.ReverseProxy.Configuration; +using YarpGateway.Data; +using YarpGateway.Models; + +namespace YarpGateway.Config; + +public class DatabaseRouteConfigProvider +{ + private readonly IDbContextFactory _dbContextFactory; + private readonly ConcurrentDictionary _routes = new(); + private readonly SemaphoreSlim _lock = new(1, 1); + private readonly ILogger _logger; + + public DatabaseRouteConfigProvider( + IDbContextFactory dbContextFactory, + ILogger logger + ) + { + _dbContextFactory = dbContextFactory; + _logger = logger; + _ = LoadConfigAsync(); + } + + public IReadOnlyList GetRoutes() + { + return _routes.Values.ToList().AsReadOnly(); + } + + public async Task ReloadAsync() + { + await _lock.WaitAsync(); + try + { + await LoadConfigInternalAsync(); + } + finally + { + _lock.Release(); + } + } + + private async Task LoadConfigAsync() + { + await LoadConfigInternalAsync(); + } + + private async Task LoadConfigInternalAsync() + { + await using var dbContext = _dbContextFactory.CreateDbContext(); + + var routes = await dbContext + .TenantRoutes.Where(r => r.Status == 1 && !r.IsDeleted) + .ToListAsync(); + + var newRoutes = new ConcurrentDictionary(); + + foreach (var route in routes) + { + var config = new RouteConfig + { + RouteId = route.Id.ToString(), + ClusterId = route.ClusterId, + Match = new RouteMatch { Path = route.PathPattern }, + Metadata = new Dictionary + { + ["TenantCode"] = route.TenantCode, + ["ServiceName"] = route.ServiceName, + }, + }; + newRoutes[route.Id.ToString()] = config; + } + + _routes.Clear(); + foreach (var route in newRoutes) + { + _routes[route.Key] = route.Value; + } + + _logger.LogInformation("Loaded {Count} routes from database", _routes.Count); + } +} diff --git a/src/YarpGateway/Config/JwtConfig.cs b/src/YarpGateway/Config/JwtConfig.cs new file mode 100644 index 0000000..bd7550f --- /dev/null +++ b/src/YarpGateway/Config/JwtConfig.cs @@ -0,0 +1,9 @@ +namespace YarpGateway.Config; + +public class JwtConfig +{ + public string Authority { get; set; } = string.Empty; + public string Audience { get; set; } = string.Empty; + public bool ValidateIssuer { get; set; } = true; + public bool ValidateAudience { get; set; } = true; +} diff --git a/src/YarpGateway/Config/RedisConfig.cs b/src/YarpGateway/Config/RedisConfig.cs new file mode 100644 index 0000000..28acc8a --- /dev/null +++ b/src/YarpGateway/Config/RedisConfig.cs @@ -0,0 +1,8 @@ +namespace YarpGateway.Config; + +public class RedisConfig +{ + public string ConnectionString { get; set; } = "localhost:6379"; + public int Database { get; set; } = 0; + public string InstanceName { get; set; } = "YarpGateway"; +} diff --git a/src/YarpGateway/Controllers/GatewayConfigController.cs b/src/YarpGateway/Controllers/GatewayConfigController.cs new file mode 100644 index 0000000..5286f18 --- /dev/null +++ b/src/YarpGateway/Controllers/GatewayConfigController.cs @@ -0,0 +1,272 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using YarpGateway.Data; +using YarpGateway.Config; +using YarpGateway.Models; +using YarpGateway.Services; +using Yarp.ReverseProxy.Configuration; + +namespace YarpGateway.Controllers; + +[ApiController] +[Route("api/gateway")] +public class GatewayConfigController : ControllerBase +{ + private readonly IDbContextFactory _dbContextFactory; + private readonly DatabaseRouteConfigProvider _routeProvider; + private readonly DatabaseClusterConfigProvider _clusterProvider; + private readonly IRouteCache _routeCache; + + public GatewayConfigController( + IDbContextFactory dbContextFactory, + DatabaseRouteConfigProvider routeProvider, + DatabaseClusterConfigProvider clusterProvider, + IRouteCache routeCache) + { + _dbContextFactory = dbContextFactory; + _routeProvider = routeProvider; + _clusterProvider = clusterProvider; + _routeCache = routeCache; + } + + [HttpGet("tenants")] + public async Task GetTenants() + { + await using var db = _dbContextFactory.CreateDbContext(); + var tenants = await db.Tenants + .Where(t => !t.IsDeleted) + .ToListAsync(); + return Ok(tenants); + } + + [HttpPost("tenants")] + public async Task CreateTenant([FromBody] CreateTenantDto dto) + { + await using var db = _dbContextFactory.CreateDbContext(); + var existing = await db.Tenants + .FirstOrDefaultAsync(t => t.TenantCode == dto.TenantCode); + if (existing != null) + { + return BadRequest($"Tenant code {dto.TenantCode} already exists"); + } + + var tenant = new GwTenant + { + Id = GenerateId(), + TenantCode = dto.TenantCode, + TenantName = dto.TenantName, + Status = 1 + }; + await db.Tenants.AddAsync(tenant); + await db.SaveChangesAsync(); + + return Ok(tenant); + } + + [HttpDelete("tenants/{id}")] + public async Task DeleteTenant(long id) + { + await using var db = _dbContextFactory.CreateDbContext(); + var tenant = await db.Tenants.FindAsync(id); + if (tenant == null) + return NotFound(); + + tenant.IsDeleted = true; + await db.SaveChangesAsync(); + + return Ok(); + } + + [HttpGet("tenants/{tenantCode}/routes")] + public async Task GetTenantRoutes(string tenantCode) + { + await using var db = _dbContextFactory.CreateDbContext(); + var routes = await db.TenantRoutes + .Where(r => r.TenantCode == tenantCode && !r.IsDeleted) + .ToListAsync(); + return Ok(routes); + } + + [HttpPost("tenants/{tenantCode}/routes")] + public async Task CreateTenantRoute(string tenantCode, [FromBody] CreateTenantRouteDto dto) + { + await using var db = _dbContextFactory.CreateDbContext(); + var tenant = await db.Tenants + .FirstOrDefaultAsync(t => t.TenantCode == tenantCode); + if (tenant == null) + return BadRequest($"Tenant {tenantCode} not found"); + + var clusterId = $"{tenantCode}-{dto.ServiceName}"; + var existing = await db.TenantRoutes + .FirstOrDefaultAsync(r => r.ClusterId == clusterId); + if (existing != null) + return BadRequest($"Route for {tenantCode}/{dto.ServiceName} already exists"); + + var route = new GwTenantRoute + { + Id = GenerateId(), + TenantCode = tenantCode, + ServiceName = dto.ServiceName, + ClusterId = clusterId, + PathPattern = dto.PathPattern, + Priority = 10, + Status = 1, + IsGlobal = false + }; + await db.TenantRoutes.AddAsync(route); + await db.SaveChangesAsync(); + + await _routeCache.ReloadAsync(); + + return Ok(route); + } + + [HttpGet("routes/global")] + public async Task GetGlobalRoutes() + { + await using var db = _dbContextFactory.CreateDbContext(); + var routes = await db.TenantRoutes + .Where(r => r.IsGlobal && !r.IsDeleted) + .ToListAsync(); + return Ok(routes); + } + + [HttpPost("routes/global")] + public async Task CreateGlobalRoute([FromBody] CreateGlobalRouteDto dto) + { + await using var db = _dbContextFactory.CreateDbContext(); + var existing = await db.TenantRoutes + .FirstOrDefaultAsync(r => r.ServiceName == dto.ServiceName && r.IsGlobal); + if (existing != null) + { + return BadRequest($"Global route for {dto.ServiceName} already exists"); + } + + var route = new GwTenantRoute + { + Id = GenerateId(), + TenantCode = string.Empty, + ServiceName = dto.ServiceName, + ClusterId = dto.ClusterId, + PathPattern = dto.PathPattern, + Priority = 0, + Status = 1, + IsGlobal = true + }; + await db.TenantRoutes.AddAsync(route); + await db.SaveChangesAsync(); + + await _routeCache.ReloadAsync(); + + return Ok(route); + } + + [HttpDelete("routes/{id}")] + public async Task DeleteRoute(long id) + { + await using var db = _dbContextFactory.CreateDbContext(); + var route = await db.TenantRoutes.FindAsync(id); + if (route == null) + return NotFound(); + + route.IsDeleted = true; + await db.SaveChangesAsync(); + + await _routeCache.ReloadAsync(); + + return Ok(); + } + + [HttpGet("clusters/{clusterId}/instances")] + public async Task GetInstances(string clusterId) + { + await using var db = _dbContextFactory.CreateDbContext(); + var instances = await db.ServiceInstances + .Where(i => i.ClusterId == clusterId && !i.IsDeleted) + .ToListAsync(); + return Ok(instances); + } + + [HttpPost("clusters/{clusterId}/instances")] + public async Task AddInstance(string clusterId, [FromBody] CreateInstanceDto dto) + { + await using var db = _dbContextFactory.CreateDbContext(); + var existing = await db.ServiceInstances + .FirstOrDefaultAsync(i => i.ClusterId == clusterId && i.DestinationId == dto.DestinationId); + if (existing != null) + return BadRequest($"Instance {dto.DestinationId} already exists in cluster {clusterId}"); + + var instance = new GwServiceInstance + { + Id = GenerateId(), + ClusterId = clusterId, + DestinationId = dto.DestinationId, + Address = dto.Address, + Weight = dto.Weight, + Health = 1, + Status = 1 + }; + await db.ServiceInstances.AddAsync(instance); + await db.SaveChangesAsync(); + + await _clusterProvider.ReloadAsync(); + + return Ok(instance); + } + + [HttpDelete("instances/{id}")] + public async Task DeleteInstance(long id) + { + await using var db = _dbContextFactory.CreateDbContext(); + var instance = await db.ServiceInstances.FindAsync(id); + if (instance == null) + return NotFound(); + + instance.IsDeleted = true; + await db.SaveChangesAsync(); + + await _clusterProvider.ReloadAsync(); + + return Ok(); + } + + [HttpPost("reload")] + public async Task ReloadConfig() + { + await _routeCache.ReloadAsync(); + await _routeProvider.ReloadAsync(); + await _clusterProvider.ReloadAsync(); + return Ok(new { message = "Config reloaded successfully" }); + } + + private long GenerateId() + { + return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + } + + public class CreateTenantDto + { + public string TenantCode { get; set; } = string.Empty; + public string TenantName { get; set; } = string.Empty; + } + + public class CreateTenantRouteDto + { + public string ServiceName { get; set; } = string.Empty; + public string PathPattern { get; set; } = string.Empty; + } + + public class CreateGlobalRouteDto + { + public string ServiceName { get; set; } = string.Empty; + public string ClusterId { get; set; } = string.Empty; + public string PathPattern { get; set; } = string.Empty; + } + + public class CreateInstanceDto + { + public string DestinationId { get; set; } = string.Empty; + public string Address { get; set; } = string.Empty; + public int Weight { get; set; } = 1; + } +} diff --git a/src/YarpGateway/Data/GatewayDbContext.cs b/src/YarpGateway/Data/GatewayDbContext.cs new file mode 100644 index 0000000..a581d6f --- /dev/null +++ b/src/YarpGateway/Data/GatewayDbContext.cs @@ -0,0 +1,52 @@ +using Microsoft.EntityFrameworkCore; +using YarpGateway.Models; + +namespace YarpGateway.Data; + +public class GatewayDbContext : DbContext +{ + public GatewayDbContext(DbContextOptions options) + : base(options) + { + } + + public DbSet Tenants => Set(); + public DbSet TenantRoutes => Set(); + public DbSet ServiceInstances => Set(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + entity.Property(e => e.TenantCode).HasMaxLength(50).IsRequired(); + entity.Property(e => e.TenantName).HasMaxLength(100).IsRequired(); + entity.HasIndex(e => e.TenantCode).IsUnique(); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + entity.Property(e => e.TenantCode).HasMaxLength(50); + entity.Property(e => e.ServiceName).HasMaxLength(100).IsRequired(); + entity.Property(e => e.ClusterId).HasMaxLength(100).IsRequired(); + entity.Property(e => e.PathPattern).HasMaxLength(200).IsRequired(); + entity.HasIndex(e => e.TenantCode); + entity.HasIndex(e => e.ServiceName); + entity.HasIndex(e => e.ClusterId); + entity.HasIndex(e => new { e.ServiceName, e.IsGlobal, e.Status }); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + entity.Property(e => e.ClusterId).HasMaxLength(100).IsRequired(); + entity.Property(e => e.DestinationId).HasMaxLength(100).IsRequired(); + entity.Property(e => e.Address).HasMaxLength(200).IsRequired(); + entity.HasIndex(e => new { e.ClusterId, e.DestinationId }).IsUnique(); + entity.HasIndex(e => e.Health); + }); + + base.OnModelCreating(modelBuilder); + } +} diff --git a/src/YarpGateway/Data/GatewayDbContextFactory.cs b/src/YarpGateway/Data/GatewayDbContextFactory.cs new file mode 100644 index 0000000..1dba2f2 --- /dev/null +++ b/src/YarpGateway/Data/GatewayDbContextFactory.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; + +namespace YarpGateway.Data; + +public class GatewayDbContextFactory : IDesignTimeDbContextFactory +{ + public GatewayDbContext CreateDbContext(string[] args) + { + var configuration = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: false) + .Build(); + + var optionsBuilder = new DbContextOptionsBuilder(); + var connectionString = configuration.GetConnectionString("DefaultConnection"); + optionsBuilder.UseNpgsql(connectionString); + + return new GatewayDbContext(optionsBuilder.Options); + } +} diff --git a/src/YarpGateway/Dockerfile b/src/YarpGateway/Dockerfile new file mode 100644 index 0000000..1fca072 --- /dev/null +++ b/src/YarpGateway/Dockerfile @@ -0,0 +1,14 @@ +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base +WORKDIR /app +EXPOSE 8080 + +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +WORKDIR /src +COPY . . +RUN dotnet restore +RUN dotnet publish -c Release -o /app/publish + +FROM base AS final +WORKDIR /app +COPY --from=build /app/publish . +ENTRYPOINT ["dotnet", "YarpGateway.dll"] diff --git a/src/YarpGateway/DynamicProxy/DynamicProxyConfigProvider.cs b/src/YarpGateway/DynamicProxy/DynamicProxyConfigProvider.cs new file mode 100644 index 0000000..8cb68c7 --- /dev/null +++ b/src/YarpGateway/DynamicProxy/DynamicProxyConfigProvider.cs @@ -0,0 +1,69 @@ +using Microsoft.Extensions.Primitives; +using Yarp.ReverseProxy.Configuration; +using YarpGateway.Config; + +namespace YarpGateway.DynamicProxy; + +public class DynamicProxyConfigProvider : IProxyConfigProvider +{ + private volatile IProxyConfig _config; + private readonly DatabaseRouteConfigProvider _routeProvider; + private readonly DatabaseClusterConfigProvider _clusterProvider; + private readonly object _lock = new(); + + public DynamicProxyConfigProvider( + DatabaseRouteConfigProvider routeProvider, + DatabaseClusterConfigProvider clusterProvider) + { + _routeProvider = routeProvider; + _clusterProvider = clusterProvider; + UpdateConfig(); + } + + public IProxyConfig GetConfig() + { + return _config; + } + + public void UpdateConfig() + { + lock (_lock) + { + var routes = _routeProvider.GetRoutes(); + var clusters = _clusterProvider.GetClusters(); + + _config = new InMemoryProxyConfig( + routes, + clusters, + Array.Empty>() + ); + } + } + + public async Task ReloadAsync() + { + await _routeProvider.ReloadAsync(); + await _clusterProvider.ReloadAsync(); + UpdateConfig(); + } + + private class InMemoryProxyConfig : IProxyConfig + { + private static readonly CancellationChangeToken _nullChangeToken = new(new CancellationToken()); + + public InMemoryProxyConfig( + IReadOnlyList routes, + IReadOnlyList clusters, + IReadOnlyList> transforms) + { + Routes = routes; + Clusters = clusters; + Transforms = transforms; + } + + public IReadOnlyList Routes { get; } + public IReadOnlyList Clusters { get; } + public IReadOnlyList> Transforms { get; } + public IChangeToken ChangeToken => _nullChangeToken; + } +} diff --git a/src/YarpGateway/LoadBalancing/DistributedWeightedRoundRobinPolicy.cs b/src/YarpGateway/LoadBalancing/DistributedWeightedRoundRobinPolicy.cs new file mode 100644 index 0000000..9921ffa --- /dev/null +++ b/src/YarpGateway/LoadBalancing/DistributedWeightedRoundRobinPolicy.cs @@ -0,0 +1,243 @@ +using System.Text.Json; +using Microsoft.Extensions.Logging; +using StackExchange.Redis; +using Yarp.ReverseProxy.LoadBalancing; +using Yarp.ReverseProxy.Model; +using YarpGateway.Config; + +namespace YarpGateway.LoadBalancing; + +public class DistributedWeightedRoundRobinPolicy : ILoadBalancingPolicy +{ + private readonly IConnectionMultiplexer _redis; + private readonly RedisConfig _config; + private readonly ILogger _logger; + + public string Name => "DistributedWeightedRoundRobin"; + + public DistributedWeightedRoundRobinPolicy( + IConnectionMultiplexer redis, + RedisConfig config, + ILogger logger + ) + { + _redis = redis; + _config = config; + _logger = logger; + } + + public DestinationState? PickDestination( + HttpContext context, + ClusterState cluster, + IReadOnlyList availableDestinations + ) + { + if (availableDestinations.Count == 0) + return null; + + if (availableDestinations.Count == 1) + return availableDestinations[0]; + + var clusterId = cluster.ClusterId; + var db = _redis.GetDatabase(); + + var lockKey = $"lock:{_config.InstanceName}:{clusterId}"; + var stateKey = $"lb:{_config.InstanceName}:{clusterId}:state"; + + var lockValue = Guid.NewGuid().ToString(); + var lockAcquired = db.StringSet( + lockKey, + lockValue, + TimeSpan.FromMilliseconds(500), + When.NotExists + ); + + if (!lockAcquired) + { + _logger.LogDebug( + "Lock busy for cluster {Cluster}, using fallback selection", + clusterId + ); + return FallbackSelection(availableDestinations); + } + + try + { + var state = GetOrCreateLoadBalancingState(db, stateKey, availableDestinations); + + var selectedDestination = SelectByWeight(state, availableDestinations); + + UpdateCurrentWeights(db, stateKey, state, selectedDestination); + + _logger.LogDebug( + "Selected {Destination} for cluster {Cluster}", + selectedDestination?.DestinationId, + clusterId + ); + + return selectedDestination; + } + catch (Exception ex) + { + _logger.LogError( + ex, + "Error in distributed load balancing for cluster {Cluster}", + clusterId + ); + return availableDestinations[0]; + } + finally + { + var script = + @" + if redis.call('GET', KEYS[1]) == ARGV[1] then + return redis.call('DEL', KEYS[1]) + else + return 0 + end"; + db.ScriptEvaluate(script, new RedisKey[] { lockKey }, new RedisValue[] { lockValue }); + } + } + + private LoadBalancingState GetOrCreateLoadBalancingState( + IDatabase db, + string stateKey, + IReadOnlyList destinations + ) + { + var existingState = db.StringGet(stateKey); + + if (existingState.HasValue) + { + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + ; + var parsedState = (LoadBalancingState?) + System.Text.Json.JsonSerializer.Deserialize( + existingState.ToString(), + options + ); + var version = ComputeConfigHash(destinations); + + if ( + parsedState != null + && parsedState.ConfigHash == version + && parsedState.CurrentWeights != null + ) + { + return parsedState; + } + } + + var newState = new LoadBalancingState + { + ConfigHash = ComputeConfigHash(destinations), + CurrentWeights = new Dictionary(), + }; + + foreach (var dest in destinations) + { + var weight = GetWeight(dest); + newState.CurrentWeights[dest.DestinationId] = 0; + } + + var json = System.Text.Json.JsonSerializer.Serialize(newState); + db.StringSet(stateKey, json, TimeSpan.FromHours(1)); + + return newState; + } + + private long ComputeConfigHash(IReadOnlyList destinations) + { + var hash = 0L; + foreach (var dest in destinations.OrderBy(d => d.DestinationId)) + { + var weight = GetWeight(dest); + hash = HashCode.Combine(hash, dest.DestinationId.GetHashCode()); + hash = HashCode.Combine(hash, weight); + } + return hash; + } + + private void UpdateCurrentWeights( + IDatabase db, + string stateKey, + LoadBalancingState state, + DestinationState? selected + ) + { + if (selected == null) + return; + + var json = JsonSerializer.Serialize(state); + db.StringSet(stateKey, json, TimeSpan.FromHours(1)); + } + + private DestinationState? SelectByWeight( + LoadBalancingState state, + IReadOnlyList destinations + ) + { + int maxWeight = int.MinValue; + int totalWeight = 0; + DestinationState? selected = null; + + foreach (var dest in destinations) + { + if (!state.CurrentWeights.ContainsKey(dest.DestinationId)) + { + state.CurrentWeights[dest.DestinationId] = 0; + } + + var weight = GetWeight(dest); + var currentWeight = state.CurrentWeights[dest.DestinationId]; + + var newWeight = currentWeight + weight; + state.CurrentWeights[dest.DestinationId] = newWeight; + totalWeight += weight; + + if (newWeight > maxWeight) + { + maxWeight = newWeight; + selected = dest; + } + } + + if (selected != null) + { + state.CurrentWeights[selected.DestinationId] = maxWeight - totalWeight; + } + + return selected; + } + + private DestinationState? FallbackSelection(IReadOnlyList destinations) + { + var hash = ComputeRequestHash(); + var index = Math.Abs(hash % destinations.Count); + return destinations[index]; + } + + private int ComputeRequestHash() + { + var now = DateTime.UtcNow; + return HashCode.Combine(now.Second.GetHashCode(), now.Millisecond.GetHashCode()); + } + + private int GetWeight(DestinationState destination) + { + if ( + destination.Model?.Config?.Metadata?.TryGetValue("Weight", out var weightStr) == true + && int.TryParse(weightStr, out var weight) + ) + { + return weight; + } + return 1; + } + + private class LoadBalancingState + { + public long ConfigHash { get; set; } + public Dictionary CurrentWeights { get; set; } = new(); + } +} diff --git a/src/YarpGateway/Metrics/GatewayMetrics.cs b/src/YarpGateway/Metrics/GatewayMetrics.cs new file mode 100644 index 0000000..48af459 --- /dev/null +++ b/src/YarpGateway/Metrics/GatewayMetrics.cs @@ -0,0 +1,30 @@ +using System.Diagnostics.Metrics; + +namespace YarpGateway.Metrics; + +public class GatewayMetrics +{ + private readonly Counter _requestsTotal; + private readonly Histogram _requestDuration; + + public GatewayMetrics(IMeterFactory meterFactory) + { + var meter = meterFactory.Create("fengling.gateway"); + _requestsTotal = meter.CreateCounter( + "gateway_requests_total", + "Total number of requests"); + _requestDuration = meter.CreateHistogram( + "gateway_request_duration_seconds", + "Request duration in seconds"); + } + + public void RecordRequest(string tenant, string service, int statusCode, double duration) + { + var tag = new KeyValuePair("tenant", tenant); + var tag2 = new KeyValuePair("service", service); + var tag3 = new KeyValuePair("status", statusCode.ToString()); + + _requestsTotal.Add(1, tag, tag2, tag3); + _requestDuration.Record(duration, tag, tag2); + } +} diff --git a/src/YarpGateway/Middleware/JwtTransformMiddleware.cs b/src/YarpGateway/Middleware/JwtTransformMiddleware.cs new file mode 100644 index 0000000..19998c2 --- /dev/null +++ b/src/YarpGateway/Middleware/JwtTransformMiddleware.cs @@ -0,0 +1,83 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.Extensions.Options; +using YarpGateway.Config; + +namespace YarpGateway.Middleware; + +public class JwtTransformMiddleware +{ + private readonly RequestDelegate _next; + private readonly JwtConfig _jwtConfig; + private readonly ILogger _logger; + + public JwtTransformMiddleware( + RequestDelegate next, + IOptions jwtConfig, + ILogger logger + ) + { + _next = next; + _jwtConfig = jwtConfig.Value; + _logger = logger; + } + + public async Task InvokeAsync(HttpContext context) + { + var authHeader = context.Request.Headers["Authorization"].FirstOrDefault(); + if (string.IsNullOrEmpty(authHeader) || !authHeader.StartsWith("Bearer ")) + { + await _next(context); + return; + } + + var token = authHeader.Substring("Bearer ".Length).Trim(); + + try + { + var jwtHandler = new JwtSecurityTokenHandler(); + var jwtToken = jwtHandler.ReadJwtToken(token); + + var tenantId = jwtToken.Claims.FirstOrDefault(c => c.Type == "tenant")?.Value; + var userId = jwtToken + .Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier) + ?.Value; + var userName = jwtToken.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name)?.Value; + var roles = jwtToken + .Claims.Where(c => c.Type == ClaimTypes.Role) + .Select(c => c.Value) + .ToList(); + + if (!string.IsNullOrEmpty(tenantId)) + { + context.Request.Headers["X-Tenant-Id"] = tenantId; + + if (!string.IsNullOrEmpty(userId)) + context.Request.Headers["X-User-Id"] = userId; + + if (!string.IsNullOrEmpty(userName)) + context.Request.Headers["X-User-Name"] = userName; + + if (roles.Any()) + context.Request.Headers["X-Roles"] = string.Join(",", roles); + + _logger.LogInformation( + "JWT transformed - Tenant: {Tenant}, User: {User}", + tenantId, + userId + ); + } + else + { + _logger.LogWarning("JWT missing tenant claim"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to parse JWT token"); + } + + await _next(context); + } +} diff --git a/src/YarpGateway/Middleware/TenantRoutingMiddleware.cs b/src/YarpGateway/Middleware/TenantRoutingMiddleware.cs new file mode 100644 index 0000000..ab0301d --- /dev/null +++ b/src/YarpGateway/Middleware/TenantRoutingMiddleware.cs @@ -0,0 +1,63 @@ +using Microsoft.Extensions.Options; +using System.Text.RegularExpressions; +using YarpGateway.Services; + +namespace YarpGateway.Middleware; + +public class TenantRoutingMiddleware +{ + private readonly RequestDelegate _next; + private readonly IRouteCache _routeCache; + private readonly ILogger _logger; + + public TenantRoutingMiddleware( + RequestDelegate next, + IRouteCache routeCache, + ILogger logger) + { + _next = next; + _routeCache = routeCache; + _logger = logger; + } + + public async Task InvokeAsync(HttpContext context) + { + var tenantId = context.Request.Headers["X-Tenant-Id"].FirstOrDefault(); + if (string.IsNullOrEmpty(tenantId)) + { + await _next(context); + return; + } + + var path = context.Request.Path.Value ?? string.Empty; + var serviceName = ExtractServiceName(path); + + if (string.IsNullOrEmpty(serviceName)) + { + await _next(context); + return; + } + + var route = _routeCache.GetRoute(tenantId, serviceName); + if (route == null) + { + _logger.LogWarning("Route not found - Tenant: {Tenant}, Service: {Service}", tenantId, serviceName); + await _next(context); + return; + } + + context.Items["DynamicClusterId"] = route.ClusterId; + + var routeType = route.IsGlobal ? "global" : "tenant-specific"; + _logger.LogInformation("Tenant routing - Tenant: {Tenant}, Service: {Service}, Cluster: {Cluster}, Type: {Type}", + tenantId, serviceName, route.ClusterId, routeType); + + await _next(context); + } + + private string ExtractServiceName(string path) + { + var match = Regex.Match(path, @"/api/(\w+)/?"); + return match.Success ? match.Groups[1].Value : string.Empty; + } +} diff --git a/src/YarpGateway/Migrations/20260201120312_InitialCreate.Designer.cs b/src/YarpGateway/Migrations/20260201120312_InitialCreate.Designer.cs new file mode 100644 index 0000000..3f76f9c --- /dev/null +++ b/src/YarpGateway/Migrations/20260201120312_InitialCreate.Designer.cs @@ -0,0 +1,209 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using YarpGateway.Data; + +#nullable disable + +namespace YarpGateway.Migrations +{ + [DbContext(typeof(GatewayDbContext))] + [Migration("20260201120312_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("YarpGateway.Models.GwServiceInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DestinationId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Health") + .HasColumnType("integer"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.Property("Weight") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Health"); + + b.HasIndex("ClusterId", "DestinationId") + .IsUnique(); + + b.ToTable("ServiceInstances"); + }); + + modelBuilder.Entity("YarpGateway.Models.GwTenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TenantCode") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("TenantName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantCode") + .IsUnique(); + + b.ToTable("Tenants"); + }); + + modelBuilder.Entity("YarpGateway.Models.GwTenantRoute", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("PathPattern") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ServiceName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TenantCode") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ClusterId"); + + b.HasIndex("TenantCode", "ServiceName") + .IsUnique(); + + b.ToTable("TenantRoutes"); + }); + + modelBuilder.Entity("YarpGateway.Models.GwTenantRoute", b => + { + b.HasOne("YarpGateway.Models.GwTenant", null) + .WithMany() + .HasForeignKey("TenantCode") + .HasPrincipalKey("TenantCode") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/YarpGateway/Migrations/20260201120312_InitialCreate.cs b/src/YarpGateway/Migrations/20260201120312_InitialCreate.cs new file mode 100644 index 0000000..870368f --- /dev/null +++ b/src/YarpGateway/Migrations/20260201120312_InitialCreate.cs @@ -0,0 +1,133 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace YarpGateway.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "ServiceInstances", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ClusterId = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + DestinationId = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + Address = table.Column(type: "character varying(200)", maxLength: 200, nullable: false), + Health = table.Column(type: "integer", nullable: false), + Weight = table.Column(type: "integer", nullable: false), + Status = table.Column(type: "integer", nullable: false), + CreatedBy = table.Column(type: "bigint", nullable: true), + CreatedTime = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedBy = table.Column(type: "bigint", nullable: true), + UpdatedTime = table.Column(type: "timestamp with time zone", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false), + Version = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ServiceInstances", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Tenants", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + TenantCode = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), + TenantName = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + Status = table.Column(type: "integer", nullable: false), + CreatedBy = table.Column(type: "bigint", nullable: true), + CreatedTime = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedBy = table.Column(type: "bigint", nullable: true), + UpdatedTime = table.Column(type: "timestamp with time zone", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false), + Version = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Tenants", x => x.Id); + table.UniqueConstraint("AK_Tenants_TenantCode", x => x.TenantCode); + }); + + migrationBuilder.CreateTable( + name: "TenantRoutes", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + TenantCode = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), + ServiceName = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + ClusterId = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + PathPattern = table.Column(type: "character varying(200)", maxLength: 200, nullable: false), + Priority = table.Column(type: "integer", nullable: false), + Status = table.Column(type: "integer", nullable: false), + CreatedBy = table.Column(type: "bigint", nullable: true), + CreatedTime = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedBy = table.Column(type: "bigint", nullable: true), + UpdatedTime = table.Column(type: "timestamp with time zone", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false), + Version = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_TenantRoutes", x => x.Id); + table.ForeignKey( + name: "FK_TenantRoutes_Tenants_TenantCode", + column: x => x.TenantCode, + principalTable: "Tenants", + principalColumn: "TenantCode", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_ServiceInstances_ClusterId_DestinationId", + table: "ServiceInstances", + columns: new[] { "ClusterId", "DestinationId" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ServiceInstances_Health", + table: "ServiceInstances", + column: "Health"); + + migrationBuilder.CreateIndex( + name: "IX_TenantRoutes_ClusterId", + table: "TenantRoutes", + column: "ClusterId"); + + migrationBuilder.CreateIndex( + name: "IX_TenantRoutes_TenantCode_ServiceName", + table: "TenantRoutes", + columns: new[] { "TenantCode", "ServiceName" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Tenants_TenantCode", + table: "Tenants", + column: "TenantCode", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ServiceInstances"); + + migrationBuilder.DropTable( + name: "TenantRoutes"); + + migrationBuilder.DropTable( + name: "Tenants"); + } + } +} diff --git a/src/YarpGateway/Migrations/20260201133826_AddIsGlobalToTenantRoute.Designer.cs b/src/YarpGateway/Migrations/20260201133826_AddIsGlobalToTenantRoute.Designer.cs new file mode 100644 index 0000000..1466a7c --- /dev/null +++ b/src/YarpGateway/Migrations/20260201133826_AddIsGlobalToTenantRoute.Designer.cs @@ -0,0 +1,205 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using YarpGateway.Data; + +#nullable disable + +namespace YarpGateway.Migrations +{ + [DbContext(typeof(GatewayDbContext))] + [Migration("20260201133826_AddIsGlobalToTenantRoute")] + partial class AddIsGlobalToTenantRoute + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("YarpGateway.Models.GwServiceInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DestinationId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Health") + .HasColumnType("integer"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.Property("Weight") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Health"); + + b.HasIndex("ClusterId", "DestinationId") + .IsUnique(); + + b.ToTable("ServiceInstances"); + }); + + modelBuilder.Entity("YarpGateway.Models.GwTenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TenantCode") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("TenantName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantCode") + .IsUnique(); + + b.ToTable("Tenants"); + }); + + modelBuilder.Entity("YarpGateway.Models.GwTenantRoute", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsGlobal") + .HasColumnType("boolean"); + + b.Property("PathPattern") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ServiceName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TenantCode") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ClusterId"); + + b.HasIndex("ServiceName"); + + b.HasIndex("TenantCode"); + + b.HasIndex("ServiceName", "IsGlobal", "Status"); + + b.ToTable("TenantRoutes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/YarpGateway/Migrations/20260201133826_AddIsGlobalToTenantRoute.cs b/src/YarpGateway/Migrations/20260201133826_AddIsGlobalToTenantRoute.cs new file mode 100644 index 0000000..b2959df --- /dev/null +++ b/src/YarpGateway/Migrations/20260201133826_AddIsGlobalToTenantRoute.cs @@ -0,0 +1,87 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace YarpGateway.Migrations +{ + /// + public partial class AddIsGlobalToTenantRoute : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_TenantRoutes_Tenants_TenantCode", + table: "TenantRoutes"); + + migrationBuilder.DropUniqueConstraint( + name: "AK_Tenants_TenantCode", + table: "Tenants"); + + migrationBuilder.DropIndex( + name: "IX_TenantRoutes_TenantCode_ServiceName", + table: "TenantRoutes"); + + migrationBuilder.AddColumn( + name: "IsGlobal", + table: "TenantRoutes", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.CreateIndex( + name: "IX_TenantRoutes_ServiceName", + table: "TenantRoutes", + column: "ServiceName"); + + migrationBuilder.CreateIndex( + name: "IX_TenantRoutes_ServiceName_IsGlobal_Status", + table: "TenantRoutes", + columns: new[] { "ServiceName", "IsGlobal", "Status" }); + + migrationBuilder.CreateIndex( + name: "IX_TenantRoutes_TenantCode", + table: "TenantRoutes", + column: "TenantCode"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_TenantRoutes_ServiceName", + table: "TenantRoutes"); + + migrationBuilder.DropIndex( + name: "IX_TenantRoutes_ServiceName_IsGlobal_Status", + table: "TenantRoutes"); + + migrationBuilder.DropIndex( + name: "IX_TenantRoutes_TenantCode", + table: "TenantRoutes"); + + migrationBuilder.DropColumn( + name: "IsGlobal", + table: "TenantRoutes"); + + migrationBuilder.AddUniqueConstraint( + name: "AK_Tenants_TenantCode", + table: "Tenants", + column: "TenantCode"); + + migrationBuilder.CreateIndex( + name: "IX_TenantRoutes_TenantCode_ServiceName", + table: "TenantRoutes", + columns: new[] { "TenantCode", "ServiceName" }, + unique: true); + + migrationBuilder.AddForeignKey( + name: "FK_TenantRoutes_Tenants_TenantCode", + table: "TenantRoutes", + column: "TenantCode", + principalTable: "Tenants", + principalColumn: "TenantCode", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/src/YarpGateway/Migrations/GatewayDbContextModelSnapshot.cs b/src/YarpGateway/Migrations/GatewayDbContextModelSnapshot.cs new file mode 100644 index 0000000..9ff7b99 --- /dev/null +++ b/src/YarpGateway/Migrations/GatewayDbContextModelSnapshot.cs @@ -0,0 +1,202 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using YarpGateway.Data; + +#nullable disable + +namespace YarpGateway.Migrations +{ + [DbContext(typeof(GatewayDbContext))] + partial class GatewayDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("YarpGateway.Models.GwServiceInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DestinationId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Health") + .HasColumnType("integer"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.Property("Weight") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Health"); + + b.HasIndex("ClusterId", "DestinationId") + .IsUnique(); + + b.ToTable("ServiceInstances"); + }); + + modelBuilder.Entity("YarpGateway.Models.GwTenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TenantCode") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("TenantName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantCode") + .IsUnique(); + + b.ToTable("Tenants"); + }); + + modelBuilder.Entity("YarpGateway.Models.GwTenantRoute", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedBy") + .HasColumnType("bigint"); + + b.Property("CreatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsGlobal") + .HasColumnType("boolean"); + + b.Property("PathPattern") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ServiceName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TenantCode") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("UpdatedBy") + .HasColumnType("bigint"); + + b.Property("UpdatedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ClusterId"); + + b.HasIndex("ServiceName"); + + b.HasIndex("TenantCode"); + + b.HasIndex("ServiceName", "IsGlobal", "Status"); + + b.ToTable("TenantRoutes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/YarpGateway/Migrations/script.sql b/src/YarpGateway/Migrations/script.sql new file mode 100644 index 0000000..9a8b36d --- /dev/null +++ b/src/YarpGateway/Migrations/script.sql @@ -0,0 +1,89 @@ +CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" ( + "MigrationId" character varying(150) NOT NULL, + "ProductVersion" character varying(32) NOT NULL, + CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY ("MigrationId") +); + +START TRANSACTION; +CREATE TABLE "ServiceInstances" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "ClusterId" character varying(100) NOT NULL, + "DestinationId" character varying(100) NOT NULL, + "Address" character varying(200) NOT NULL, + "Health" integer NOT NULL, + "Weight" integer NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_ServiceInstances" PRIMARY KEY ("Id") +); + +CREATE TABLE "Tenants" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "TenantCode" character varying(50) NOT NULL, + "TenantName" character varying(100) NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_Tenants" PRIMARY KEY ("Id"), + CONSTRAINT "AK_Tenants_TenantCode" UNIQUE ("TenantCode") +); + +CREATE TABLE "TenantRoutes" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "TenantCode" character varying(50) NOT NULL, + "ServiceName" character varying(100) NOT NULL, + "ClusterId" character varying(100) NOT NULL, + "PathPattern" character varying(200) NOT NULL, + "Priority" integer NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_TenantRoutes" PRIMARY KEY ("Id"), + CONSTRAINT "FK_TenantRoutes_Tenants_TenantCode" FOREIGN KEY ("TenantCode") REFERENCES "Tenants" ("TenantCode") ON DELETE RESTRICT +); + +CREATE UNIQUE INDEX "IX_ServiceInstances_ClusterId_DestinationId" ON "ServiceInstances" ("ClusterId", "DestinationId"); + +CREATE INDEX "IX_ServiceInstances_Health" ON "ServiceInstances" ("Health"); + +CREATE INDEX "IX_TenantRoutes_ClusterId" ON "TenantRoutes" ("ClusterId"); + +CREATE UNIQUE INDEX "IX_TenantRoutes_TenantCode_ServiceName" ON "TenantRoutes" ("TenantCode", "ServiceName"); + +CREATE UNIQUE INDEX "IX_Tenants_TenantCode" ON "Tenants" ("TenantCode"); + +INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") +VALUES ('20260201120312_InitialCreate', '9.0.0'); + +ALTER TABLE "TenantRoutes" DROP CONSTRAINT "FK_TenantRoutes_Tenants_TenantCode"; + +ALTER TABLE "Tenants" DROP CONSTRAINT "AK_Tenants_TenantCode"; + +DROP INDEX "IX_TenantRoutes_TenantCode_ServiceName"; + +ALTER TABLE "TenantRoutes" ADD "IsGlobal" boolean NOT NULL DEFAULT FALSE; + +CREATE INDEX "IX_TenantRoutes_ServiceName" ON "TenantRoutes" ("ServiceName"); + +CREATE INDEX "IX_TenantRoutes_ServiceName_IsGlobal_Status" ON "TenantRoutes" ("ServiceName", "IsGlobal", "Status"); + +CREATE INDEX "IX_TenantRoutes_TenantCode" ON "TenantRoutes" ("TenantCode"); + +INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") +VALUES ('20260201133826_AddIsGlobalToTenantRoute', '9.0.0'); + +COMMIT; + diff --git a/src/YarpGateway/Models/GwServiceInstance.cs b/src/YarpGateway/Models/GwServiceInstance.cs new file mode 100644 index 0000000..d6a7a79 --- /dev/null +++ b/src/YarpGateway/Models/GwServiceInstance.cs @@ -0,0 +1,18 @@ +namespace YarpGateway.Models; + +public class GwServiceInstance +{ + public long Id { get; set; } + public string ClusterId { get; set; } = string.Empty; + public string DestinationId { get; set; } = string.Empty; + public string Address { get; set; } = string.Empty; + public int Health { get; set; } = 1; + public int Weight { get; set; } = 1; + public int Status { get; set; } = 1; + public long? CreatedBy { get; set; } + public DateTime CreatedTime { get; set; } = DateTime.UtcNow; + public long? UpdatedBy { get; set; } + public DateTime? UpdatedTime { get; set; } + public bool IsDeleted { get; set; } = false; + public int Version { get; set; } = 0; +} diff --git a/src/YarpGateway/Models/GwTenant.cs b/src/YarpGateway/Models/GwTenant.cs new file mode 100644 index 0000000..7ce5997 --- /dev/null +++ b/src/YarpGateway/Models/GwTenant.cs @@ -0,0 +1,15 @@ +namespace YarpGateway.Models; + +public class GwTenant +{ + public long Id { get; set; } + public string TenantCode { get; set; } = string.Empty; + public string TenantName { get; set; } = string.Empty; + public int Status { get; set; } = 1; + public long? CreatedBy { get; set; } + public DateTime CreatedTime { get; set; } = DateTime.UtcNow; + public long? UpdatedBy { get; set; } + public DateTime? UpdatedTime { get; set; } + public bool IsDeleted { get; set; } = false; + public int Version { get; set; } = 0; +} diff --git a/src/YarpGateway/Models/GwTenantRoute.cs b/src/YarpGateway/Models/GwTenantRoute.cs new file mode 100644 index 0000000..6a6a918 --- /dev/null +++ b/src/YarpGateway/Models/GwTenantRoute.cs @@ -0,0 +1,19 @@ +namespace YarpGateway.Models; + +public class GwTenantRoute +{ + public long Id { get; set; } + public string TenantCode { get; set; } = string.Empty; + public string ServiceName { get; set; } = string.Empty; + public string ClusterId { get; set; } = string.Empty; + public string PathPattern { get; set; } = string.Empty; + public int Priority { get; set; } = 0; + public int Status { get; set; } = 1; + public bool IsGlobal { get; set; } = false; + public long? CreatedBy { get; set; } + public DateTime CreatedTime { get; set; } = DateTime.UtcNow; + public long? UpdatedBy { get; set; } + public DateTime? UpdatedTime { get; set; } + public bool IsDeleted { get; set; } = false; + public int Version { get; set; } = 0; +} diff --git a/src/YarpGateway/Program.cs b/src/YarpGateway/Program.cs new file mode 100644 index 0000000..dd2983a --- /dev/null +++ b/src/YarpGateway/Program.cs @@ -0,0 +1,113 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using Serilog; +using Yarp.ReverseProxy.Configuration; +using Yarp.ReverseProxy.LoadBalancing; +using YarpGateway.Config; +using YarpGateway.Data; +using YarpGateway.DynamicProxy; +using YarpGateway.LoadBalancing; +using YarpGateway.Middleware; +using YarpGateway.Services; +using StackExchange.Redis; + +var builder = WebApplication.CreateBuilder(args); + +builder.Host.UseSerilog( + (context, services, configuration) => + configuration + .ReadFrom.Configuration(context.Configuration) + .ReadFrom.Services(services) + .Enrich.FromLogContext() +); + +builder.Services.Configure(builder.Configuration.GetSection("Jwt")); +builder.Services.Configure(builder.Configuration.GetSection("Redis")); +builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); + +builder.Services.AddDbContextFactory(options => + options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")) +); + +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +builder.Services.AddSingleton(); +builder.Services.AddSingleton(sp => +{ + var config = sp.GetRequiredService(); + var connectionOptions = ConfigurationOptions.Parse(config.ConnectionString); + connectionOptions.AbortOnConnectFail = false; + connectionOptions.ConnectRetry = 3; + connectionOptions.ConnectTimeout = 5000; + connectionOptions.SyncTimeout = 3000; + connectionOptions.DefaultDatabase = config.Database; + + var connection = ConnectionMultiplexer.Connect(connectionOptions); + connection.ConnectionFailed += (sender, e) => + { + Serilog.Log.Error(e.Exception, "Redis connection failed"); + }; + connection.ConnectionRestored += (sender, e) => + { + Serilog.Log.Information("Redis connection restored"); + }; + + return connection; +}); + +builder.Services.AddSingleton(); + +builder.Services.AddSingleton(); +builder.Services.AddSingleton(sp => sp.GetRequiredService()); + +var corsSettings = builder.Configuration.GetSection("Cors"); +builder.Services.AddCors(options => +{ + var allowAnyOrigin = corsSettings.GetValue("AllowAnyOrigin"); + var allowedOrigins = corsSettings.GetSection("AllowedOrigins").Get() ?? Array.Empty(); + + options.AddPolicy("AllowFrontend", policy => + { + if (allowAnyOrigin) + { + policy.AllowAnyOrigin(); + } + else + { + policy.WithOrigins(allowedOrigins); + } + + policy.AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +app.UseCors("AllowFrontend"); +app.UseMiddleware(); +app.UseMiddleware(); + +app.MapControllers(); +app.MapReverseProxy(); + +await app.Services.GetRequiredService().InitializeAsync(); + +try +{ + Log.Information("Starting YARP Gateway"); + app.Run(); +} +catch (Exception ex) +{ + Log.Fatal(ex, "Application terminated unexpectedly"); +} +finally +{ + Log.CloseAndFlush(); +} diff --git a/src/YarpGateway/Properties/launchSettings.json b/src/YarpGateway/Properties/launchSettings.json new file mode 100644 index 0000000..149e051 --- /dev/null +++ b/src/YarpGateway/Properties/launchSettings.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5046", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/YarpGateway/Services/RedisConnectionManager.cs b/src/YarpGateway/Services/RedisConnectionManager.cs new file mode 100644 index 0000000..e393bc6 --- /dev/null +++ b/src/YarpGateway/Services/RedisConnectionManager.cs @@ -0,0 +1,138 @@ +using StackExchange.Redis; +using System.Diagnostics; +using Microsoft.Extensions.Logging; +using YarpGateway.Config; + +namespace YarpGateway.Services; + +public interface IRedisConnectionManager +{ + IConnectionMultiplexer GetConnection(); + Task AcquireLockAsync(string key, TimeSpan? expiry = null); + Task ExecuteInLockAsync(string key, Func> func, TimeSpan? expiry = null); +} + +public class RedisConnectionManager : IRedisConnectionManager +{ + private readonly Lazy _lazyConnection; + private readonly RedisConfig _config; + private readonly ILogger _logger; + + public RedisConnectionManager(RedisConfig config, ILogger logger) + { + _config = config; + _logger = logger; + _lazyConnection = new Lazy(() => + { + var configuration = ConfigurationOptions.Parse(_config.ConnectionString); + configuration.AbortOnConnectFail = false; + configuration.ConnectRetry = 3; + configuration.ConnectTimeout = 5000; + configuration.SyncTimeout = 3000; + configuration.DefaultDatabase = _config.Database; + + var connection = ConnectionMultiplexer.Connect(configuration); + connection.ConnectionRestored += (sender, e) => + { + _logger.LogInformation("Redis connection restored"); + }; + connection.ConnectionFailed += (sender, e) => + { + _logger.LogError(e.Exception, "Redis connection failed"); + }; + + _logger.LogInformation("Connected to Redis at {ConnectionString}", _config.ConnectionString); + return connection; + }); + } + + public IConnectionMultiplexer GetConnection() + { + return _lazyConnection.Value; + } + + public async Task AcquireLockAsync(string key, TimeSpan? expiry = null) + { + var expiryTime = expiry ?? TimeSpan.FromSeconds(10); + var redis = GetConnection(); + var db = redis.GetDatabase(); + var lockKey = $"lock:{_config.InstanceName}:{key}"; + + var lockValue = Environment.MachineName + ":" + Process.GetCurrentProcess().Id; + var acquired = await db.StringSetAsync(lockKey, lockValue, expiryTime, When.NotExists); + + if (!acquired) + { + var backoff = TimeSpan.FromMilliseconds(100); + var retryCount = 0; + const int maxRetries = 50; + + while (!acquired && retryCount < maxRetries) + { + await Task.Delay(backoff); + acquired = await db.StringSetAsync(lockKey, lockValue, expiryTime, When.NotExists); + retryCount++; + if (retryCount < 10) + { + backoff = TimeSpan.FromMilliseconds(100 * (retryCount + 1)); + } + } + + if (!acquired) + { + throw new TimeoutException($"Failed to acquire lock for key: {lockKey}"); + } + } + + return new RedisLock(db, lockKey, lockValue, _logger); + } + + public async Task ExecuteInLockAsync(string key, Func> func, TimeSpan? expiry = null) + { + using var @lock = await AcquireLockAsync(key, expiry); + return await func(); + } + + private class RedisLock : IDisposable + { + private readonly IDatabase _db; + private readonly string _key; + private readonly string _value; + private readonly ILogger _logger; + private bool _disposed; + + public RedisLock(IDatabase db, string key, string value, ILogger logger) + { + _db = db; + _key = key; + _value = value; + _logger = logger; + } + + public void Dispose() + { + if (_disposed) return; + + try + { + var script = @" + if redis.call('GET', KEYS[1]) == ARGV[1] then + return redis.call('DEL', KEYS[1]) + else + return 0 + end"; + + _db.ScriptEvaluate(script, new RedisKey[] { _key }, new RedisValue[] { _value }); + _logger.LogDebug("Released lock for key: {Key}", _key); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to release lock for key: {Key}", _key); + } + finally + { + _disposed = true; + } + } + } +} diff --git a/src/YarpGateway/Services/RouteCache.cs b/src/YarpGateway/Services/RouteCache.cs new file mode 100644 index 0000000..aa9a026 --- /dev/null +++ b/src/YarpGateway/Services/RouteCache.cs @@ -0,0 +1,138 @@ +using System.Collections.Concurrent; +using YarpGateway.Models; +using YarpGateway.Data; +using Microsoft.Extensions.Logging; +using Microsoft.EntityFrameworkCore; + +namespace YarpGateway.Services; + +public class RouteInfo +{ + public long Id { get; set; } + public string ClusterId { get; set; } = string.Empty; + public string PathPattern { get; set; } = string.Empty; + public int Priority { get; set; } + public bool IsGlobal { get; set; } +} + +public interface IRouteCache +{ + Task InitializeAsync(); + Task ReloadAsync(); + RouteInfo? GetRoute(string tenantCode, string serviceName); + RouteInfo? GetRouteByPath(string path); +} + +public class RouteCache : IRouteCache +{ + private readonly IDbContextFactory _dbContextFactory; + private readonly ILogger _logger; + + private readonly ConcurrentDictionary _globalRoutes = new(); + private readonly ConcurrentDictionary> _tenantRoutes = new(); + private readonly ConcurrentDictionary _pathRoutes = new(); + private readonly ReaderWriterLockSlim _lock = new(); + + public RouteCache(IDbContextFactory dbContextFactory, ILogger logger) + { + _dbContextFactory = dbContextFactory; + _logger = logger; + } + + public async Task InitializeAsync() + { + _logger.LogInformation("Initializing route cache from database..."); + await LoadFromDatabaseAsync(); + _logger.LogInformation("Route cache initialized: {GlobalCount} global routes, {TenantCount} tenant routes", + _globalRoutes.Count, _tenantRoutes.Count); + } + + public async Task ReloadAsync() + { + _logger.LogInformation("Reloading route cache..."); + await LoadFromDatabaseAsync(); + _logger.LogInformation("Route cache reloaded"); + } + + public RouteInfo? GetRoute(string tenantCode, string serviceName) + { + _lock.EnterUpgradeableReadLock(); + try + { + // 1. 优先查找租户专用路由 + if (_tenantRoutes.TryGetValue(tenantCode, out var tenantRouteMap) && + tenantRouteMap.TryGetValue(serviceName, out var tenantRoute)) + { + _logger.LogDebug("Found tenant-specific route: {Tenant}/{Service} -> {Cluster}", + tenantCode, serviceName, tenantRoute.ClusterId); + return tenantRoute; + } + + // 2. 查找全局路由 + if (_globalRoutes.TryGetValue(serviceName, out var globalRoute)) + { + _logger.LogDebug("Found global route: {Service} -> {Cluster} for tenant {Tenant}", + serviceName, globalRoute.ClusterId, tenantCode); + return globalRoute; + } + + // 3. 没找到 + _logger.LogWarning("No route found for: {Tenant}/{Service}", tenantCode, serviceName); + return null; + } + finally + { + _lock.ExitUpgradeableReadLock(); + } + } + + public RouteInfo? GetRouteByPath(string path) + { + return _pathRoutes.TryGetValue(path, out var route) ? route : null; + } + + private async Task LoadFromDatabaseAsync() + { + using var db = _dbContextFactory.CreateDbContext(); + + var routes = await db.TenantRoutes + .Where(r => r.Status == 1 && !r.IsDeleted) + .ToListAsync(); + + _lock.EnterWriteLock(); + try + { + _globalRoutes.Clear(); + _tenantRoutes.Clear(); + _pathRoutes.Clear(); + + foreach (var route in routes) + { + var routeInfo = new RouteInfo + { + Id = route.Id, + ClusterId = route.ClusterId, + PathPattern = route.PathPattern, + Priority = route.Priority, + IsGlobal = route.IsGlobal + }; + + if (route.IsGlobal) + { + _globalRoutes[route.ServiceName] = routeInfo; + _pathRoutes[route.PathPattern] = routeInfo; + } + else if (!string.IsNullOrEmpty(route.TenantCode)) + { + _tenantRoutes.GetOrAdd(route.TenantCode, _ => new()) + [route.ServiceName] = routeInfo; + _pathRoutes[route.PathPattern] = routeInfo; + } + } + } + finally + { + _lock.ExitWriteLock(); + } + } +} diff --git a/src/YarpGateway/YarpGateway.csproj b/src/YarpGateway/YarpGateway.csproj new file mode 100644 index 0000000..a498881 --- /dev/null +++ b/src/YarpGateway/YarpGateway.csproj @@ -0,0 +1,23 @@ + + + + net10.0 + enable + enable + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + diff --git a/src/YarpGateway/appsettings.Development.json b/src/YarpGateway/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/src/YarpGateway/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/YarpGateway/appsettings.json b/src/YarpGateway/appsettings.json new file mode 100644 index 0000000..18088e8 --- /dev/null +++ b/src/YarpGateway/appsettings.json @@ -0,0 +1,64 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Yarp.ReverseProxy": "Information" + } + }, + "AllowedHosts": "*", + "Cors": { + "AllowedOrigins": [ + "http://localhost:5173", + "http://127.0.0.1:5173", + "http://localhost:5174" + ], + "AllowAnyOrigin": false + }, + "ConnectionStrings": { + "DefaultConnection": "Host=192.168.100.10;Port=5432;Database=fengling_gateway;Username=movingsam;Password=sl52788542" + }, + "Jwt": { + "Authority": "https://your-auth-server.com", + "Audience": "fengling-gateway", + "ValidateIssuer": true, + "ValidateAudience": true + }, + "Redis": { + "ConnectionString": "192.168.100.10:6379", + "Database": 0, + "InstanceName": "YarpGateway" + }, + "ReverseProxy": { + "Routes": {}, + "Clusters": {} + }, + "Serilog": { + "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "Console", + "Args": { + "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "logs/gateway-.log", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" + } + } + ], + "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"] + }, + "Kestrel": { + "Endpoints": { + "Http": { + "Url": "http://0.0.0.0:8080" + } + } + } +} diff --git a/src/YarpGateway/bin/Debug/net10.0/Humanizer.dll b/src/YarpGateway/bin/Debug/net10.0/Humanizer.dll new file mode 100755 index 0000000..c9a7ef8 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Humanizer.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll new file mode 100755 index 0000000..d6dda11 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.Bcl.AsyncInterfaces.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.Bcl.AsyncInterfaces.dll new file mode 100755 index 0000000..f5f1cee Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.Bcl.AsyncInterfaces.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.Build.Locator.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.Build.Locator.dll new file mode 100755 index 0000000..446d341 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.Build.Locator.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll new file mode 100755 index 0000000..2e99f76 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.CSharp.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.CSharp.dll new file mode 100755 index 0000000..8d56de1 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.CSharp.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll new file mode 100755 index 0000000..a17c676 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll new file mode 100755 index 0000000..f70a016 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.dll new file mode 100755 index 0000000..7253875 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.dll new file mode 100755 index 0000000..7d537db Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll new file mode 100755 index 0000000..e5b92b5 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Design.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Design.dll new file mode 100755 index 0000000..41cf45a Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Design.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Relational.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Relational.dll new file mode 100755 index 0000000..7e313e5 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Relational.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.dll new file mode 100755 index 0000000..f362a04 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.Extensions.DependencyModel.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.Extensions.DependencyModel.dll new file mode 100755 index 0000000..e8ee78b Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.Extensions.DependencyModel.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Abstractions.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Abstractions.dll new file mode 100755 index 0000000..e981f87 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Abstractions.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll new file mode 100755 index 0000000..25f2a7e Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Logging.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Logging.dll new file mode 100755 index 0000000..4ffdb25 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Logging.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll new file mode 100755 index 0000000..6c736d2 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.dll new file mode 100755 index 0000000..9f30508 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Tokens.dll b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Tokens.dll new file mode 100755 index 0000000..83ec83a Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Tokens.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Mono.TextTemplating.dll b/src/YarpGateway/bin/Debug/net10.0/Mono.TextTemplating.dll new file mode 100755 index 0000000..4a76511 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Mono.TextTemplating.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll b/src/YarpGateway/bin/Debug/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll new file mode 100755 index 0000000..fe1d2e1 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Npgsql.dll b/src/YarpGateway/bin/Debug/net10.0/Npgsql.dll new file mode 100755 index 0000000..5ab8f57 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Npgsql.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Pipelines.Sockets.Unofficial.dll b/src/YarpGateway/bin/Debug/net10.0/Pipelines.Sockets.Unofficial.dll new file mode 100755 index 0000000..c5b223d Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Pipelines.Sockets.Unofficial.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.AspNetCore.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.AspNetCore.dll new file mode 100755 index 0000000..36794d4 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.AspNetCore.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.Extensions.Hosting.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.Extensions.Hosting.dll new file mode 100755 index 0000000..2204d10 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.Extensions.Hosting.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.Extensions.Logging.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.Extensions.Logging.dll new file mode 100755 index 0000000..f2f78c7 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.Extensions.Logging.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.Formatting.Compact.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.Formatting.Compact.dll new file mode 100755 index 0000000..7174b83 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.Formatting.Compact.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.Settings.Configuration.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.Settings.Configuration.dll new file mode 100755 index 0000000..a8ff29d Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.Settings.Configuration.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.Console.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.Console.dll new file mode 100755 index 0000000..96c89a0 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.Console.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.Debug.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.Debug.dll new file mode 100755 index 0000000..2bd024b Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.Debug.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.File.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.File.dll new file mode 100755 index 0000000..17d80f3 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.File.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Serilog.dll b/src/YarpGateway/bin/Debug/net10.0/Serilog.dll new file mode 100755 index 0000000..28c98dd Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Serilog.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/StackExchange.Redis.dll b/src/YarpGateway/bin/Debug/net10.0/StackExchange.Redis.dll new file mode 100755 index 0000000..e6f45a3 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/StackExchange.Redis.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/System.CodeDom.dll b/src/YarpGateway/bin/Debug/net10.0/System.CodeDom.dll new file mode 100755 index 0000000..54c82b6 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/System.CodeDom.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/System.Composition.AttributedModel.dll b/src/YarpGateway/bin/Debug/net10.0/System.Composition.AttributedModel.dll new file mode 100755 index 0000000..1431751 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/System.Composition.AttributedModel.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/System.Composition.Convention.dll b/src/YarpGateway/bin/Debug/net10.0/System.Composition.Convention.dll new file mode 100755 index 0000000..e9dacb1 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/System.Composition.Convention.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/System.Composition.Hosting.dll b/src/YarpGateway/bin/Debug/net10.0/System.Composition.Hosting.dll new file mode 100755 index 0000000..8381202 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/System.Composition.Hosting.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/System.Composition.Runtime.dll b/src/YarpGateway/bin/Debug/net10.0/System.Composition.Runtime.dll new file mode 100755 index 0000000..d583c3a Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/System.Composition.Runtime.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/System.Composition.TypedParts.dll b/src/YarpGateway/bin/Debug/net10.0/System.Composition.TypedParts.dll new file mode 100755 index 0000000..2b278d7 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/System.Composition.TypedParts.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/System.IO.Hashing.dll b/src/YarpGateway/bin/Debug/net10.0/System.IO.Hashing.dll new file mode 100755 index 0000000..233a5c8 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/System.IO.Hashing.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/System.IdentityModel.Tokens.Jwt.dll b/src/YarpGateway/bin/Debug/net10.0/System.IdentityModel.Tokens.Jwt.dll new file mode 100755 index 0000000..c42b8d7 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/System.IdentityModel.Tokens.Jwt.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/Yarp.ReverseProxy.dll b/src/YarpGateway/bin/Debug/net10.0/Yarp.ReverseProxy.dll new file mode 100755 index 0000000..ce5217f Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/Yarp.ReverseProxy.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/YarpGateway b/src/YarpGateway/bin/Debug/net10.0/YarpGateway new file mode 100755 index 0000000..23ce3dc Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/YarpGateway differ diff --git a/src/YarpGateway/bin/Debug/net10.0/YarpGateway.deps.json b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.deps.json new file mode 100644 index 0000000..777e5ff --- /dev/null +++ b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.deps.json @@ -0,0 +1,1019 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": { + "YarpGateway/1.0.0": { + "dependencies": { + "Microsoft.AspNetCore.Authentication.JwtBearer": "10.0.0", + "Microsoft.EntityFrameworkCore.Design": "9.0.0", + "Npgsql.EntityFrameworkCore.PostgreSQL": "9.0.0", + "Serilog.AspNetCore": "8.0.0", + "Serilog.Sinks.Console": "6.0.0", + "Serilog.Sinks.File": "6.0.0", + "StackExchange.Redis": "2.8.16", + "Yarp.ReverseProxy": "2.2.0" + }, + "runtime": { + "YarpGateway.dll": {} + } + }, + "Humanizer.Core/2.14.1": { + "runtime": { + "lib/net6.0/Humanizer.dll": { + "assemblyVersion": "2.14.0.0", + "fileVersion": "2.14.1.48190" + } + } + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.0": { + "dependencies": { + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.0.1" + }, + "runtime": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "assemblyVersion": "10.0.0.0", + "fileVersion": "10.0.25.52411" + } + } + }, + "Microsoft.Bcl.AsyncInterfaces/7.0.0": { + "runtime": { + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { + "assemblyVersion": "7.0.0.0", + "fileVersion": "7.0.22.51805" + } + } + }, + "Microsoft.Build.Locator/1.7.8": { + "runtime": { + "lib/net6.0/Microsoft.Build.Locator.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.7.8.28074" + } + } + }, + "Microsoft.CodeAnalysis.Common/4.8.0": { + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.dll": { + "assemblyVersion": "4.8.0.0", + "fileVersion": "4.800.23.55801" + } + }, + "resources": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp/4.8.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.8.0" + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.dll": { + "assemblyVersion": "4.8.0.0", + "fileVersion": "4.800.23.55801" + } + }, + "resources": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces/4.8.0": { + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.CodeAnalysis.Common": "4.8.0", + "Microsoft.CodeAnalysis.Workspaces.Common": "4.8.0" + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll": { + "assemblyVersion": "4.8.0.0", + "fileVersion": "4.800.23.55801" + } + }, + "resources": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common/4.8.0": { + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "7.0.0", + "Microsoft.CodeAnalysis.Common": "4.8.0", + "System.Composition": "7.0.0" + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.dll": { + "assemblyVersion": "4.8.0.0", + "fileVersion": "4.800.23.55801" + } + }, + "resources": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.Workspaces.MSBuild/4.8.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.8.0", + "Microsoft.CodeAnalysis.Workspaces.Common": "4.8.0" + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll": { + "assemblyVersion": "4.8.0.0", + "fileVersion": "4.800.23.55801" + }, + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll": { + "assemblyVersion": "4.8.0.0", + "fileVersion": "4.800.23.55801" + } + }, + "resources": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.EntityFrameworkCore/9.0.0": { + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "9.0.0" + }, + "runtime": { + "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52902" + } + } + }, + "Microsoft.EntityFrameworkCore.Abstractions/9.0.0": { + "runtime": { + "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52902" + } + } + }, + "Microsoft.EntityFrameworkCore.Design/9.0.0": { + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Build.Locator": "1.7.8", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.8.0", + "Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.8.0", + "Microsoft.EntityFrameworkCore.Relational": "9.0.0", + "Microsoft.Extensions.DependencyModel": "9.0.0", + "Mono.TextTemplating": "3.0.0" + }, + "runtime": { + "lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52902" + } + } + }, + "Microsoft.EntityFrameworkCore.Relational/9.0.0": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "9.0.0" + }, + "runtime": { + "lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52902" + } + } + }, + "Microsoft.Extensions.DependencyModel/9.0.0": { + "runtime": { + "lib/net9.0/Microsoft.Extensions.DependencyModel.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.24.52809" + } + } + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.0.1", + "System.IdentityModel.Tokens.Jwt": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.0.1" + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "Mono.TextTemplating/3.0.0": { + "dependencies": { + "System.CodeDom": "6.0.0" + }, + "runtime": { + "lib/net6.0/Mono.TextTemplating.dll": { + "assemblyVersion": "3.0.0.0", + "fileVersion": "3.0.0.1" + } + } + }, + "Npgsql/9.0.0": { + "runtime": { + "lib/net8.0/Npgsql.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.0.0" + } + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/9.0.0": { + "dependencies": { + "Microsoft.EntityFrameworkCore": "9.0.0", + "Microsoft.EntityFrameworkCore.Relational": "9.0.0", + "Npgsql": "9.0.0" + }, + "runtime": { + "lib/net8.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "assemblyVersion": "9.0.0.0", + "fileVersion": "9.0.0.0" + } + } + }, + "Pipelines.Sockets.Unofficial/2.2.8": { + "runtime": { + "lib/net5.0/Pipelines.Sockets.Unofficial.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "2.2.8.1080" + } + } + }, + "Serilog/4.0.0": { + "runtime": { + "lib/net8.0/Serilog.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.0.0.0" + } + } + }, + "Serilog.AspNetCore/8.0.0": { + "dependencies": { + "Serilog": "4.0.0", + "Serilog.Extensions.Hosting": "8.0.0", + "Serilog.Extensions.Logging": "8.0.0", + "Serilog.Formatting.Compact": "2.0.0", + "Serilog.Settings.Configuration": "8.0.0", + "Serilog.Sinks.Console": "6.0.0", + "Serilog.Sinks.Debug": "2.0.0", + "Serilog.Sinks.File": "6.0.0" + }, + "runtime": { + "lib/net8.0/Serilog.AspNetCore.dll": { + "assemblyVersion": "0.0.0.0", + "fileVersion": "8.0.0.0" + } + } + }, + "Serilog.Extensions.Hosting/8.0.0": { + "dependencies": { + "Serilog": "4.0.0", + "Serilog.Extensions.Logging": "8.0.0" + }, + "runtime": { + "lib/net8.0/Serilog.Extensions.Hosting.dll": { + "assemblyVersion": "7.0.0.0", + "fileVersion": "8.0.0.0" + } + } + }, + "Serilog.Extensions.Logging/8.0.0": { + "dependencies": { + "Serilog": "4.0.0" + }, + "runtime": { + "lib/net8.0/Serilog.Extensions.Logging.dll": { + "assemblyVersion": "7.0.0.0", + "fileVersion": "8.0.0.0" + } + } + }, + "Serilog.Formatting.Compact/2.0.0": { + "dependencies": { + "Serilog": "4.0.0" + }, + "runtime": { + "lib/net7.0/Serilog.Formatting.Compact.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "2.0.0.0" + } + } + }, + "Serilog.Settings.Configuration/8.0.0": { + "dependencies": { + "Microsoft.Extensions.DependencyModel": "9.0.0", + "Serilog": "4.0.0" + }, + "runtime": { + "lib/net8.0/Serilog.Settings.Configuration.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.0.0" + } + } + }, + "Serilog.Sinks.Console/6.0.0": { + "dependencies": { + "Serilog": "4.0.0" + }, + "runtime": { + "lib/net8.0/Serilog.Sinks.Console.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.0.0" + } + } + }, + "Serilog.Sinks.Debug/2.0.0": { + "dependencies": { + "Serilog": "4.0.0" + }, + "runtime": { + "lib/netstandard2.1/Serilog.Sinks.Debug.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "2.0.0.0" + } + } + }, + "Serilog.Sinks.File/6.0.0": { + "dependencies": { + "Serilog": "4.0.0" + }, + "runtime": { + "lib/net8.0/Serilog.Sinks.File.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.0.0" + } + } + }, + "StackExchange.Redis/2.8.16": { + "dependencies": { + "Pipelines.Sockets.Unofficial": "2.2.8" + }, + "runtime": { + "lib/net6.0/StackExchange.Redis.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "2.8.16.12844" + } + } + }, + "System.CodeDom/6.0.0": { + "runtime": { + "lib/net6.0/System.CodeDom.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.21.52210" + } + } + }, + "System.Composition/7.0.0": { + "dependencies": { + "System.Composition.AttributedModel": "7.0.0", + "System.Composition.Convention": "7.0.0", + "System.Composition.Hosting": "7.0.0", + "System.Composition.Runtime": "7.0.0", + "System.Composition.TypedParts": "7.0.0" + } + }, + "System.Composition.AttributedModel/7.0.0": { + "runtime": { + "lib/net7.0/System.Composition.AttributedModel.dll": { + "assemblyVersion": "7.0.0.0", + "fileVersion": "7.0.22.51805" + } + } + }, + "System.Composition.Convention/7.0.0": { + "dependencies": { + "System.Composition.AttributedModel": "7.0.0" + }, + "runtime": { + "lib/net7.0/System.Composition.Convention.dll": { + "assemblyVersion": "7.0.0.0", + "fileVersion": "7.0.22.51805" + } + } + }, + "System.Composition.Hosting/7.0.0": { + "dependencies": { + "System.Composition.Runtime": "7.0.0" + }, + "runtime": { + "lib/net7.0/System.Composition.Hosting.dll": { + "assemblyVersion": "7.0.0.0", + "fileVersion": "7.0.22.51805" + } + } + }, + "System.Composition.Runtime/7.0.0": { + "runtime": { + "lib/net7.0/System.Composition.Runtime.dll": { + "assemblyVersion": "7.0.0.0", + "fileVersion": "7.0.22.51805" + } + } + }, + "System.Composition.TypedParts/7.0.0": { + "dependencies": { + "System.Composition.AttributedModel": "7.0.0", + "System.Composition.Hosting": "7.0.0", + "System.Composition.Runtime": "7.0.0" + }, + "runtime": { + "lib/net7.0/System.Composition.TypedParts.dll": { + "assemblyVersion": "7.0.0.0", + "fileVersion": "7.0.22.51805" + } + } + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.0.1", + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "runtime": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "assemblyVersion": "8.0.1.0", + "fileVersion": "8.0.1.50722" + } + } + }, + "System.IO.Hashing/8.0.0": { + "runtime": { + "lib/net8.0/System.IO.Hashing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.23.53103" + } + } + }, + "Yarp.ReverseProxy/2.2.0": { + "dependencies": { + "System.IO.Hashing": "8.0.0" + }, + "runtime": { + "lib/net8.0/Yarp.ReverseProxy.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.200.24.42901" + } + } + } + } + }, + "libraries": { + "YarpGateway/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Humanizer.Core/2.14.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==", + "path": "humanizer.core/2.14.1", + "hashPath": "humanizer.core.2.14.1.nupkg.sha512" + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0BgDfT1GoZnzjJOBwx5vFMK5JtqsTEas9pCEwd1/KKxNUAqFmreN60WeUoF+CsmSd9tOQuqWedvdBo/QqHuNTQ==", + "path": "microsoft.aspnetcore.authentication.jwtbearer/10.0.0", + "hashPath": "microsoft.aspnetcore.authentication.jwtbearer.10.0.0.nupkg.sha512" + }, + "Microsoft.Bcl.AsyncInterfaces/7.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==", + "path": "microsoft.bcl.asyncinterfaces/7.0.0", + "hashPath": "microsoft.bcl.asyncinterfaces.7.0.0.nupkg.sha512" + }, + "Microsoft.Build.Locator/1.7.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sPy10x527Ph16S2u0yGME4S6ohBKJ69WfjeGG/bvELYeZVmJdKjxgnlL8cJJJLGV/cZIRqSfB12UDB8ICakOog==", + "path": "microsoft.build.locator/1.7.8", + "hashPath": "microsoft.build.locator.1.7.8.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Common/4.8.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", + "path": "microsoft.codeanalysis.common/4.8.0", + "hashPath": "microsoft.codeanalysis.common.4.8.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp/4.8.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", + "path": "microsoft.codeanalysis.csharp/4.8.0", + "hashPath": "microsoft.codeanalysis.csharp.4.8.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces/4.8.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3amm4tq4Lo8/BGvg9p3BJh3S9nKq2wqCXfS7138i69TUpo/bD+XvD0hNurpEBtcNZhi1FyutiomKJqVF39ugYA==", + "path": "microsoft.codeanalysis.csharp.workspaces/4.8.0", + "hashPath": "microsoft.codeanalysis.csharp.workspaces.4.8.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Workspaces.Common/4.8.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LXyV+MJKsKRu3FGJA3OmSk40OUIa/dQCFLOnm5X8MNcujx7hzGu8o+zjXlb/cy5xUdZK2UKYb9YaQ2E8m9QehQ==", + "path": "microsoft.codeanalysis.workspaces.common/4.8.0", + "hashPath": "microsoft.codeanalysis.workspaces.common.4.8.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Workspaces.MSBuild/4.8.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IEYreI82QZKklp54yPHxZNG9EKSK6nHEkeuf+0Asie9llgS1gp0V1hw7ODG+QyoB7MuAnNQHmeV1Per/ECpv6A==", + "path": "microsoft.codeanalysis.workspaces.msbuild/4.8.0", + "hashPath": "microsoft.codeanalysis.workspaces.msbuild.4.8.0.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-wpG+nfnfDAw87R3ovAsUmjr3MZ4tYXf6bFqEPVAIKE6IfPml3DS//iX0DBnf8kWn5ZHSO5oi1m4d/Jf+1LifJQ==", + "path": "microsoft.entityframeworkcore/9.0.0", + "hashPath": "microsoft.entityframeworkcore.9.0.0.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Abstractions/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fnmifFL8KaA4ZNLCVgfjCWhZUFxkrDInx5hR4qG7Q8IEaSiy/6VOSRFyx55oH7MV4y7wM3J3EE90nSpcVBI44Q==", + "path": "microsoft.entityframeworkcore.abstractions/9.0.0", + "hashPath": "microsoft.entityframeworkcore.abstractions.9.0.0.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Design/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Pqo8I+yHJ3VQrAoY0hiSncf+5P7gN/RkNilK5e+/K/yKh+yAWxdUAI6t0TG26a9VPlCa9FhyklzyFvRyj3YG9A==", + "path": "microsoft.entityframeworkcore.design/9.0.0", + "hashPath": "microsoft.entityframeworkcore.design.9.0.0.nupkg.sha512" + }, + "Microsoft.EntityFrameworkCore.Relational/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-j+msw6fWgAE9M3Q/5B9Uhv7pdAdAQUvFPJAiBJmoy+OXvehVbfbCE8ftMAa51Uo2ZeiqVnHShhnv4Y4UJJmUzA==", + "path": "microsoft.entityframeworkcore.relational/9.0.0", + "hashPath": "microsoft.entityframeworkcore.relational.9.0.0.nupkg.sha512" + }, + "Microsoft.Extensions.DependencyModel/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-saxr2XzwgDU77LaQfYFXmddEDRUKHF4DaGMZkNB3qjdVSZlax3//dGJagJkKrGMIPNZs2jVFXITyCCR6UHJNdA==", + "path": "microsoft.extensions.dependencymodel/9.0.0", + "hashPath": "microsoft.extensions.dependencymodel.9.0.0.nupkg.sha512" + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OtlIWcyX01olfdevPKZdIPfBEvbcioDyBiE/Z2lHsopsMD7twcKtlN9kMevHmI5IIPhFpfwCIiR6qHQz1WHUIw==", + "path": "microsoft.identitymodel.abstractions/8.0.1", + "hashPath": "microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-s6++gF9x0rQApQzOBbSyp4jUaAlwm+DroKfL8gdOHxs83k8SJfUXhuc46rDB3rNXBQ1MVRxqKUrqFhO/M0E97g==", + "path": "microsoft.identitymodel.jsonwebtokens/8.0.1", + "hashPath": "microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UCPF2exZqBXe7v/6sGNiM6zCQOUXXQ9+v5VTb9gPB8ZSUPnX53BxlN78v2jsbIvK9Dq4GovQxo23x8JgWvm/Qg==", + "path": "microsoft.identitymodel.logging/8.0.1", + "hashPath": "microsoft.identitymodel.logging.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uA2vpKqU3I2mBBEaeJAWPTjT9v1TZrGWKdgK6G5qJd03CLx83kdiqO9cmiK8/n1erkHzFBwU/RphP83aAe3i3g==", + "path": "microsoft.identitymodel.protocols/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AQDbfpL+yzuuGhO/mQhKNsp44pm5Jv8/BI4KiFXR7beVGZoSH35zMV3PrmcfvSTsyI6qrcR898NzUauD6SRigg==", + "path": "microsoft.identitymodel.protocols.openidconnect/8.0.1", + "hashPath": "microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512" + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kDimB6Dkd3nkW2oZPDkMkVHfQt3IDqO5gL0oa8WVy3OP4uE8Ij+8TXnqg9TOd9ufjsY3IDiGz7pCUbnfL18tjg==", + "path": "microsoft.identitymodel.tokens/8.0.1", + "hashPath": "microsoft.identitymodel.tokens.8.0.1.nupkg.sha512" + }, + "Mono.TextTemplating/3.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YqueG52R/Xej4VVbKuRIodjiAhV0HR/XVbLbNrJhCZnzjnSjgMJ/dCdV0akQQxavX6hp/LC6rqLGLcXeQYU7XA==", + "path": "mono.texttemplating/3.0.0", + "hashPath": "mono.texttemplating.3.0.0.nupkg.sha512" + }, + "Npgsql/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zu1nCRt0gWP/GR0reYgg0Bl5o8qyNV7mVAgzAbVLRiAd1CYXcf/9nrubPH0mt93u8iGTKmYqWaLVECEAcE6IfQ==", + "path": "npgsql/9.0.0", + "hashPath": "npgsql.9.0.0.nupkg.sha512" + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/9.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ObngKFRLMBAeMqQzK7SC0Q6WZtWw0imPmEkVPo12yLVF3fioz2TN+w0mhNMJ5cVd/sLB2u+jei0bmA9sDMtkMw==", + "path": "npgsql.entityframeworkcore.postgresql/9.0.0", + "hashPath": "npgsql.entityframeworkcore.postgresql.9.0.0.nupkg.sha512" + }, + "Pipelines.Sockets.Unofficial/2.2.8": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "path": "pipelines.sockets.unofficial/2.2.8", + "hashPath": "pipelines.sockets.unofficial.2.2.8.nupkg.sha512" + }, + "Serilog/4.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-2jDkUrSh5EofOp7Lx5Zgy0EB+7hXjjxE2ktTb1WVQmU00lDACR2TdROGKU0K1pDTBSJBN1PqgYpgOZF8mL7NJw==", + "path": "serilog/4.0.0", + "hashPath": "serilog.4.0.0.nupkg.sha512" + }, + "Serilog.AspNetCore/8.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FAjtKPZ4IzqFQBqZKPv6evcXK/F0ls7RoXI/62Pnx2igkDZ6nZ/jn/C/FxVATqQbEQvtqP+KViWYIe4NZIHa2w==", + "path": "serilog.aspnetcore/8.0.0", + "hashPath": "serilog.aspnetcore.8.0.0.nupkg.sha512" + }, + "Serilog.Extensions.Hosting/8.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-db0OcbWeSCvYQkHWu6n0v40N4kKaTAXNjlM3BKvcbwvNzYphQFcBR+36eQ/7hMMwOkJvAyLC2a9/jNdUL5NjtQ==", + "path": "serilog.extensions.hosting/8.0.0", + "hashPath": "serilog.extensions.hosting.8.0.0.nupkg.sha512" + }, + "Serilog.Extensions.Logging/8.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", + "path": "serilog.extensions.logging/8.0.0", + "hashPath": "serilog.extensions.logging.8.0.0.nupkg.sha512" + }, + "Serilog.Formatting.Compact/2.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ob6z3ikzFM3D1xalhFuBIK1IOWf+XrQq+H4KeH4VqBcPpNcmUgZlRQ2h3Q7wvthpdZBBoY86qZOI2LCXNaLlNA==", + "path": "serilog.formatting.compact/2.0.0", + "hashPath": "serilog.formatting.compact.2.0.0.nupkg.sha512" + }, + "Serilog.Settings.Configuration/8.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nR0iL5HwKj5v6ULo3/zpP8NMcq9E2pxYA6XKTSWCbugVs4YqPyvaqaKOY+OMpPivKp7zMEpax2UKHnDodbRB0Q==", + "path": "serilog.settings.configuration/8.0.0", + "hashPath": "serilog.settings.configuration.8.0.0.nupkg.sha512" + }, + "Serilog.Sinks.Console/6.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fQGWqVMClCP2yEyTXPIinSr5c+CBGUvBybPxjAGcf7ctDhadFhrQw03Mv8rJ07/wR5PDfFjewf2LimvXCDzpbA==", + "path": "serilog.sinks.console/6.0.0", + "hashPath": "serilog.sinks.console.6.0.0.nupkg.sha512" + }, + "Serilog.Sinks.Debug/2.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==", + "path": "serilog.sinks.debug/2.0.0", + "hashPath": "serilog.sinks.debug.2.0.0.nupkg.sha512" + }, + "Serilog.Sinks.File/6.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lxjg89Y8gJMmFxVkbZ+qDgjl+T4yC5F7WSLTvA+5q0R04tfKVLRL/EHpYoJ/MEQd2EeCKDuylBIVnAYMotmh2A==", + "path": "serilog.sinks.file/6.0.0", + "hashPath": "serilog.sinks.file.6.0.0.nupkg.sha512" + }, + "StackExchange.Redis/2.8.16": { + "type": "package", + "serviceable": true, + "sha512": "sha512-WaoulkOqOC9jHepca3JZKFTqndCWab5uYS7qCzmiQDlrTkFaDN7eLSlEfHycBxipRnQY9ppZM7QSsWAwUEGblw==", + "path": "stackexchange.redis/2.8.16", + "hashPath": "stackexchange.redis.2.8.16.nupkg.sha512" + }, + "System.CodeDom/6.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA==", + "path": "system.codedom/6.0.0", + "hashPath": "system.codedom.6.0.0.nupkg.sha512" + }, + "System.Composition/7.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-tRwgcAkDd85O8Aq6zHDANzQaq380cek9lbMg5Qma46u5BZXq/G+XvIYmu+UI+BIIZ9zssXLYrkTykEqxxvhcmg==", + "path": "system.composition/7.0.0", + "hashPath": "system.composition.7.0.0.nupkg.sha512" + }, + "System.Composition.AttributedModel/7.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-2QzClqjElKxgI1jK1Jztnq44/8DmSuTSGGahXqQ4TdEV0h9s2KikQZIgcEqVzR7OuWDFPGLHIprBJGQEPr8fAQ==", + "path": "system.composition.attributedmodel/7.0.0", + "hashPath": "system.composition.attributedmodel.7.0.0.nupkg.sha512" + }, + "System.Composition.Convention/7.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IMhTlpCs4HmlD8B+J8/kWfwX7vrBBOs6xyjSTzBlYSs7W4OET4tlkR/Sg9NG8jkdJH9Mymq0qGdYS1VPqRTBnQ==", + "path": "system.composition.convention/7.0.0", + "hashPath": "system.composition.convention.7.0.0.nupkg.sha512" + }, + "System.Composition.Hosting/7.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-eB6gwN9S+54jCTBJ5bpwMOVerKeUfGGTYCzz3QgDr1P55Gg/Wb27ShfPIhLMjmZ3MoAKu8uUSv6fcCdYJTN7Bg==", + "path": "system.composition.hosting/7.0.0", + "hashPath": "system.composition.hosting.7.0.0.nupkg.sha512" + }, + "System.Composition.Runtime/7.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aZJ1Zr5Txe925rbo4742XifEyW0MIni1eiUebmcrP3HwLXZ3IbXUj4MFMUH/RmnJOAQiS401leg/2Sz1MkApDw==", + "path": "system.composition.runtime/7.0.0", + "hashPath": "system.composition.runtime.7.0.0.nupkg.sha512" + }, + "System.Composition.TypedParts/7.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZK0KNPfbtxVceTwh+oHNGUOYV2WNOHReX2AXipuvkURC7s/jPwoWfsu3SnDBDgofqbiWr96geofdQ2erm/KTHg==", + "path": "system.composition.typedparts/7.0.0", + "hashPath": "system.composition.typedparts.7.0.0.nupkg.sha512" + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GJw3bYkWpOgvN3tJo5X4lYUeIFA2HD293FPUhKmp7qxS+g5ywAb34Dnd3cDAFLkcMohy5XTpoaZ4uAHuw0uSPQ==", + "path": "system.identitymodel.tokens.jwt/8.0.1", + "hashPath": "system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512" + }, + "System.IO.Hashing/8.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ne1843evDugl0md7Fjzy6QjJrzsjh46ZKbhf8GwBXb5f/gw97J4bxMs0NQKifDuThh/f0bZ0e62NPl1jzTuRqA==", + "path": "system.io.hashing/8.0.0", + "hashPath": "system.io.hashing.8.0.0.nupkg.sha512" + }, + "Yarp.ReverseProxy/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-t16Z+OplJEElJy1Q6t12EwMGF2BeLw8IKjD1ema7ewbCRaMqeVIRPZo3MlxidnRFRK+tV6II8tKYX+7N5ZS98A==", + "path": "yarp.reverseproxy/2.2.0", + "hashPath": "yarp.reverseproxy.2.2.0.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/src/YarpGateway/bin/Debug/net10.0/YarpGateway.dll b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.dll new file mode 100644 index 0000000..9ed99c6 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/YarpGateway.pdb b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.pdb new file mode 100644 index 0000000..96f6229 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.pdb differ diff --git a/src/YarpGateway/bin/Debug/net10.0/YarpGateway.runtimeconfig.json b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.runtimeconfig.json new file mode 100644 index 0000000..bf15a00 --- /dev/null +++ b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.runtimeconfig.json @@ -0,0 +1,20 @@ +{ + "runtimeOptions": { + "tfm": "net10.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "10.0.0" + }, + { + "name": "Microsoft.AspNetCore.App", + "version": "10.0.0" + } + ], + "configProperties": { + "System.GC.Server": true, + "System.Reflection.NullabilityInfoContext.IsSupported": true, + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/src/YarpGateway/bin/Debug/net10.0/YarpGateway.staticwebassets.endpoints.json b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.staticwebassets.endpoints.json new file mode 100644 index 0000000..5576e88 --- /dev/null +++ b/src/YarpGateway/bin/Debug/net10.0/YarpGateway.staticwebassets.endpoints.json @@ -0,0 +1 @@ +{"Version":1,"ManifestType":"Build","Endpoints":[]} \ No newline at end of file diff --git a/src/YarpGateway/bin/Debug/net10.0/appsettings.Development.json b/src/YarpGateway/bin/Debug/net10.0/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/src/YarpGateway/bin/Debug/net10.0/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/YarpGateway/bin/Debug/net10.0/appsettings.json b/src/YarpGateway/bin/Debug/net10.0/appsettings.json new file mode 100644 index 0000000..18088e8 --- /dev/null +++ b/src/YarpGateway/bin/Debug/net10.0/appsettings.json @@ -0,0 +1,64 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Yarp.ReverseProxy": "Information" + } + }, + "AllowedHosts": "*", + "Cors": { + "AllowedOrigins": [ + "http://localhost:5173", + "http://127.0.0.1:5173", + "http://localhost:5174" + ], + "AllowAnyOrigin": false + }, + "ConnectionStrings": { + "DefaultConnection": "Host=192.168.100.10;Port=5432;Database=fengling_gateway;Username=movingsam;Password=sl52788542" + }, + "Jwt": { + "Authority": "https://your-auth-server.com", + "Audience": "fengling-gateway", + "ValidateIssuer": true, + "ValidateAudience": true + }, + "Redis": { + "ConnectionString": "192.168.100.10:6379", + "Database": 0, + "InstanceName": "YarpGateway" + }, + "ReverseProxy": { + "Routes": {}, + "Clusters": {} + }, + "Serilog": { + "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "Console", + "Args": { + "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "logs/gateway-.log", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" + } + } + ], + "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"] + }, + "Kestrel": { + "Endpoints": { + "Http": { + "Url": "http://0.0.0.0:8080" + } + } + } +} diff --git a/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..4e90e20 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..8dcc1bd Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..8ee4b4d Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..62b0422 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..180a8d9 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..4b7bae7 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..05da79f Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..bd0bb72 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..e128407 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..6a98feb Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..8e8ced1 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..970399e Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..9e6afdd Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..6cb47ac Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..76ddceb Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..c41ed4c Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..5fe6dd8 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..6eb37cb Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..046c953 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..368bb7b Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..72bb9d5 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..6051d99 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..ad0d2cd Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..829ed5d Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..9890df1 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..eaded8c Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..47f3fd5 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..28c43a1 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..203cc83 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..208b1d9 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..895ca11 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..c712a37 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..4d5b1a3 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..4790c29 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..05bc700 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..eb61aff Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..ea192cc Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..08eaeab Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..fce2d36 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..e142029 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..7c20209 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..be86033 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..4be51d2 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..768264c Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..0dc6fae Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..85dd902 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..dfd0a6b Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..f5e6b57 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..cafdf21 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..ace0504 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..9867f6f Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..2a4742e Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..8977db0 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..8012969 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..9a06288 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..e4b3c7a Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..b51ee57 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..d160925 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..e27e8be Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..22b6e95 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll new file mode 100755 index 0000000..57e4d28 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll new file mode 100755 index 0000000..305dfbf Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll new file mode 100755 index 0000000..28a5c18 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll new file mode 100755 index 0000000..cef3ebc Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll differ diff --git a/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll new file mode 100755 index 0000000..dce3bc0 Binary files /dev/null and b/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll differ diff --git a/src/YarpGateway/logs/gateway-20260201.log b/src/YarpGateway/logs/gateway-20260201.log new file mode 100644 index 0000000..520548f --- /dev/null +++ b/src/YarpGateway/logs/gateway-20260201.log @@ -0,0 +1,1867 @@ +2026-02-01 20:28:38.367 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 20:28:38.526 +08:00 [INF] Loading proxy data from config. +2026-02-01 20:28:38.538 +08:00 [INF] Starting YARP Gateway +2026-02-01 20:28:38.547 +08:00 [INF] Creating key {608f3e1e-2f33-4a15-9ede-21571a370d97} with creation date 2026-02-01 12:28:38Z, activation date 2026-02-01 12:28:38Z, and expiration date 2026-05-02 12:28:38Z. +2026-02-01 20:28:38.548 +08:00 [WRN] No XML encryptor configured. Key {608f3e1e-2f33-4a15-9ede-21571a370d97} may be persisted to storage in unencrypted form. +2026-02-01 20:28:38.549 +08:00 [INF] Writing data to file '/Users/movingsam/.aspnet/DataProtection-Keys/key-608f3e1e-2f33-4a15-9ede-21571a370d97.xml'. +2026-02-01 20:28:38.561 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 20:28:38.565 +08:00 [INF] Now listening on: http://0.0.0.0:8080 +2026-02-01 20:28:38.565 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2026-02-01 20:28:38.565 +08:00 [INF] Hosting environment: Development +2026-02-01 20:28:38.565 +08:00 [INF] Content root path: /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +2026-02-01 20:28:45.468 +08:00 [INF] Request starting HTTP/1.1 GET http://0.0.0.0:8080/ - null null +2026-02-01 20:28:45.491 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 20:28:45.492 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:28:45.493 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:28:45.494 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 20:28:45.498 +08:00 [INF] Request finished HTTP/1.1 GET http://0.0.0.0:8080/ - 503 0 null 30.4891ms +2026-02-01 20:28:49.620 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/ - null null +2026-02-01 20:28:49.622 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 20:28:49.623 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:28:49.623 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:28:49.623 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 20:28:49.624 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/ - 503 0 null 4.0712ms +2026-02-01 20:29:02.911 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/ - null null +2026-02-01 20:29:02.914 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 20:29:02.914 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:29:02.915 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:29:02.915 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 20:29:02.915 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/ - 503 0 null 3.9ms +2026-02-01 20:29:30.023 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:29:30.026 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:29:30.046 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:29:30.506 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 20:29:30.506 +08:00 [INF] Executed DbCommand (7ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:29:30.506 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 20:29:30.512 +08:00 [INF] Loaded 0 clusters from database +2026-02-01 20:29:30.512 +08:00 [INF] Loaded 0 routes from database +2026-02-01 20:29:30.518 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:29:30.527 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 480.0852ms +2026-02-01 20:29:30.527 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:29:30.528 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 505.1274ms +2026-02-01 20:29:30.748 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/favicon.ico - null null +2026-02-01 20:29:30.748 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 20:29:30.749 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:29:30.749 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:29:30.749 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 20:29:30.749 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/favicon.ico - 503 0 null 1.0967ms +2026-02-01 20:29:42.256 +08:00 [INF] Application is shutting down... +2026-02-01 20:49:15.886 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 20:49:16.066 +08:00 [INF] Loading proxy data from config. +2026-02-01 20:49:16.080 +08:00 [INF] Starting YARP Gateway +2026-02-01 20:49:16.102 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 20:49:16.105 +08:00 [INF] Now listening on: http://0.0.0.0:8080 +2026-02-01 20:49:16.106 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2026-02-01 20:49:16.106 +08:00 [INF] Hosting environment: Development +2026-02-01 20:49:16.106 +08:00 [INF] Content root path: /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +2026-02-01 20:49:41.074 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:49:41.087 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:49:41.105 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:49:41.639 +08:00 [INF] Executed DbCommand (11ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:49:41.639 +08:00 [INF] Executed DbCommand (11ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 20:49:41.645 +08:00 [INF] Loaded 0 clusters from database +2026-02-01 20:49:41.649 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:49:41.661 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 555.0812ms +2026-02-01 20:49:41.663 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:49:41.664 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 591.0773ms +2026-02-01 20:49:41.679 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 20:49:41.680 +08:00 [INF] Loaded 0 routes from database +2026-02-01 20:49:49.313 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:49:49.316 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:49:49.317 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:49:49.329 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:49:49.330 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:49:49.330 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 12.3257ms +2026-02-01 20:49:49.330 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:49:49.331 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 17.6625ms +2026-02-01 20:49:59.040 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:49:59.041 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:49:59.041 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:49:59.048 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:49:59.049 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:49:59.050 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 8.1249ms +2026-02-01 20:49:59.050 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:49:59.050 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 10.4396ms +2026-02-01 20:50:08.685 +08:00 [INF] Request starting HTTP/1.1 OPTIONS http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:50:08.685 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 20:50:08.689 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:50:08.695 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 20:50:08.695 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 20:50:08.696 +08:00 [INF] Request finished HTTP/1.1 OPTIONS http://localhost:8080/api/gateway/tenants - 503 0 null 11.3412ms +2026-02-01 20:51:44.258 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:51:44.263 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:51:44.264 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:51:44.280 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:51:44.281 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:51:44.281 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 17.172ms +2026-02-01 20:51:44.282 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:51:44.282 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 24.3958ms +2026-02-01 20:52:31.061 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:52:31.063 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:52:31.063 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:52:31.070 +08:00 [INF] Executed DbCommand (6ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:52:31.071 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:52:31.072 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 8.8603ms +2026-02-01 20:52:31.073 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:52:31.076 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 11.8326ms +2026-02-01 20:53:25.683 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:53:25.686 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:53:25.686 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:53:25.706 +08:00 [INF] Executed DbCommand (12ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:53:25.707 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:53:25.710 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 23.3473ms +2026-02-01 20:53:25.752 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:53:25.756 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 69.8792ms +2026-02-01 20:55:24.569 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:55:24.621 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:55:24.631 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:55:24.676 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:55:24.676 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:55:24.677 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 45.3671ms +2026-02-01 20:55:24.678 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:55:24.678 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 110.0931ms +2026-02-01 20:55:36.183 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:55:36.184 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:55:36.184 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:55:36.196 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:55:36.197 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:55:36.197 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 13.3423ms +2026-02-01 20:55:36.198 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:55:36.198 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 15.0201ms +2026-02-01 20:55:47.693 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:55:47.693 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:55:47.694 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:55:47.701 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:55:47.703 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:55:47.706 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 11.9807ms +2026-02-01 20:55:47.706 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:55:47.707 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 14.045ms +2026-02-01 20:56:32.634 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:56:32.635 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:56:32.635 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:56:32.642 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:56:32.643 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:56:32.643 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 7.646ms +2026-02-01 20:56:32.643 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:56:32.644 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 9.6731ms +2026-02-01 20:56:35.189 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:56:35.189 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:56:35.190 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:56:35.194 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:56:35.195 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:56:35.196 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.898ms +2026-02-01 20:56:35.196 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:56:35.196 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 6.9241ms +2026-02-01 20:56:58.530 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 20:56:58.533 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:56:58.534 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 20:56:58.555 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 20:56:58.558 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 20:56:58.558 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 23.7127ms +2026-02-01 20:56:58.558 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 20:56:58.558 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 28.0375ms +2026-02-01 21:00:23.871 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:00:23.872 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:00:23.872 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:00:23.887 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:00:23.888 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:00:23.889 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 16.3404ms +2026-02-01 21:00:23.893 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:00:23.894 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 24.0711ms +2026-02-01 21:02:01.116 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:02:01.118 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:01.120 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:02:01.162 +08:00 [INF] Executed DbCommand (6ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:02:01.163 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:02:01.163 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 43.0102ms +2026-02-01 21:02:01.163 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:01.163 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 48.3748ms +2026-02-01 21:02:02.971 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:02:02.972 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:02.972 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:02:02.979 +08:00 [INF] Executed DbCommand (6ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:02:02.980 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:02:02.980 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 8.03ms +2026-02-01 21:02:02.980 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:02.981 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 9.244ms +2026-02-01 21:02:06.331 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:02:06.331 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:06.332 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:02:06.338 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:02:06.339 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:02:06.340 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 7.8184ms +2026-02-01 21:02:06.340 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:06.340 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 9.4572ms +2026-02-01 21:02:11.767 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:02:11.767 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:11.768 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:02:11.774 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:02:11.775 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:02:11.775 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 7.011ms +2026-02-01 21:02:11.775 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:11.775 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 7.786ms +2026-02-01 21:02:13.215 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:02:13.216 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:13.216 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:02:13.221 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:02:13.222 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:02:13.222 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.6281ms +2026-02-01 21:02:13.222 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:13.222 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 6.8845ms +2026-02-01 21:02:14.142 +08:00 [INF] Request starting HTTP/1.1 POST http://localhost:8080/api/gateway/reload - null 0 +2026-02-01 21:02:14.143 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway)' +2026-02-01 21:02:14.154 +08:00 [INF] Route matched with {action = "ReloadConfig", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] ReloadConfig() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:02:14.166 +08:00 [INF] Executed DbCommand (9ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 21:02:14.167 +08:00 [INF] Loaded 0 routes from database +2026-02-01 21:02:14.174 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 21:02:14.174 +08:00 [INF] Loaded 0 clusters from database +2026-02-01 21:02:14.175 +08:00 [INF] Executing OkObjectResult, writing value of type '<>f__AnonymousType0`1[[System.String, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'. +2026-02-01 21:02:14.181 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway) in 27.4397ms +2026-02-01 21:02:14.181 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway)' +2026-02-01 21:02:14.182 +08:00 [INF] Request finished HTTP/1.1 POST http://localhost:8080/api/gateway/reload - 200 null application/json; charset=utf-8 39.1772ms +2026-02-01 21:02:20.366 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:02:20.366 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:20.366 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:02:20.371 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:02:20.372 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:02:20.374 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 7.9321ms +2026-02-01 21:02:20.375 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:02:20.375 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 9.3938ms +2026-02-01 21:03:51.216 +08:00 [INF] Application is shutting down... +2026-02-01 21:03:55.492 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 21:03:55.661 +08:00 [INF] Loading proxy data from config. +2026-02-01 21:03:55.672 +08:00 [INF] Starting YARP Gateway +2026-02-01 21:03:55.718 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 21:03:55.724 +08:00 [INF] Now listening on: http://0.0.0.0:8080 +2026-02-01 21:03:55.724 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2026-02-01 21:03:55.724 +08:00 [INF] Hosting environment: Development +2026-02-01 21:03:55.724 +08:00 [INF] Content root path: /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +2026-02-01 21:04:01.694 +08:00 [INF] Loading proxy data from config. +2026-02-01 21:04:42.773 +08:00 [INF] Application is shutting down... +2026-02-01 21:04:47.139 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 21:04:47.330 +08:00 [INF] Loading proxy data from config. +2026-02-01 21:04:47.346 +08:00 [INF] Starting YARP Gateway +2026-02-01 21:04:47.369 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 21:04:47.374 +08:00 [INF] Now listening on: http://0.0.0.0:8080 +2026-02-01 21:04:47.374 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2026-02-01 21:04:47.375 +08:00 [INF] Hosting environment: Development +2026-02-01 21:04:47.375 +08:00 [INF] Content root path: /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +2026-02-01 21:04:58.300 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:04:58.380 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:04:58.392 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:04:58.408 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:04:59.210 +08:00 [INF] Executed DbCommand (11ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 21:04:59.210 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 21:04:59.216 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:04:59.218 +08:00 [INF] Loaded 0 routes from database +2026-02-01 21:04:59.218 +08:00 [INF] Loaded 0 clusters from database +2026-02-01 21:04:59.221 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:04:59.239 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:04:59.240 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 829.6275ms +2026-02-01 21:04:59.240 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:04:59.241 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:04:59.241 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:04:59.242 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:04:59.243 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 947.8535ms +2026-02-01 21:04:59.247 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:04:59.247 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:04:59.248 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.222ms +2026-02-01 21:04:59.248 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:04:59.248 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 8.802ms +2026-02-01 21:04:59.331 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:04:59.332 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:04:59.333 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:04:59.333 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:04:59.339 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:04:59.342 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:04:59.342 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 8.9976ms +2026-02-01 21:04:59.343 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:04:59.343 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 12.6168ms +2026-02-01 21:05:08.512 +08:00 [INF] Request starting HTTP/1.1 OPTIONS http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:05:08.512 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:05:08.513 +08:00 [INF] Request finished HTTP/1.1 OPTIONS http://localhost:8080/api/gateway/tenants - 204 null null 1.3091ms +2026-02-01 21:05:08.515 +08:00 [INF] Request starting HTTP/1.1 POST http://localhost:8080/api/gateway/tenants - application/json 47 +2026-02-01 21:05:08.516 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:05:08.516 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.CreateTenant (YarpGateway)' +2026-02-01 21:05:08.529 +08:00 [INF] Route matched with {action = "CreateTenant", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] CreateTenant(CreateTenantDto) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:05:08.574 +08:00 [INF] Executed DbCommand (19ms) [Parameters=[@__dto_TenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE t."TenantCode" = @__dto_TenantCode_0 +LIMIT 1 +2026-02-01 21:05:08.640 +08:00 [INF] Executed DbCommand (11ms) [Parameters=[@p0='?' (DbType = Int64), @p1='?' (DbType = Int64), @p2='?' (DbType = DateTime), @p3='?' (DbType = Boolean), @p4='?' (DbType = Int32), @p5='?', @p6='?', @p7='?' (DbType = Int64), @p8='?' (DbType = DateTime), @p9='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30'] +INSERT INTO "Tenants" ("Id", "CreatedBy", "CreatedTime", "IsDeleted", "Status", "TenantCode", "TenantName", "UpdatedBy", "UpdatedTime", "Version") +VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9); +2026-02-01 21:05:08.643 +08:00 [INF] Executing OkObjectResult, writing value of type 'YarpGateway.Models.GwTenant'. +2026-02-01 21:05:08.644 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.CreateTenant (YarpGateway) in 114.6718ms +2026-02-01 21:05:08.644 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.CreateTenant (YarpGateway)' +2026-02-01 21:05:08.644 +08:00 [INF] Request finished HTTP/1.1 POST http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 129.8694ms +2026-02-01 21:05:10.106 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:05:10.107 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:05:10.107 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:05:10.122 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:05:10.143 +08:00 [INF] Executed DbCommand (6ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:05:10.143 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:05:10.145 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 23.0227ms +2026-02-01 21:05:10.146 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:05:10.146 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 40.263ms +2026-02-01 21:05:53.153 +08:00 [INF] Request starting HTTP/1.1 OPTIONS http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:05:53.154 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:05:53.154 +08:00 [INF] Request finished HTTP/1.1 OPTIONS http://localhost:8080/api/gateway/tenants/1668/routes - 204 null null 0.8999ms +2026-02-01 21:05:53.156 +08:00 [INF] Request starting HTTP/1.1 POST http://localhost:8080/api/gateway/tenants/1668/routes - application/json 64 +2026-02-01 21:05:53.156 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:05:53.156 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.CreateRoute (YarpGateway)' +2026-02-01 21:05:53.164 +08:00 [INF] Route matched with {action = "CreateRoute", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] CreateRoute(System.String, CreateRouteDto) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:05:53.191 +08:00 [INF] Executed DbCommand (8ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE t."TenantCode" = @__tenantCode_0 +LIMIT 1 +2026-02-01 21:05:53.204 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."ClusterId" = @__clusterId_0 +LIMIT 1 +2026-02-01 21:05:53.244 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[@p0='?' (DbType = Int64), @p1='?', @p2='?' (DbType = Int64), @p3='?' (DbType = DateTime), @p4='?' (DbType = Boolean), @p5='?', @p6='?' (DbType = Int32), @p7='?', @p8='?' (DbType = Int32), @p9='?', @p10='?' (DbType = Int64), @p11='?' (DbType = DateTime), @p12='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30'] +INSERT INTO "TenantRoutes" ("Id", "ClusterId", "CreatedBy", "CreatedTime", "IsDeleted", "PathPattern", "Priority", "ServiceName", "Status", "TenantCode", "UpdatedBy", "UpdatedTime", "Version") +VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12); +2026-02-01 21:05:53.251 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 21:05:53.252 +08:00 [INF] Loaded 1 routes from database +2026-02-01 21:05:53.252 +08:00 [INF] Executing OkObjectResult, writing value of type 'YarpGateway.Models.GwTenantRoute'. +2026-02-01 21:05:53.253 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.CreateRoute (YarpGateway) in 89.3866ms +2026-02-01 21:05:53.253 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.CreateRoute (YarpGateway)' +2026-02-01 21:05:53.253 +08:00 [INF] Request finished HTTP/1.1 POST http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 97.9256ms +2026-02-01 21:05:53.258 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:05:53.259 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:05:53.259 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:05:53.259 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:05:53.265 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:05:53.266 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:05:53.267 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 7.4562ms +2026-02-01 21:05:53.267 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:05:53.267 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 8.7162ms +2026-02-01 21:05:56.402 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:05:56.402 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:05:56.403 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:05:56.435 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:05:56.448 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 21:05:56.450 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:05:56.451 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 15.5198ms +2026-02-01 21:05:56.451 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:05:56.451 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 49.2768ms +2026-02-01 21:06:14.850 +08:00 [INF] Request starting HTTP/1.1 OPTIONS http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:06:14.851 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:14.851 +08:00 [INF] Request finished HTTP/1.1 OPTIONS http://localhost:8080/api/gateway/clusters/1668-backend/instances - 204 null null 1.24ms +2026-02-01 21:06:14.853 +08:00 [INF] Request starting HTTP/1.1 POST http://localhost:8080/api/gateway/clusters/1668-backend/instances - application/json 73 +2026-02-01 21:06:14.853 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:14.853 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.AddInstance (YarpGateway)' +2026-02-01 21:06:14.860 +08:00 [INF] Route matched with {action = "AddInstance", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] AddInstance(System.String, CreateInstanceDto) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:14.876 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[@__clusterId_0='?', @__dto_DestinationId_1='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND s."DestinationId" = @__dto_DestinationId_1 +LIMIT 1 +2026-02-01 21:06:14.902 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[@p0='?' (DbType = Int64), @p1='?', @p2='?', @p3='?' (DbType = Int64), @p4='?' (DbType = DateTime), @p5='?', @p6='?' (DbType = Int32), @p7='?' (DbType = Boolean), @p8='?' (DbType = Int32), @p9='?' (DbType = Int64), @p10='?' (DbType = DateTime), @p11='?' (DbType = Int32), @p12='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30'] +INSERT INTO "ServiceInstances" ("Id", "Address", "ClusterId", "CreatedBy", "CreatedTime", "DestinationId", "Health", "IsDeleted", "Status", "UpdatedBy", "UpdatedTime", "Version", "Weight") +VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12); +2026-02-01 21:06:14.908 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 21:06:14.909 +08:00 [INF] Loaded 1 clusters from database +2026-02-01 21:06:14.909 +08:00 [INF] Executing OkObjectResult, writing value of type 'YarpGateway.Models.GwServiceInstance'. +2026-02-01 21:06:14.910 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.AddInstance (YarpGateway) in 50.4462ms +2026-02-01 21:06:14.910 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.AddInstance (YarpGateway)' +2026-02-01 21:06:14.910 +08:00 [INF] Request finished HTTP/1.1 POST http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 57.6265ms +2026-02-01 21:06:14.914 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:06:14.914 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:14.914 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:14.915 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:14.918 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 21:06:14.919 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:14.919 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 4.0322ms +2026-02-01 21:06:14.919 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:14.919 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 4.7505ms +2026-02-01 21:06:17.150 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:06:17.150 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:17.151 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:17.151 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:17.156 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:06:17.161 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:17.162 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 10.6559ms +2026-02-01 21:06:17.162 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:17.163 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 12.4738ms +2026-02-01 21:06:19.111 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:06:19.111 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:19.111 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:06:19.111 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:19.117 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:06:19.120 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:19.120 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 8.9071ms +2026-02-01 21:06:19.121 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:06:19.121 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 9.9959ms +2026-02-01 21:06:20.175 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:06:20.175 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:20.175 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:20.175 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:20.189 +08:00 [INF] Executed DbCommand (11ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 21:06:20.189 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:20.190 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 14.274ms +2026-02-01 21:06:20.190 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:20.190 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 15.5078ms +2026-02-01 21:06:23.521 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:06:23.522 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:23.522 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:23.522 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:23.527 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:06:23.529 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:23.530 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 7.7563ms +2026-02-01 21:06:23.530 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:23.531 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 9.1482ms +2026-02-01 21:06:24.313 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:06:24.313 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:24.314 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:24.314 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:24.327 +08:00 [INF] Executed DbCommand (13ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:06:24.328 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:24.329 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 14.6627ms +2026-02-01 21:06:24.329 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:24.329 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 15.7096ms +2026-02-01 21:06:24.338 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:06:24.339 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:24.344 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:06:24.345 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:24.351 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:06:24.352 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:24.352 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 7.2453ms +2026-02-01 21:06:24.352 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:06:24.352 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 14.2265ms +2026-02-01 21:06:24.355 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:06:24.355 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:24.355 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:24.355 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:24.360 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 21:06:24.361 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:24.361 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 5.8417ms +2026-02-01 21:06:24.362 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:24.363 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 8.1657ms +2026-02-01 21:06:27.399 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:06:27.399 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:27.400 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:27.400 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:27.404 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:06:27.405 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:27.406 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.7784ms +2026-02-01 21:06:27.406 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:27.406 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 7.1823ms +2026-02-01 21:06:28.983 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:06:28.983 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:28.983 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:28.983 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:28.989 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:06:28.990 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:28.991 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 7.4782ms +2026-02-01 21:06:28.991 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:06:28.991 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 8.8219ms +2026-02-01 21:06:29.001 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:06:29.002 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:29.002 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:06:29.002 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:29.008 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:06:29.009 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:29.009 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 6.6596ms +2026-02-01 21:06:29.009 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:06:29.009 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 7.7495ms +2026-02-01 21:06:29.011 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:06:29.011 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:29.011 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:29.012 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:29.016 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 21:06:29.016 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:29.017 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 4.9486ms +2026-02-01 21:06:29.017 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:29.017 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 5.6986ms +2026-02-01 21:06:36.589 +08:00 [INF] Request starting HTTP/1.1 POST http://localhost:8080/api/gateway/reload - null 0 +2026-02-01 21:06:36.590 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:36.590 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway)' +2026-02-01 21:06:36.606 +08:00 [INF] Route matched with {action = "ReloadConfig", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] ReloadConfig() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:36.640 +08:00 [INF] Executed DbCommand (26ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 21:06:36.641 +08:00 [INF] Loaded 1 routes from database +2026-02-01 21:06:36.660 +08:00 [INF] Executed DbCommand (17ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 21:06:36.661 +08:00 [INF] Loaded 1 clusters from database +2026-02-01 21:06:36.661 +08:00 [INF] Executing OkObjectResult, writing value of type '<>f__AnonymousType0`1[[System.String, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'. +2026-02-01 21:06:36.668 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway) in 61.9397ms +2026-02-01 21:06:36.668 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway)' +2026-02-01 21:06:36.669 +08:00 [INF] Request finished HTTP/1.1 POST http://localhost:8080/api/gateway/reload - 200 null application/json; charset=utf-8 79.8832ms +2026-02-01 21:06:36.674 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:06:36.674 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:36.675 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:06:36.675 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:36.686 +08:00 [INF] Executed DbCommand (8ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:06:36.688 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:36.688 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 13.2311ms +2026-02-01 21:06:36.688 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:06:36.688 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 14.6415ms +2026-02-01 21:06:36.693 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:06:36.693 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:06:36.693 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:36.694 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:06:36.699 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 21:06:36.700 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:06:36.701 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 6.8118ms +2026-02-01 21:06:36.701 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:06:36.701 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 7.9798ms +2026-02-01 21:13:26.437 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:13:26.440 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:13:26.440 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:13:26.441 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:13:26.478 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:13:26.479 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:13:26.479 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 38.2422ms +2026-02-01 21:13:26.479 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:13:26.479 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 42.6309ms +2026-02-01 21:13:28.393 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:13:28.394 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:13:28.394 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:13:28.394 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:13:28.405 +08:00 [INF] Executed DbCommand (7ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:13:28.406 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:13:28.406 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 11.854ms +2026-02-01 21:13:28.407 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:13:28.407 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 13.359ms +2026-02-01 21:13:31.010 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:13:31.010 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:13:31.011 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:13:31.011 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:13:31.015 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:13:31.016 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:13:31.016 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.5402ms +2026-02-01 21:13:31.016 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:13:31.017 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 6.5055ms +2026-02-01 21:13:33.878 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:13:33.878 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:13:33.879 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:13:33.879 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:13:33.884 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:13:33.885 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:13:33.885 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 5.7937ms +2026-02-01 21:13:33.885 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:13:33.886 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 7.3867ms +2026-02-01 21:13:34.998 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:13:34.998 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:13:34.998 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:13:34.999 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:13:35.003 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 21:13:35.004 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:13:35.004 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 5.6441ms +2026-02-01 21:13:35.005 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:13:35.005 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 6.7441ms +2026-02-01 21:13:40.963 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:13:40.964 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:13:40.964 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:13:40.964 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:13:40.970 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:13:40.971 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:13:40.971 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 6.8734ms +2026-02-01 21:13:40.971 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:13:40.972 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 8.4311ms +2026-02-01 21:13:41.818 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:13:41.818 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:13:41.819 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:13:41.819 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:13:41.824 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:13:41.825 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:13:41.825 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 6.3963ms +2026-02-01 21:13:41.826 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:13:41.826 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 8.1552ms +2026-02-01 21:14:14.883 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:14:14.884 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:14:14.884 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:14:14.884 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:14:14.891 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:14:14.892 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:14:14.893 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 8.6189ms +2026-02-01 21:14:14.893 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:14:14.894 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 10.1815ms +2026-02-01 21:14:14.901 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 21:14:14.902 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:14:14.902 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:14:14.903 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:14:14.908 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 21:14:14.909 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:14:14.909 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 6.047ms +2026-02-01 21:14:14.909 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 21:14:14.909 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 7.7971ms +2026-02-01 21:14:14.911 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 21:14:14.911 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:14:14.911 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:14:14.911 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:14:14.916 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 21:14:14.917 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:14:14.917 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 5.5654ms +2026-02-01 21:14:14.917 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 21:14:14.917 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 6.8468ms +2026-02-01 21:14:15.476 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 21:14:15.477 +08:00 [INF] CORS policy execution successful. +2026-02-01 21:14:15.477 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:14:15.477 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 21:14:15.482 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 21:14:15.483 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 21:14:15.483 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 6.0338ms +2026-02-01 21:14:15.483 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 21:14:15.484 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 7.183ms +2026-02-01 21:24:38.446 +08:00 [INF] Application is shutting down... +2026-02-01 22:03:24.445 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:03:24.605 +08:00 [INF] Loading proxy data from config. +2026-02-01 22:03:48.070 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:03:48.232 +08:00 [INF] Loading proxy data from config. +2026-02-01 22:04:34.173 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:04:34.333 +08:00 [INF] Loading proxy data from config. +2026-02-01 22:04:34.365 +08:00 [INF] Initializing route cache from database... +2026-02-01 22:04:34.801 +08:00 [ERR] Failed executing DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:04:34.809 +08:00 [ERR] An exception occurred while iterating over the results of a query for context type 'YarpGateway.Data.GatewayDbContext'. +Npgsql.PostgresException (0x80004005): 42703: column t.IsGlobal does not exist + +POSITION: 78 + at Npgsql.Internal.NpgsqlConnector.ReadMessageLong(Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage) + at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) + at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken) + at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken) + at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync() + Exception data: + Severity: ERROR + SqlState: 42703 + MessageText: column t.IsGlobal does not exist + Position: 78 + File: parse_relation.c + Line: 3822 + Routine: errorMissingColumn +Npgsql.PostgresException (0x80004005): 42703: column t.IsGlobal does not exist + +POSITION: 78 + at Npgsql.Internal.NpgsqlConnector.ReadMessageLong(Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage) + at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) + at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken) + at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken) + at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync() + Exception data: + Severity: ERROR + SqlState: 42703 + MessageText: column t.IsGlobal does not exist + Position: 78 + File: parse_relation.c + Line: 3822 + Routine: errorMissingColumn +2026-02-01 22:06:29.393 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:06:29.561 +08:00 [INF] Loading proxy data from config. +2026-02-01 22:06:29.594 +08:00 [INF] Initializing route cache from database... +2026-02-01 22:06:30.039 +08:00 [ERR] Failed executing DbCommand (11ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:06:30.047 +08:00 [ERR] An exception occurred while iterating over the results of a query for context type 'YarpGateway.Data.GatewayDbContext'. +Npgsql.PostgresException (0x80004005): 42703: column t.IsGlobal does not exist + +POSITION: 78 + at Npgsql.Internal.NpgsqlConnector.ReadMessageLong(Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage) + at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) + at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken) + at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken) + at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync() + Exception data: + Severity: ERROR + SqlState: 42703 + MessageText: column t.IsGlobal does not exist + Position: 78 + File: parse_relation.c + Line: 3822 + Routine: errorMissingColumn +Npgsql.PostgresException (0x80004005): 42703: column t.IsGlobal does not exist + +POSITION: 78 + at Npgsql.Internal.NpgsqlConnector.ReadMessageLong(Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage) + at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) + at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken) + at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken) + at Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken) + at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken) + at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync() + Exception data: + Severity: ERROR + SqlState: 42703 + MessageText: column t.IsGlobal does not exist + Position: 78 + File: parse_relation.c + Line: 3822 + Routine: errorMissingColumn +2026-02-01 22:06:49.708 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:06:49.873 +08:00 [INF] Loading proxy data from config. +2026-02-01 22:06:49.897 +08:00 [INF] Initializing route cache from database... +2026-02-01 22:06:50.321 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:06:50.359 +08:00 [INF] Route cache initialized: 0 global routes, 1 tenant routes +2026-02-01 22:06:50.359 +08:00 [INF] Starting YARP Gateway +2026-02-01 22:06:50.376 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 22:06:50.377 +08:00 [INF] Now listening on: http://0.0.0.0:8080 +2026-02-01 22:06:50.377 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2026-02-01 22:06:50.377 +08:00 [INF] Hosting environment: Development +2026-02-01 22:06:50.377 +08:00 [INF] Content root path: /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +2026-02-01 22:06:58.544 +08:00 [INF] Application is shutting down... +2026-02-01 22:07:12.683 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:07:12.845 +08:00 [INF] Loading proxy data from config. +2026-02-01 22:07:12.873 +08:00 [INF] Initializing route cache from database... +2026-02-01 22:07:13.307 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:07:13.344 +08:00 [INF] Route cache initialized: 0 global routes, 1 tenant routes +2026-02-01 22:07:13.344 +08:00 [INF] Starting YARP Gateway +2026-02-01 22:07:13.360 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 22:07:13.361 +08:00 [INF] Now listening on: http://0.0.0.0:8080 +2026-02-01 22:07:13.361 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2026-02-01 22:07:13.361 +08:00 [INF] Hosting environment: Development +2026-02-01 22:07:13.362 +08:00 [INF] Content root path: /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +2026-02-01 22:07:19.889 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/ - null null +2026-02-01 22:07:19.900 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 22:07:19.901 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:07:19.901 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:07:19.902 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 22:07:19.902 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/ - 503 0 null 14.2547ms +2026-02-01 22:07:23.258 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes - null null +2026-02-01 22:07:23.259 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 22:07:23.259 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:07:23.259 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:07:23.259 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 22:07:23.259 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes - 503 0 null 1.7208ms +2026-02-01 22:07:32.615 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - null null +2026-02-01 22:07:32.617 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 22:07:32.617 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:07:32.617 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:07:32.617 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 22:07:32.617 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - 503 0 null 1.5037ms +2026-02-01 22:07:34.387 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - null null +2026-02-01 22:07:34.387 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 22:07:34.387 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:07:34.387 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:07:34.387 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 22:07:34.387 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - 503 0 null 0.4997ms +2026-02-01 22:11:38.559 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/tenants - null null +2026-02-01 22:11:38.560 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:11:38.567 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:11:38.589 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:11:38.589 +08:00 [INF] Loaded 1 routes from database +2026-02-01 22:11:38.605 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 22:11:38.612 +08:00 [INF] Loaded 1 clusters from database +2026-02-01 22:11:38.632 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:11:38.640 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:11:38.651 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 82.7537ms +2026-02-01 22:11:38.651 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:11:38.651 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 91.9911ms +2026-02-01 22:11:43.971 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - null null +2026-02-01 22:11:43.971 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:11:43.974 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:11:43.980 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:11:43.980 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:11:43.982 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 8.1183ms +2026-02-01 22:11:43.982 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:11:43.982 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 11.0256ms +2026-02-01 22:11:46.387 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - null null +2026-02-01 22:11:46.387 +08:00 [INF] Executing endpoint 'catch-all-route' +2026-02-01 22:11:46.387 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:11:46.387 +08:00 [WRN] No available destinations after load balancing for cluster 'dynamic-cluster'. +2026-02-01 22:11:46.387 +08:00 [INF] Executed endpoint 'catch-all-route' +2026-02-01 22:11:46.387 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - 503 0 null 0.282ms +2026-02-01 22:12:03.947 +08:00 [INF] Loading proxy data from config. +2026-02-01 22:12:36.795 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - null null +2026-02-01 22:12:36.795 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - 404 0 null 0.4624ms +2026-02-01 22:12:36.795 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://127.0.0.1:8080/api/gateway/routes, Response status code: 404 +2026-02-01 22:12:38.943 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - null null +2026-02-01 22:12:38.943 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes - 404 0 null 0.5529ms +2026-02-01 22:12:38.943 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://127.0.0.1:8080/api/gateway/routes, Response status code: 404 +2026-02-01 22:12:48.629 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - null null +2026-02-01 22:12:48.630 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:12:48.630 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:12:48.634 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:12:48.635 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:12:48.635 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 4.8835ms +2026-02-01 22:12:48.635 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:12:48.635 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 5.3341ms +2026-02-01 22:13:08.032 +08:00 [INF] Request starting HTTP/1.1 POST http://127.0.0.1:8080/api/gateway/routes/global - application/json 93 +2026-02-01 22:13:08.032 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.CreateGlobalRoute (YarpGateway)' +2026-02-01 22:13:08.036 +08:00 [INF] Route matched with {action = "CreateGlobalRoute", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] CreateGlobalRoute(CreateGlobalRouteDto) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:13:08.055 +08:00 [INF] Executed DbCommand (7ms) [Parameters=[@__dto_ServiceName_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."ServiceName" = @__dto_ServiceName_0 AND t."IsGlobal" +LIMIT 1 +2026-02-01 22:13:08.094 +08:00 [INF] Executed DbCommand (9ms) [Parameters=[@p0='?' (DbType = Int64), @p1='?', @p2='?' (DbType = Int64), @p3='?' (DbType = DateTime), @p4='?' (DbType = Boolean), @p5='?' (DbType = Boolean), @p6='?', @p7='?' (DbType = Int32), @p8='?', @p9='?' (DbType = Int32), @p10='?', @p11='?' (DbType = Int64), @p12='?' (DbType = DateTime), @p13='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30'] +INSERT INTO "TenantRoutes" ("Id", "ClusterId", "CreatedBy", "CreatedTime", "IsDeleted", "IsGlobal", "PathPattern", "Priority", "ServiceName", "Status", "TenantCode", "UpdatedBy", "UpdatedTime", "Version") +VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13); +2026-02-01 22:13:08.097 +08:00 [INF] Reloading route cache... +2026-02-01 22:13:08.101 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:13:08.102 +08:00 [INF] Route cache reloaded +2026-02-01 22:13:08.102 +08:00 [INF] Executing OkObjectResult, writing value of type 'YarpGateway.Models.GwTenantRoute'. +2026-02-01 22:13:08.102 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.CreateGlobalRoute (YarpGateway) in 66.3013ms +2026-02-01 22:13:08.102 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.CreateGlobalRoute (YarpGateway)' +2026-02-01 22:13:08.102 +08:00 [INF] Request finished HTTP/1.1 POST http://127.0.0.1:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 70.5429ms +2026-02-01 22:13:10.304 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - null null +2026-02-01 22:13:10.304 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:13:10.304 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:13:10.308 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:13:10.308 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:13:10.309 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 4.2081ms +2026-02-01 22:13:10.309 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:13:10.309 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 4.4907ms +2026-02-01 22:13:51.464 +08:00 [INF] Request starting HTTP/1.1 POST http://127.0.0.1:8080/api/gateway/clusters/product-cluster/instances - application/json 79 +2026-02-01 22:13:51.465 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.AddInstance (YarpGateway)' +2026-02-01 22:13:51.467 +08:00 [INF] Route matched with {action = "AddInstance", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] AddInstance(System.String, CreateInstanceDto) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:13:51.476 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[@__clusterId_0='?', @__dto_DestinationId_1='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND s."DestinationId" = @__dto_DestinationId_1 +LIMIT 1 +2026-02-01 22:13:51.486 +08:00 [INF] Executed DbCommand (8ms) [Parameters=[@p0='?' (DbType = Int64), @p1='?', @p2='?', @p3='?' (DbType = Int64), @p4='?' (DbType = DateTime), @p5='?', @p6='?' (DbType = Int32), @p7='?' (DbType = Boolean), @p8='?' (DbType = Int32), @p9='?' (DbType = Int64), @p10='?' (DbType = DateTime), @p11='?' (DbType = Int32), @p12='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30'] +INSERT INTO "ServiceInstances" ("Id", "Address", "ClusterId", "CreatedBy", "CreatedTime", "DestinationId", "Health", "IsDeleted", "Status", "UpdatedBy", "UpdatedTime", "Version", "Weight") +VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12); +2026-02-01 22:13:51.490 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 22:13:51.490 +08:00 [INF] Loaded 2 clusters from database +2026-02-01 22:13:51.490 +08:00 [INF] Executing OkObjectResult, writing value of type 'YarpGateway.Models.GwServiceInstance'. +2026-02-01 22:13:51.491 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.AddInstance (YarpGateway) in 23.8754ms +2026-02-01 22:13:51.491 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.AddInstance (YarpGateway)' +2026-02-01 22:13:51.491 +08:00 [INF] Request finished HTTP/1.1 POST http://127.0.0.1:8080/api/gateway/clusters/product-cluster/instances - 200 null application/json; charset=utf-8 26.9521ms +2026-02-01 22:14:14.187 +08:00 [INF] Request starting HTTP/1.1 POST http://127.0.0.1:8080/api/gateway/reload - null null +2026-02-01 22:14:14.188 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway)' +2026-02-01 22:14:14.190 +08:00 [INF] Route matched with {action = "ReloadConfig", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] ReloadConfig() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:14:14.190 +08:00 [INF] Reloading route cache... +2026-02-01 22:14:14.194 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:14:14.194 +08:00 [INF] Route cache reloaded +2026-02-01 22:14:14.200 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:14:14.200 +08:00 [INF] Loaded 2 routes from database +2026-02-01 22:14:14.204 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 22:14:14.204 +08:00 [INF] Loaded 2 clusters from database +2026-02-01 22:14:14.204 +08:00 [INF] Executing OkObjectResult, writing value of type '<>f__AnonymousType0`1[[System.String, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'. +2026-02-01 22:14:14.205 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway) in 15.273ms +2026-02-01 22:14:14.205 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.ReloadConfig (YarpGateway)' +2026-02-01 22:14:14.205 +08:00 [INF] Request finished HTTP/1.1 POST http://127.0.0.1:8080/api/gateway/reload - 200 null application/json; charset=utf-8 18.1485ms +2026-02-01 22:14:17.161 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - null null +2026-02-01 22:14:17.161 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - 404 0 null 0.1455ms +2026-02-01 22:14:17.161 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://127.0.0.1:8080/api/product/test, Response status code: 404 +2026-02-01 22:14:32.651 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/clusters/product-cluster/instances - null null +2026-02-01 22:14:32.651 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:14:32.654 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:14:32.660 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 22:14:32.660 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:14:32.660 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 6.4256ms +2026-02-01 22:14:32.660 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:14:32.660 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/clusters/product-cluster/instances - 200 null application/json; charset=utf-8 9.4366ms +2026-02-01 22:16:32.786 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - null null +2026-02-01 22:16:32.786 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:16:32.786 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:16:32.791 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:16:32.791 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:16:32.791 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 5.1332ms +2026-02-01 22:16:32.791 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:16:32.792 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 5.8393ms +2026-02-01 22:16:35.327 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - null null +2026-02-01 22:16:35.327 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - 404 0 null 0.1327ms +2026-02-01 22:16:35.327 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://127.0.0.1:8080/api/product/test, Response status code: 404 +2026-02-01 22:17:17.995 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - null null +2026-02-01 22:17:17.995 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - 404 0 null 0.7272ms +2026-02-01 22:17:17.996 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://127.0.0.1:8080/api/product/test, Response status code: 404 +", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:16:37.617 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 22:16:37.618 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:16:37.654 +08:00 [INF] Loaded 2 routes from database +2026-02-01 22:16:37.654 +08:00 [INF] Loaded 2 clusters from database +2026-02-01 22:16:37.656 +08:00 [INF] Route cache initialized: 1 global routes, 1 tenant routes +2026-02-01 22:16:37.656 +08:00 [INF] Starting YARP Gateway +2026-02-01 22:16:37.670 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 22:16:37.672 +08:00 [ERR] Hosting failed to start +System.IO.IOException: Failed to bind to address http://0.0.0.0:8080: address already in use. + ---> Microsoft.AspNetCore.Connections.AddressInUseException: Address already in use + ---> System.Net.Sockets.SocketException (48): Address already in use + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.EndpointsStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__14_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) +2026-02-01 22:17:21.898 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:17:22.466 +08:00 [INF] Initializing route cache from database... +2026-02-01 22:17:22.492 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:17:22.492 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 22:17:22.498 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:17:22.529 +08:00 [INF] Loaded 2 routes from database +2026-02-01 22:17:22.529 +08:00 [INF] Loaded 2 clusters from database +2026-02-01 22:17:22.531 +08:00 [INF] Route cache initialized: 1 global routes, 1 tenant routes +2026-02-01 22:17:22.531 +08:00 [INF] Starting YARP Gateway +2026-02-01 22:17:22.545 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 22:17:22.547 +08:00 [ERR] Hosting failed to start +System.IO.IOException: Failed to bind to address http://0.0.0.0:8080: address already in use. + ---> Microsoft.AspNetCore.Connections.AddressInUseException: Address already in use + ---> System.Net.Sockets.SocketException (48): Address already in use + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.EndpointsStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__14_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) +2026-02-01 22:17:49.266 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:17:49.839 +08:00 [INF] Initializing route cache from database... +2026-02-01 22:17:49.863 +08:00 [INF] Executed DbCommand (7ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 22:17:49.863 +08:00 [INF] Executed DbCommand (10ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:17:49.867 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:17:49.902 +08:00 [INF] Loaded 2 routes from database +2026-02-01 22:17:49.902 +08:00 [INF] Loaded 2 clusters from database +2026-02-01 22:17:49.903 +08:00 [INF] Route cache initialized: 1 global routes, 1 tenant routes +2026-02-01 22:17:49.903 +08:00 [INF] Starting YARP Gateway +2026-02-01 22:17:49.918 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 22:17:49.919 +08:00 [ERR] Hosting failed to start +System.IO.IOException: Failed to bind to address http://0.0.0.0:8080: address already in use. + ---> Microsoft.AspNetCore.Connections.AddressInUseException: Address already in use + ---> System.Net.Sockets.SocketException (48): Address already in use + at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) + at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) + at System.Net.Sockets.Socket.Bind(EndPoint localEP) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions.CreateDefaultBoundListenSocket(EndPoint endpoint) + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind() + at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.TransportManager.BindAsync(EndPoint endPoint, ConnectionDelegate connectionDelegate, EndpointConfig endpointConfig, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.EndpointsStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__14_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) +2026-02-01 22:18:29.315 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:18:29.898 +08:00 [INF] Initializing route cache from database... +2026-02-01 22:18:29.922 +08:00 [INF] Executed DbCommand (9ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:18:29.922 +08:00 [INF] Executed DbCommand (9ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 22:18:29.930 +08:00 [INF] Executed DbCommand (6ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:18:29.959 +08:00 [INF] Loaded 2 routes from database +2026-02-01 22:18:29.959 +08:00 [INF] Loaded 2 clusters from database +2026-02-01 22:18:29.961 +08:00 [INF] Route cache initialized: 1 global routes, 1 tenant routes +2026-02-01 22:18:29.961 +08:00 [INF] Starting YARP Gateway +2026-02-01 22:18:29.975 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 22:18:29.977 +08:00 [INF] Now listening on: http://0.0.0.0:8080 +2026-02-01 22:18:29.977 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2026-02-01 22:18:29.977 +08:00 [INF] Hosting environment: Development +2026-02-01 22:18:29.977 +08:00 [INF] Content root path: /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +2026-02-01 22:19:00.199 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - null null +2026-02-01 22:19:00.212 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - 404 0 null 13.5757ms +2026-02-01 22:19:00.215 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://127.0.0.1:8080/api/product/test, Response status code: 404 +2026-02-01 22:19:01.451 +08:00 [INF] Request starting HTTP/1.1 GET http://0.0.0.0:8080/ - null null +2026-02-01 22:19:01.453 +08:00 [INF] Request finished HTTP/1.1 GET http://0.0.0.0:8080/ - 404 0 null 1.7052ms +2026-02-01 22:19:01.454 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://0.0.0.0:8080/, Response status code: 404 +2026-02-01 22:19:07.472 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/ - null null +2026-02-01 22:19:07.474 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/ - 404 0 null 1.3807ms +2026-02-01 22:19:07.474 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://localhost:8080/, Response status code: 404 +2026-02-01 22:19:10.624 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:19:10.626 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:19:10.636 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:19:10.646 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:19:10.657 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:19:10.669 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 31.0448ms +2026-02-01 22:19:10.669 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:19:10.670 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 45.8155ms +2026-02-01 22:19:10.873 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/favicon.ico - null null +2026-02-01 22:19:10.874 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/favicon.ico - 404 0 null 0.4219ms +2026-02-01 22:19:10.874 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://localhost:8080/favicon.ico, Response status code: 404 +icrosoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.<>c__DisplayClass28_0`1.<g__OnBind|0>d.MoveNext() +--- End of stack trace from previous location --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + --- End of inner exception stack trace --- + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.EndpointsStrategy.BindAsync(AddressBindContext context, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken) + at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken) + at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) + at Microsoft.Extensions.Hosting.Internal.Host.b__14_1(IHostedService service, CancellationToken token) + at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation) +2026-02-01 22:20:22.965 +08:00 [INF] User profile is available. Using '/Users/movingsam/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. +2026-02-01 22:20:23.632 +08:00 [INF] Initializing route cache from database... +2026-02-01 22:20:23.651 +08:00 [INF] Executed DbCommand (9ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:20:23.651 +08:00 [INF] Executed DbCommand (6ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT s."ClusterId", s."Id", s."Address", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."Status" = 1 AND NOT (s."IsDeleted") +ORDER BY s."ClusterId" +2026-02-01 22:20:23.662 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."Status" = 1 AND NOT (t."IsDeleted") +2026-02-01 22:20:23.688 +08:00 [INF] Loaded 2 routes from database +2026-02-01 22:20:23.688 +08:00 [INF] Loaded 2 clusters from database +2026-02-01 22:20:23.689 +08:00 [INF] Route cache initialized: 1 global routes, 1 tenant routes +2026-02-01 22:20:23.690 +08:00 [INF] Starting YARP Gateway +2026-02-01 22:20:23.705 +08:00 [WRN] Overriding address(es) 'http://localhost:5046'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead. +2026-02-01 22:20:23.706 +08:00 [INF] Now listening on: http://0.0.0.0:8080 +2026-02-01 22:20:23.707 +08:00 [INF] Application started. Press Ctrl+C to shut down. +2026-02-01 22:20:23.707 +08:00 [INF] Hosting environment: Development +2026-02-01 22:20:23.707 +08:00 [INF] Content root path: /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +2026-02-01 22:20:29.093 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/tenants - null null +2026-02-01 22:20:29.106 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:20:29.111 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:20:29.119 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:20:29.126 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:20:29.138 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 25.8851ms +2026-02-01 22:20:29.139 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:20:29.140 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 47.3449ms +2026-02-01 22:20:35.542 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - null null +2026-02-01 22:20:35.543 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:20:35.546 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:20:35.553 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:20:35.554 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:20:35.557 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 10.873ms +2026-02-01 22:20:35.557 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:20:35.557 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 14.4363ms +2026-02-01 22:21:01.471 +08:00 [INF] Request starting HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - null null +2026-02-01 22:21:01.473 +08:00 [INF] Request finished HTTP/1.1 GET http://127.0.0.1:8080/api/product/test - 404 0 null 1.7851ms +2026-02-01 22:21:01.474 +08:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: GET http://127.0.0.1:8080/api/product/test, Response status code: 404 +2026-02-01 22:21:10.880 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:21:10.882 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:21:10.882 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:21:10.882 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:21:10.888 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:21:10.888 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:21:10.889 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 6.5091ms +2026-02-01 22:21:10.889 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:21:10.889 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 9.3552ms +2026-02-01 22:21:12.638 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:21:12.639 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:21:12.640 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:21:12.641 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:21:12.647 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:21:12.648 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:21:12.648 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 7.2865ms +2026-02-01 22:21:12.649 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:21:12.650 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 11.8347ms +2026-02-01 22:21:12.653 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 22:21:12.654 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:21:12.654 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:21:12.666 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:21:12.689 +08:00 [INF] Executed DbCommand (11ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 22:21:12.689 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:21:12.689 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 23.2372ms +2026-02-01 22:21:12.690 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:21:12.690 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 36.4262ms +2026-02-01 22:21:12.691 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 22:21:12.691 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:21:12.691 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:21:12.694 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:21:12.704 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 22:21:12.706 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:21:12.707 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 12.8864ms +2026-02-01 22:21:12.707 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:21:12.707 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 16.0741ms +2026-02-01 22:21:13.505 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:21:13.506 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:21:13.507 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:21:13.507 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:21:13.515 +08:00 [INF] Executed DbCommand (7ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:21:13.516 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:21:13.516 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 9.397ms +2026-02-01 22:21:13.516 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:21:13.517 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 11.5291ms +2026-02-01 22:25:30.498 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:25:30.498 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:25:30.498 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:25:30.498 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:25:30.533 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:25:30.534 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:25:30.535 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 36.8297ms +2026-02-01 22:25:30.535 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:25:30.535 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 37.6909ms +2026-02-01 22:26:22.245 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:26:22.245 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:26:22.245 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:26:22.245 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:26:22.249 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:26:22.250 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:26:22.250 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.209ms +2026-02-01 22:26:22.251 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:26:22.251 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 6.6294ms +2026-02-01 22:31:41.925 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:31:41.926 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:41.926 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:31:41.926 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:41.958 +08:00 [INF] Executed DbCommand (7ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:31:41.958 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:41.958 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 31.8244ms +2026-02-01 22:31:41.958 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:31:41.958 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 32.8773ms +2026-02-01 22:31:43.595 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:31:43.595 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:43.595 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:43.596 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:43.604 +08:00 [INF] Executed DbCommand (7ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:31:43.605 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:43.605 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 9.008ms +2026-02-01 22:31:43.605 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:43.606 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 10.8715ms +2026-02-01 22:31:44.652 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:31:44.652 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:44.652 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:44.652 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:44.657 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:31:44.657 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:44.657 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 5.4168ms +2026-02-01 22:31:44.658 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:44.658 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 6.1249ms +2026-02-01 22:31:46.251 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:31:46.251 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:46.251 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:31:46.251 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:46.256 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:31:46.257 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:46.257 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.5403ms +2026-02-01 22:31:46.257 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:31:46.257 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 6.5585ms +2026-02-01 22:31:46.745 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:31:46.746 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:46.746 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:46.746 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:46.751 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:31:46.752 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:46.752 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 5.6117ms +2026-02-01 22:31:46.752 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:46.752 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 6.6457ms +2026-02-01 22:31:48.657 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/product-cluster/instances - null null +2026-02-01 22:31:48.657 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:48.658 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:31:48.659 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:48.666 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 22:31:48.666 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:48.666 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 7.116ms +2026-02-01 22:31:48.666 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:31:48.666 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/product-cluster/instances - 200 null application/json; charset=utf-8 9.4147ms +2026-02-01 22:31:49.924 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:31:49.925 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:49.925 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:31:49.925 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:49.930 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:31:49.930 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:49.931 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.2451ms +2026-02-01 22:31:49.931 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:31:49.931 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 6.2486ms +2026-02-01 22:31:51.612 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:31:51.612 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:51.612 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:51.612 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:51.617 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:31:51.617 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:51.618 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 5.4269ms +2026-02-01 22:31:51.618 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:51.618 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 6.0851ms +2026-02-01 22:31:51.951 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:31:51.952 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:51.952 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:31:51.952 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:51.957 +08:00 [INF] Executed DbCommand (5ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:31:51.958 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:51.958 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 6.4318ms +2026-02-01 22:31:51.960 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:31:51.961 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 9.0549ms +2026-02-01 22:31:54.041 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 22:31:54.041 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:54.042 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:31:54.042 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:54.047 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 22:31:54.047 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:54.047 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 5.2779ms +2026-02-01 22:31:54.047 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:31:54.047 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 6.3321ms +2026-02-01 22:31:55.255 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 22:31:55.255 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:55.256 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:31:55.256 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:55.261 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 22:31:55.261 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:55.262 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 5.9988ms +2026-02-01 22:31:55.262 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:31:55.262 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 6.751ms +2026-02-01 22:31:56.595 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:31:56.595 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:31:56.595 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:56.595 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:31:56.600 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:31:56.600 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:31:56.601 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 5.0439ms +2026-02-01 22:31:56.601 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:31:56.601 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 6.1072ms +2026-02-01 22:32:01.664 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/product-cluster/instances - null null +2026-02-01 22:32:01.664 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:01.664 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:32:01.664 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:01.668 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 22:32:01.669 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:01.669 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 4.9407ms +2026-02-01 22:32:01.669 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:32:01.670 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/product-cluster/instances - 200 null application/json; charset=utf-8 5.639ms +2026-02-01 22:32:04.216 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:32:04.216 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:04.216 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:04.217 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:04.222 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:32:04.222 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:04.223 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.4752ms +2026-02-01 22:32:04.223 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:04.223 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 6.7163ms +2026-02-01 22:32:04.591 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:32:04.591 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:04.591 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:04.591 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:04.595 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:32:04.595 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:04.596 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 4.5298ms +2026-02-01 22:32:04.596 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:04.596 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 5.4523ms +2026-02-01 22:32:12.562 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:32:12.562 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:12.562 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:12.563 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:12.568 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:32:12.568 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:12.569 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 6.2462ms +2026-02-01 22:32:12.569 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:12.569 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 7.22ms +2026-02-01 22:32:13.960 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 22:32:13.960 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:13.960 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:32:13.960 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:13.965 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 22:32:13.965 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:13.966 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 5.5422ms +2026-02-01 22:32:13.966 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:32:13.966 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 6.2859ms +2026-02-01 22:32:17.041 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 22:32:17.041 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:17.041 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:32:17.041 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:17.046 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 22:32:17.046 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:17.047 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 5.0143ms +2026-02-01 22:32:17.047 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:32:17.047 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 5.7629ms +2026-02-01 22:32:21.920 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:32:21.920 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:21.921 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:21.921 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:21.925 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:32:21.925 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:21.925 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 4.7163ms +2026-02-01 22:32:21.926 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:21.926 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 5.3019ms +2026-02-01 22:32:24.298 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:32:24.298 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:24.298 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:24.298 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:24.303 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:32:24.303 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:24.304 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.0583ms +2026-02-01 22:32:24.304 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:24.304 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 6.0625ms +2026-02-01 22:32:24.762 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:32:24.762 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:24.762 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:24.762 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:24.768 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:32:24.768 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:24.769 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 6.0394ms +2026-02-01 22:32:24.769 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:24.769 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 6.762ms +2026-02-01 22:32:25.372 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:32:25.373 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:25.373 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:25.373 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:25.379 +08:00 [INF] Executed DbCommand (6ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:32:25.380 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:25.380 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 7.209ms +2026-02-01 22:32:25.380 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:25.380 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 7.8575ms +2026-02-01 22:32:25.383 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:32:25.384 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:25.384 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:25.384 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:25.387 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:32:25.388 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:25.388 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 4.2493ms +2026-02-01 22:32:25.388 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:25.388 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 4.7142ms +2026-02-01 22:32:25.389 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 22:32:25.389 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:25.390 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:32:25.390 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:25.394 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 22:32:25.394 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:25.394 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 4.3996ms +2026-02-01 22:32:25.394 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:32:25.394 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 4.9442ms +2026-02-01 22:32:25.395 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 22:32:25.395 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:25.395 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:32:25.395 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:25.398 +08:00 [INF] Executed DbCommand (2ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 22:32:25.398 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:25.399 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 3.4243ms +2026-02-01 22:32:25.399 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:32:25.399 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 3.7777ms +2026-02-01 22:32:29.352 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:32:29.352 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:29.352 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:29.352 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:29.357 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:32:29.357 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:29.357 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 5.0185ms +2026-02-01 22:32:29.357 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:29.357 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 5.594ms +2026-02-01 22:32:31.246 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:32:31.246 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:31.246 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:31.246 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:31.250 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:32:31.250 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:31.251 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 4.5497ms +2026-02-01 22:32:31.251 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:31.251 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 4.979ms +2026-02-01 22:32:31.255 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - null null +2026-02-01 22:32:31.255 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:31.255 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:31.255 +08:00 [INF] Route matched with {action = "GetGlobalRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetGlobalRoutes() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:31.259 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."IsGlobal" AND NOT (t."IsDeleted") +2026-02-01 22:32:31.259 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:31.259 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway) in 4.2887ms +2026-02-01 22:32:31.259 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetGlobalRoutes (YarpGateway)' +2026-02-01 22:32:31.259 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/routes/global - 200 null application/json; charset=utf-8 4.6967ms +2026-02-01 22:32:31.260 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - null null +2026-02-01 22:32:31.260 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:31.261 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:32:31.261 +08:00 [INF] Route matched with {action = "GetTenantRoutes", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenantRoutes(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:31.265 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__tenantCode_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."ClusterId", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."IsGlobal", t."PathPattern", t."Priority", t."ServiceName", t."Status", t."TenantCode", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "TenantRoutes" AS t +WHERE t."TenantCode" = @__tenantCode_0 AND NOT (t."IsDeleted") +2026-02-01 22:32:31.265 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenantRoute, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:31.266 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway) in 4.8276ms +2026-02-01 22:32:31.266 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenantRoutes (YarpGateway)' +2026-02-01 22:32:31.266 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants/1668/routes - 200 null application/json; charset=utf-8 5.2765ms +2026-02-01 22:32:31.266 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - null null +2026-02-01 22:32:31.267 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:31.267 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:32:31.267 +08:00 [INF] Route matched with {action = "GetInstances", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetInstances(System.String) on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:31.271 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[@__clusterId_0='?'], CommandType='"Text"', CommandTimeout='30'] +SELECT s."Id", s."Address", s."ClusterId", s."CreatedBy", s."CreatedTime", s."DestinationId", s."Health", s."IsDeleted", s."Status", s."UpdatedBy", s."UpdatedTime", s."Version", s."Weight" +FROM "ServiceInstances" AS s +WHERE s."ClusterId" = @__clusterId_0 AND NOT (s."IsDeleted") +2026-02-01 22:32:31.271 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwServiceInstance, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:31.272 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway) in 4.6903ms +2026-02-01 22:32:31.272 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetInstances (YarpGateway)' +2026-02-01 22:32:31.272 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/clusters/1668-backend/instances - 200 null application/json; charset=utf-8 5.1732ms +2026-02-01 22:32:31.994 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 22:32:31.994 +08:00 [INF] CORS policy execution successful. +2026-02-01 22:32:31.994 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:31.994 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 22:32:31.999 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 22:32:32.000 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 22:32:32.000 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.5837ms +2026-02-01 22:32:32.000 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 22:32:32.000 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 5.9601ms +2026-02-01 23:02:32.878 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 23:02:32.879 +08:00 [INF] CORS policy execution successful. +2026-02-01 23:02:32.879 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 23:02:32.879 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 23:02:32.907 +08:00 [INF] Executed DbCommand (4ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 23:02:32.908 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 23:02:32.908 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 28.7787ms +2026-02-01 23:02:32.908 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 23:02:32.908 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 30.5865ms +2026-02-01 23:02:32.909 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 23:02:32.909 +08:00 [INF] CORS policy execution successful. +2026-02-01 23:02:32.909 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 23:02:32.909 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 23:02:32.913 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 23:02:32.913 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 23:02:32.914 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 5.3412ms +2026-02-01 23:02:32.914 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 23:02:32.914 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 499 null application/json; charset=utf-8 5.6739ms +2026-02-01 23:02:33.168 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - null null +2026-02-01 23:02:33.168 +08:00 [INF] CORS policy execution successful. +2026-02-01 23:02:33.168 +08:00 [INF] Executing endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 23:02:33.168 +08:00 [INF] Route matched with {action = "GetTenants", controller = "GatewayConfig"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTenants() on controller YarpGateway.Controllers.GatewayConfigController (YarpGateway). +2026-02-01 23:02:33.172 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30'] +SELECT t."Id", t."CreatedBy", t."CreatedTime", t."IsDeleted", t."Status", t."TenantCode", t."TenantName", t."UpdatedBy", t."UpdatedTime", t."Version" +FROM "Tenants" AS t +WHERE NOT (t."IsDeleted") +2026-02-01 23:02:33.172 +08:00 [INF] Executing OkObjectResult, writing value of type 'System.Collections.Generic.List`1[[YarpGateway.Models.GwTenant, YarpGateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. +2026-02-01 23:02:33.172 +08:00 [INF] Executed action YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway) in 3.8746ms +2026-02-01 23:02:33.172 +08:00 [INF] Executed endpoint 'YarpGateway.Controllers.GatewayConfigController.GetTenants (YarpGateway)' +2026-02-01 23:02:33.172 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:8080/api/gateway/tenants - 200 null application/json; charset=utf-8 4.2812ms diff --git a/src/YarpGateway/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/src/YarpGateway/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs new file mode 100644 index 0000000..925b135 --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGate.7B3C040B.Up2Date b/src/YarpGateway/obj/Debug/net10.0/YarpGate.7B3C040B.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.AssemblyInfo.cs b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.AssemblyInfo.cs new file mode 100644 index 0000000..cdc3578 --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("YarpGateway")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6ca282d2088e2c62e6b0c2bbc54720117c8dc08f")] +[assembly: System.Reflection.AssemblyProductAttribute("YarpGateway")] +[assembly: System.Reflection.AssemblyTitleAttribute("YarpGateway")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// 由 MSBuild WriteCodeFragment 类生成。 + diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.AssemblyInfoInputs.cache b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.AssemblyInfoInputs.cache new file mode 100644 index 0000000..0805ceb --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +24722b40465d63c21132d56deedee29b8a7fc957b18fac2d4454b56da1ef9722 diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.GeneratedMSBuildEditorConfig.editorconfig b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..7556f3d --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,31 @@ +is_global = true +build_property.TargetFramework = net10.0 +build_property.TargetFramework = net10.0 +build_property.TargetPlatformMinVersion = +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = true +build_property.UsingMicrosoftNETSdkWeb = true +build_property.ProjectTypeGuids = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v10.0 +build_property.RootNamespace = YarpGateway +build_property.RootNamespace = YarpGateway +build_property.ProjectDir = /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.RazorLangVersion = 9.0 +build_property.SupportLocalizedComponentNames = +build_property.GenerateRazorMetadataSourceChecksumAttributes = +build_property.MSBuildProjectDirectory = /Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway +build_property._RazorSourceGeneratorDebug = +build_property.EffectiveAnalysisLevelStyle = 10.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.GlobalUsings.g.cs b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.GlobalUsings.g.cs new file mode 100644 index 0000000..5e6145d --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.GlobalUsings.g.cs @@ -0,0 +1,17 @@ +// +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Hosting; +global using Microsoft.AspNetCore.Http; +global using Microsoft.AspNetCore.Routing; +global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Hosting; +global using Microsoft.Extensions.Logging; +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Net.Http.Json; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.MvcApplicationPartsAssemblyInfo.cache b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.MvcApplicationPartsAssemblyInfo.cache new file mode 100644 index 0000000..e69de29 diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.assets.cache b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.assets.cache new file mode 100644 index 0000000..5bcfc75 Binary files /dev/null and b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.assets.cache differ diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.AssemblyReference.cache b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.AssemblyReference.cache new file mode 100644 index 0000000..4d1e321 Binary files /dev/null and b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.AssemblyReference.cache differ diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.CoreCompileInputs.cache b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..6ad9a69 --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +afff8da1b7fa5b8af5002a8af31264c6b173420be4317056e1ed15817f3d9403 diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.FileListAbsolute.txt b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..16f27ac --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.FileListAbsolute.txt @@ -0,0 +1,139 @@ +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.AssemblyReference.cache +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/rpswa.dswa.cache.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.GeneratedMSBuildEditorConfig.editorconfig +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.AssemblyInfoInputs.cache +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.AssemblyInfo.cs +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.csproj.CoreCompileInputs.cache +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.MvcApplicationPartsAssemblyInfo.cache +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/appsettings.Development.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/appsettings.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/YarpGateway.staticwebassets.endpoints.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/YarpGateway +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/YarpGateway.deps.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/YarpGateway.runtimeconfig.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/YarpGateway.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/YarpGateway.pdb +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Humanizer.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.Bcl.AsyncInterfaces.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.Build.Locator.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.CSharp.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Abstractions.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Design.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.EntityFrameworkCore.Relational.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.Extensions.DependencyModel.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Abstractions.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Logging.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Microsoft.IdentityModel.Tokens.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Mono.TextTemplating.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Npgsql.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Pipelines.Sockets.Unofficial.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.AspNetCore.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.Extensions.Hosting.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.Extensions.Logging.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.Formatting.Compact.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.Settings.Configuration.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.Console.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.Debug.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Serilog.Sinks.File.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/StackExchange.Redis.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/System.CodeDom.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/System.Composition.AttributedModel.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/System.Composition.Convention.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/System.Composition.Hosting.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/System.Composition.Runtime.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/System.Composition.TypedParts.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/System.IdentityModel.Tokens.Jwt.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/System.IO.Hashing.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/Yarp.ReverseProxy.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/bin/Debug/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/rjimswa.dswa.cache.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/rjsmrazor.dswa.cache.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/rjsmcshtml.dswa.cache.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/scopedcss/bundle/YarpGateway.styles.css +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.json.cache +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/staticwebassets.development.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.endpoints.json +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/swae.build.ex.cache +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGate.7B3C040B.Up2Date +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/refint/YarpGateway.dll +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.pdb +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/YarpGateway.genruntimeconfig.cache +/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/Debug/net10.0/ref/YarpGateway.dll diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.dll b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.dll new file mode 100644 index 0000000..9ed99c6 Binary files /dev/null and b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.dll differ diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.genruntimeconfig.cache b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.genruntimeconfig.cache new file mode 100644 index 0000000..0a97416 --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.genruntimeconfig.cache @@ -0,0 +1 @@ +91dc09f92d17500e9b625ba010ff6aab83330f7d01b531307947e66a3c0af8d6 diff --git a/src/YarpGateway/obj/Debug/net10.0/YarpGateway.pdb b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.pdb new file mode 100644 index 0000000..96f6229 Binary files /dev/null and b/src/YarpGateway/obj/Debug/net10.0/YarpGateway.pdb differ diff --git a/src/YarpGateway/obj/Debug/net10.0/apphost b/src/YarpGateway/obj/Debug/net10.0/apphost new file mode 100755 index 0000000..23ce3dc Binary files /dev/null and b/src/YarpGateway/obj/Debug/net10.0/apphost differ diff --git a/src/YarpGateway/obj/Debug/net10.0/ref/YarpGateway.dll b/src/YarpGateway/obj/Debug/net10.0/ref/YarpGateway.dll new file mode 100644 index 0000000..643dd93 Binary files /dev/null and b/src/YarpGateway/obj/Debug/net10.0/ref/YarpGateway.dll differ diff --git a/src/YarpGateway/obj/Debug/net10.0/refint/YarpGateway.dll b/src/YarpGateway/obj/Debug/net10.0/refint/YarpGateway.dll new file mode 100644 index 0000000..643dd93 Binary files /dev/null and b/src/YarpGateway/obj/Debug/net10.0/refint/YarpGateway.dll differ diff --git a/src/YarpGateway/obj/Debug/net10.0/rjsmcshtml.dswa.cache.json b/src/YarpGateway/obj/Debug/net10.0/rjsmcshtml.dswa.cache.json new file mode 100644 index 0000000..bf4ad3f --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/rjsmcshtml.dswa.cache.json @@ -0,0 +1 @@ +{"GlobalPropertiesHash":"who4fmL7ycnXxq++J8j9Kcv1lb9J8xELeJKP5hm7kMs=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["TjxGCqcuiGNPgVk47lkT2aF1p2cRSQTuAmFnM3yAtFA=","uSrTJ1IOyLboCEM3cAAeeX4m0Yd2CffbM9hvDkA0z88=","b06gMgYepigYvzKiU5u4\u002BLze92BFLI8SMoren3tjw\u002Bk=","Mmgj3g0hKtMl9sg/01LDta6ZKAwRjPqySXrkhOZK90M=","r00k37JQu0NtvD9Jo7hW6I4xSRNRLDiGIbrH9idcE6w=","PEd/10CX25hLnx6qvCbAgQIoDtlx6iLnWD5X\u002BAWzA3M=","XrwXdmUkJKzIKj7oWnVdnpyrOlGO4Xd09DgJaOjP4rw=","pGjuh5BybHYNh/b2rWWquve/yGfLVf/qBz7m\u002BnYMZuo=","ITscrUDMMFSqVWhfIvLGeGIGOWaU0o9p9FBsqbCPn1w="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/src/YarpGateway/obj/Debug/net10.0/rjsmrazor.dswa.cache.json b/src/YarpGateway/obj/Debug/net10.0/rjsmrazor.dswa.cache.json new file mode 100644 index 0000000..ebfc434 --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/rjsmrazor.dswa.cache.json @@ -0,0 +1 @@ +{"GlobalPropertiesHash":"OyqIvbc/GNMFNwkdzMksG9lHlCtVrIjoqP8GUkMbaL0=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["TjxGCqcuiGNPgVk47lkT2aF1p2cRSQTuAmFnM3yAtFA=","uSrTJ1IOyLboCEM3cAAeeX4m0Yd2CffbM9hvDkA0z88=","b06gMgYepigYvzKiU5u4\u002BLze92BFLI8SMoren3tjw\u002Bk=","Mmgj3g0hKtMl9sg/01LDta6ZKAwRjPqySXrkhOZK90M=","r00k37JQu0NtvD9Jo7hW6I4xSRNRLDiGIbrH9idcE6w=","PEd/10CX25hLnx6qvCbAgQIoDtlx6iLnWD5X\u002BAWzA3M=","XrwXdmUkJKzIKj7oWnVdnpyrOlGO4Xd09DgJaOjP4rw=","pGjuh5BybHYNh/b2rWWquve/yGfLVf/qBz7m\u002BnYMZuo=","ITscrUDMMFSqVWhfIvLGeGIGOWaU0o9p9FBsqbCPn1w="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/src/YarpGateway/obj/Debug/net10.0/rpswa.dswa.cache.json b/src/YarpGateway/obj/Debug/net10.0/rpswa.dswa.cache.json new file mode 100644 index 0000000..56de85d --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/rpswa.dswa.cache.json @@ -0,0 +1 @@ +{"GlobalPropertiesHash":"PqlGqjnMDUXs1MO+eGgstQ0AEnOikDWRNsNtFmNOUxc=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["TjxGCqcuiGNPgVk47lkT2aF1p2cRSQTuAmFnM3yAtFA=","uSrTJ1IOyLboCEM3cAAeeX4m0Yd2CffbM9hvDkA0z88="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.endpoints.json b/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.endpoints.json new file mode 100644 index 0000000..5576e88 --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.endpoints.json @@ -0,0 +1 @@ +{"Version":1,"ManifestType":"Build","Endpoints":[]} \ No newline at end of file diff --git a/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.json b/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.json new file mode 100644 index 0000000..70ed7c2 --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.json @@ -0,0 +1 @@ +{"Version":1,"Hash":"QC8rQzJvJWiKNKtNrA3H4js4A9UpZtnAoMrjArXiE0w=","Source":"YarpGateway","BasePath":"/","Mode":"Root","ManifestType":"Build","ReferencedProjectsConfiguration":[],"DiscoveryPatterns":[],"Assets":[],"Endpoints":[]} \ No newline at end of file diff --git a/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.json.cache b/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.json.cache new file mode 100644 index 0000000..e108426 --- /dev/null +++ b/src/YarpGateway/obj/Debug/net10.0/staticwebassets.build.json.cache @@ -0,0 +1 @@ +QC8rQzJvJWiKNKtNrA3H4js4A9UpZtnAoMrjArXiE0w= \ No newline at end of file diff --git a/src/YarpGateway/obj/Debug/net10.0/swae.build.ex.cache b/src/YarpGateway/obj/Debug/net10.0/swae.build.ex.cache new file mode 100644 index 0000000..e69de29 diff --git a/src/YarpGateway/obj/YarpGateway.csproj.EntityFrameworkCore.targets b/src/YarpGateway/obj/YarpGateway.csproj.EntityFrameworkCore.targets new file mode 100644 index 0000000..6b67a59 --- /dev/null +++ b/src/YarpGateway/obj/YarpGateway.csproj.EntityFrameworkCore.targets @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/YarpGateway/obj/YarpGateway.csproj.nuget.dgspec.json b/src/YarpGateway/obj/YarpGateway.csproj.nuget.dgspec.json new file mode 100644 index 0000000..33a8ea8 --- /dev/null +++ b/src/YarpGateway/obj/YarpGateway.csproj.nuget.dgspec.json @@ -0,0 +1,521 @@ +{ + "format": 1, + "restore": { + "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/YarpGateway.csproj": {} + }, + "projects": { + "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/YarpGateway.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/YarpGateway.csproj", + "projectName": "YarpGateway", + "projectPath": "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/YarpGateway.csproj", + "packagesPath": "/Users/movingsam/.nuget/packages/", + "outputPath": "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/movingsam/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "/usr/local/share/dotnet/library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.100" + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "dependencies": { + "Microsoft.AspNetCore.Authentication.JwtBearer": { + "target": "Package", + "version": "[10.0.0, )" + }, + "Microsoft.EntityFrameworkCore.Design": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[9.0.0, )" + }, + "Npgsql.EntityFrameworkCore.PostgreSQL": { + "target": "Package", + "version": "[9.0.0, )" + }, + "Serilog.AspNetCore": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Serilog.Sinks.Console": { + "target": "Package", + "version": "[6.0.0, )" + }, + "Serilog.Sinks.File": { + "target": "Package", + "version": "[6.0.0, )" + }, + "StackExchange.Redis": { + "target": "Package", + "version": "[2.8.16, )" + }, + "Yarp.ReverseProxy": { + "target": "Package", + "version": "[2.2.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.101/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.AspNetCore": "(,10.0.32767]", + "Microsoft.AspNetCore.Antiforgery": "(,10.0.32767]", + "Microsoft.AspNetCore.App": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.BearerToken": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Cookies": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.OAuth": "(,10.0.32767]", + "Microsoft.AspNetCore.Authorization": "(,10.0.32767]", + "Microsoft.AspNetCore.Authorization.Policy": "(,10.0.32767]", + "Microsoft.AspNetCore.Components": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Authorization": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Endpoints": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Forms": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Server": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Web": "(,10.0.32767]", + "Microsoft.AspNetCore.Connections.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.CookiePolicy": "(,10.0.32767]", + "Microsoft.AspNetCore.Cors": "(,10.0.32767]", + "Microsoft.AspNetCore.Cryptography.Internal": "(,10.0.32767]", + "Microsoft.AspNetCore.Cryptography.KeyDerivation": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection.Extensions": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics.HealthChecks": "(,10.0.32767]", + "Microsoft.AspNetCore.HostFiltering": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting.Server.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Html.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Connections": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Connections.Common": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Extensions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Features": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Results": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpLogging": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpOverrides": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpsPolicy": "(,10.0.32767]", + "Microsoft.AspNetCore.Identity": "(,10.0.32767]", + "Microsoft.AspNetCore.Localization": "(,10.0.32767]", + "Microsoft.AspNetCore.Localization.Routing": "(,10.0.32767]", + "Microsoft.AspNetCore.Metadata": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.ApiExplorer": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Cors": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.DataAnnotations": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Formatters.Json": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Formatters.Xml": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Localization": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Razor": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.RazorPages": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.TagHelpers": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.ViewFeatures": "(,10.0.32767]", + "Microsoft.AspNetCore.OutputCaching": "(,10.0.32767]", + "Microsoft.AspNetCore.RateLimiting": "(,10.0.32767]", + "Microsoft.AspNetCore.Razor": "(,10.0.32767]", + "Microsoft.AspNetCore.Razor.Runtime": "(,10.0.32767]", + "Microsoft.AspNetCore.RequestDecompression": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCaching": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCaching.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCompression": "(,10.0.32767]", + "Microsoft.AspNetCore.Rewrite": "(,10.0.32767]", + "Microsoft.AspNetCore.Routing": "(,10.0.32767]", + "Microsoft.AspNetCore.Routing.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.HttpSys": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.IIS": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.IISIntegration": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.Quic": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "(,10.0.32767]", + "Microsoft.AspNetCore.Session": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Common": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Protocols.Json": "(,10.0.32767]", + "Microsoft.AspNetCore.StaticAssets": "(,10.0.32767]", + "Microsoft.AspNetCore.StaticFiles": "(,10.0.32767]", + "Microsoft.AspNetCore.WebSockets": "(,10.0.32767]", + "Microsoft.AspNetCore.WebUtilities": "(,10.0.32767]", + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.Extensions.Caching.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Caching.Memory": "(,10.0.32767]", + "Microsoft.Extensions.Configuration": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Binder": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.CommandLine": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.FileExtensions": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Ini": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Json": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.KeyPerFile": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.UserSecrets": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Xml": "(,10.0.32767]", + "Microsoft.Extensions.DependencyInjection": "(,10.0.32767]", + "Microsoft.Extensions.DependencyInjection.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.HealthChecks": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Features": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Composite": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Physical": "(,10.0.32767]", + "Microsoft.Extensions.FileSystemGlobbing": "(,10.0.32767]", + "Microsoft.Extensions.Hosting": "(,10.0.32767]", + "Microsoft.Extensions.Hosting.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Http": "(,10.0.32767]", + "Microsoft.Extensions.Identity.Core": "(,10.0.32767]", + "Microsoft.Extensions.Identity.Stores": "(,10.0.32767]", + "Microsoft.Extensions.Localization": "(,10.0.32767]", + "Microsoft.Extensions.Localization.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Logging": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Configuration": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Console": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Debug": "(,10.0.32767]", + "Microsoft.Extensions.Logging.EventLog": "(,10.0.32767]", + "Microsoft.Extensions.Logging.EventSource": "(,10.0.32767]", + "Microsoft.Extensions.Logging.TraceSource": "(,10.0.32767]", + "Microsoft.Extensions.ObjectPool": "(,10.0.32767]", + "Microsoft.Extensions.Options": "(,10.0.32767]", + "Microsoft.Extensions.Options.ConfigurationExtensions": "(,10.0.32767]", + "Microsoft.Extensions.Options.DataAnnotations": "(,10.0.32767]", + "Microsoft.Extensions.Primitives": "(,10.0.32767]", + "Microsoft.Extensions.Validation": "(,10.0.32767]", + "Microsoft.Extensions.WebEncoders": "(,10.0.32767]", + "Microsoft.JSInterop": "(,10.0.32767]", + "Microsoft.Net.Http.Headers": "(,10.0.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.EventLog": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Cbor": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Cryptography.Xml": "(,10.0.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.RateLimiting": "(,10.0.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } + } +} \ No newline at end of file diff --git a/src/YarpGateway/obj/YarpGateway.csproj.nuget.g.props b/src/YarpGateway/obj/YarpGateway.csproj.nuget.g.props new file mode 100644 index 0000000..afacc71 --- /dev/null +++ b/src/YarpGateway/obj/YarpGateway.csproj.nuget.g.props @@ -0,0 +1,23 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/movingsam/.nuget/packages/ + /Users/movingsam/.nuget/packages/ + PackageReference + 7.0.0 + + + + + + + + + + + /Users/movingsam/.nuget/packages/microsoft.codeanalysis.analyzers/3.3.4 + + \ No newline at end of file diff --git a/src/YarpGateway/obj/YarpGateway.csproj.nuget.g.targets b/src/YarpGateway/obj/YarpGateway.csproj.nuget.g.targets new file mode 100644 index 0000000..c05559c --- /dev/null +++ b/src/YarpGateway/obj/YarpGateway.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/YarpGateway/obj/project.assets.json b/src/YarpGateway/obj/project.assets.json new file mode 100644 index 0000000..9a1a025 --- /dev/null +++ b/src/YarpGateway/obj/project.assets.json @@ -0,0 +1,3318 @@ +{ + "version": 3, + "targets": { + "net10.0": { + "Humanizer.Core/2.14.1": { + "type": "package", + "compile": { + "lib/net6.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Humanizer.dll": { + "related": ".xml" + } + } + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.0": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.0.1" + }, + "compile": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "related": ".xml" + } + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + }, + "Microsoft.Bcl.AsyncInterfaces/7.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.1/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Build.Framework/17.8.3": { + "type": "package", + "compile": { + "ref/net8.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/_._": { + "related": ".pdb;.xml" + } + } + }, + "Microsoft.Build.Locator/1.7.8": { + "type": "package", + "compile": { + "lib/net6.0/_._": {} + }, + "runtime": { + "lib/net6.0/Microsoft.Build.Locator.dll": {} + }, + "build": { + "build/_._": {} + } + }, + "Microsoft.CodeAnalysis.Analyzers/3.3.4": { + "type": "package", + "build": { + "buildTransitive/Microsoft.CodeAnalysis.Analyzers.props": {}, + "buildTransitive/Microsoft.CodeAnalysis.Analyzers.targets": {} + } + }, + "Microsoft.CodeAnalysis.Common/4.8.0": { + "type": "package", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4" + }, + "compile": { + "lib/net7.0/_._": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.dll": { + "related": ".pdb;.xml" + } + }, + "resource": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp/4.8.0": { + "type": "package", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.8.0]" + }, + "compile": { + "lib/net7.0/_._": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.dll": { + "related": ".pdb;.xml" + } + }, + "resource": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces/4.8.0": { + "type": "package", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.8.0]", + "Microsoft.CodeAnalysis.Common": "[4.8.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.8.0]" + }, + "compile": { + "lib/net7.0/_._": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll": { + "related": ".pdb;.xml" + } + }, + "resource": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common/4.8.0": { + "type": "package", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "7.0.0", + "Microsoft.CodeAnalysis.Common": "[4.8.0]", + "System.Composition": "7.0.0" + }, + "compile": { + "lib/net7.0/_._": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.dll": { + "related": ".pdb;.xml" + } + }, + "resource": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.Workspaces.MSBuild/4.8.0": { + "type": "package", + "dependencies": { + "Microsoft.Build.Framework": "16.10.0", + "Microsoft.CodeAnalysis.Common": "[4.8.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.8.0]" + }, + "compile": { + "lib/net7.0/_._": { + "related": ".pdb;.runtimeconfig.json;.xml" + } + }, + "runtime": { + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll": { + "related": ".pdb;.runtimeconfig.json;.xml" + }, + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll": { + "related": ".BuildHost.pdb;.BuildHost.runtimeconfig.json;.BuildHost.xml;.pdb;.xml" + } + }, + "resource": { + "lib/net7.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "cs" + }, + "lib/net7.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "de" + }, + "lib/net7.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "es" + }, + "lib/net7.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "fr" + }, + "lib/net7.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "it" + }, + "lib/net7.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "ja" + }, + "lib/net7.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "ko" + }, + "lib/net7.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "pl" + }, + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "pt-BR" + }, + "lib/net7.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "ru" + }, + "lib/net7.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "tr" + }, + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.EntityFrameworkCore/9.0.0": { + "type": "package", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "9.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "9.0.0" + }, + "compile": { + "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props": {} + } + }, + "Microsoft.EntityFrameworkCore.Abstractions/9.0.0": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.EntityFrameworkCore.Analyzers/9.0.0": { + "type": "package" + }, + "Microsoft.EntityFrameworkCore.Design/9.0.0": { + "type": "package", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Build.Framework": "17.8.3", + "Microsoft.Build.Locator": "1.7.8", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.8.0", + "Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.8.0", + "Microsoft.EntityFrameworkCore.Relational": "9.0.0", + "Microsoft.Extensions.DependencyModel": "9.0.0", + "Mono.TextTemplating": "3.0.0" + }, + "compile": { + "lib/net8.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll": { + "related": ".xml" + } + }, + "build": { + "build/net8.0/Microsoft.EntityFrameworkCore.Design.props": {} + } + }, + "Microsoft.EntityFrameworkCore.Relational/9.0.0": { + "type": "package", + "dependencies": { + "Microsoft.EntityFrameworkCore": "9.0.0" + }, + "compile": { + "lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.DependencyModel/9.0.0": { + "type": "package", + "compile": { + "lib/net9.0/Microsoft.Extensions.DependencyModel.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.Extensions.DependencyModel.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net8.0/_._": {} + } + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "type": "package", + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Logging.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.0.1", + "System.IdentityModel.Tokens.Jwt": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.0.1" + }, + "compile": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll": { + "related": ".xml" + } + } + }, + "Mono.TextTemplating/3.0.0": { + "type": "package", + "dependencies": { + "System.CodeDom": "6.0.0" + }, + "compile": { + "lib/net6.0/_._": {} + }, + "runtime": { + "lib/net6.0/Mono.TextTemplating.dll": {} + }, + "build": { + "buildTransitive/Mono.TextTemplating.targets": {} + } + }, + "Npgsql/9.0.0": { + "type": "package", + "compile": { + "lib/net8.0/Npgsql.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Npgsql.dll": { + "related": ".xml" + } + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/9.0.0": { + "type": "package", + "dependencies": { + "Microsoft.EntityFrameworkCore": "[9.0.0, 10.0.0)", + "Microsoft.EntityFrameworkCore.Relational": "[9.0.0, 10.0.0)", + "Npgsql": "9.0.0" + }, + "compile": { + "lib/net8.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": { + "related": ".xml" + } + } + }, + "Pipelines.Sockets.Unofficial/2.2.8": { + "type": "package", + "compile": { + "lib/net5.0/Pipelines.Sockets.Unofficial.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net5.0/Pipelines.Sockets.Unofficial.dll": { + "related": ".xml" + } + } + }, + "Serilog/4.0.0": { + "type": "package", + "compile": { + "lib/net8.0/Serilog.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Serilog.dll": { + "related": ".xml" + } + } + }, + "Serilog.AspNetCore/8.0.0": { + "type": "package", + "dependencies": { + "Serilog": "3.1.1", + "Serilog.Extensions.Hosting": "8.0.0", + "Serilog.Extensions.Logging": "8.0.0", + "Serilog.Formatting.Compact": "2.0.0", + "Serilog.Settings.Configuration": "8.0.0", + "Serilog.Sinks.Console": "5.0.0", + "Serilog.Sinks.Debug": "2.0.0", + "Serilog.Sinks.File": "5.0.0" + }, + "compile": { + "lib/net8.0/Serilog.AspNetCore.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Serilog.AspNetCore.dll": { + "related": ".xml" + } + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + }, + "Serilog.Extensions.Hosting/8.0.0": { + "type": "package", + "dependencies": { + "Serilog": "3.1.1", + "Serilog.Extensions.Logging": "8.0.0" + }, + "compile": { + "lib/net8.0/Serilog.Extensions.Hosting.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Serilog.Extensions.Hosting.dll": { + "related": ".xml" + } + } + }, + "Serilog.Extensions.Logging/8.0.0": { + "type": "package", + "dependencies": { + "Serilog": "3.1.1" + }, + "compile": { + "lib/net8.0/Serilog.Extensions.Logging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Serilog.Extensions.Logging.dll": { + "related": ".xml" + } + } + }, + "Serilog.Formatting.Compact/2.0.0": { + "type": "package", + "dependencies": { + "Serilog": "3.1.0" + }, + "compile": { + "lib/net7.0/Serilog.Formatting.Compact.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net7.0/Serilog.Formatting.Compact.dll": { + "related": ".xml" + } + } + }, + "Serilog.Settings.Configuration/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyModel": "8.0.0", + "Serilog": "3.1.1" + }, + "compile": { + "lib/net8.0/Serilog.Settings.Configuration.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Serilog.Settings.Configuration.dll": { + "related": ".xml" + } + } + }, + "Serilog.Sinks.Console/6.0.0": { + "type": "package", + "dependencies": { + "Serilog": "4.0.0" + }, + "compile": { + "lib/net8.0/Serilog.Sinks.Console.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Serilog.Sinks.Console.dll": { + "related": ".xml" + } + } + }, + "Serilog.Sinks.Debug/2.0.0": { + "type": "package", + "dependencies": { + "Serilog": "2.10.0" + }, + "compile": { + "lib/netstandard2.1/Serilog.Sinks.Debug.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/Serilog.Sinks.Debug.dll": { + "related": ".xml" + } + } + }, + "Serilog.Sinks.File/6.0.0": { + "type": "package", + "dependencies": { + "Serilog": "4.0.0" + }, + "compile": { + "lib/net8.0/Serilog.Sinks.File.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Serilog.Sinks.File.dll": { + "related": ".xml" + } + } + }, + "StackExchange.Redis/2.8.16": { + "type": "package", + "dependencies": { + "Pipelines.Sockets.Unofficial": "2.2.8" + }, + "compile": { + "lib/net6.0/StackExchange.Redis.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/StackExchange.Redis.dll": { + "related": ".xml" + } + } + }, + "System.CodeDom/6.0.0": { + "type": "package", + "compile": { + "lib/net6.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.CodeDom.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + } + }, + "System.Composition/7.0.0": { + "type": "package", + "dependencies": { + "System.Composition.AttributedModel": "7.0.0", + "System.Composition.Convention": "7.0.0", + "System.Composition.Hosting": "7.0.0", + "System.Composition.Runtime": "7.0.0", + "System.Composition.TypedParts": "7.0.0" + }, + "compile": { + "lib/netcoreapp2.0/_._": {} + }, + "runtime": { + "lib/netcoreapp2.0/_._": {} + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Composition.AttributedModel/7.0.0": { + "type": "package", + "compile": { + "lib/net7.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net7.0/System.Composition.AttributedModel.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Composition.Convention/7.0.0": { + "type": "package", + "dependencies": { + "System.Composition.AttributedModel": "7.0.0" + }, + "compile": { + "lib/net7.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net7.0/System.Composition.Convention.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Composition.Hosting/7.0.0": { + "type": "package", + "dependencies": { + "System.Composition.Runtime": "7.0.0" + }, + "compile": { + "lib/net7.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net7.0/System.Composition.Hosting.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Composition.Runtime/7.0.0": { + "type": "package", + "compile": { + "lib/net7.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net7.0/System.Composition.Runtime.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Composition.TypedParts/7.0.0": { + "type": "package", + "dependencies": { + "System.Composition.AttributedModel": "7.0.0", + "System.Composition.Hosting": "7.0.0", + "System.Composition.Runtime": "7.0.0" + }, + "compile": { + "lib/net7.0/_._": { + "related": ".xml" + } + }, + "runtime": { + "lib/net7.0/System.Composition.TypedParts.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.0.1", + "Microsoft.IdentityModel.Tokens": "8.0.1" + }, + "compile": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll": { + "related": ".xml" + } + } + }, + "System.IO.Hashing/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.IO.Hashing.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.IO.Hashing.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Yarp.ReverseProxy/2.2.0": { + "type": "package", + "dependencies": { + "System.IO.Hashing": "8.0.0" + }, + "compile": { + "lib/net8.0/Yarp.ReverseProxy.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Yarp.ReverseProxy.dll": { + "related": ".xml" + } + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + } + } + }, + "libraries": { + "Humanizer.Core/2.14.1": { + "sha512": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==", + "type": "package", + "path": "humanizer.core/2.14.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "humanizer.core.2.14.1.nupkg.sha512", + "humanizer.core.nuspec", + "lib/net6.0/Humanizer.dll", + "lib/net6.0/Humanizer.xml", + "lib/netstandard1.0/Humanizer.dll", + "lib/netstandard1.0/Humanizer.xml", + "lib/netstandard2.0/Humanizer.dll", + "lib/netstandard2.0/Humanizer.xml", + "logo.png" + ] + }, + "Microsoft.AspNetCore.Authentication.JwtBearer/10.0.0": { + "sha512": "0BgDfT1GoZnzjJOBwx5vFMK5JtqsTEas9pCEwd1/KKxNUAqFmreN60WeUoF+CsmSd9tOQuqWedvdBo/QqHuNTQ==", + "type": "package", + "path": "microsoft.aspnetcore.authentication.jwtbearer/10.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll", + "lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.xml", + "microsoft.aspnetcore.authentication.jwtbearer.10.0.0.nupkg.sha512", + "microsoft.aspnetcore.authentication.jwtbearer.nuspec" + ] + }, + "Microsoft.Bcl.AsyncInterfaces/7.0.0": { + "sha512": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==", + "type": "package", + "path": "microsoft.bcl.asyncinterfaces/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Bcl.AsyncInterfaces.targets", + "buildTransitive/net462/_._", + "lib/net462/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/net462/Microsoft.Bcl.AsyncInterfaces.xml", + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.xml", + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml", + "microsoft.bcl.asyncinterfaces.7.0.0.nupkg.sha512", + "microsoft.bcl.asyncinterfaces.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Build.Framework/17.8.3": { + "sha512": "NrQZJW8TlKVPx72yltGb8SVz3P5mNRk9fNiD/ao8jRSk48WqIIdCn99q4IjlVmPcruuQ+yLdjNQLL8Rb4c916g==", + "type": "package", + "path": "microsoft.build.framework/17.8.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "MSBuild-NuGet-Icon.png", + "README.md", + "lib/net472/Microsoft.Build.Framework.dll", + "lib/net472/Microsoft.Build.Framework.pdb", + "lib/net472/Microsoft.Build.Framework.xml", + "lib/net8.0/Microsoft.Build.Framework.dll", + "lib/net8.0/Microsoft.Build.Framework.pdb", + "lib/net8.0/Microsoft.Build.Framework.xml", + "microsoft.build.framework.17.8.3.nupkg.sha512", + "microsoft.build.framework.nuspec", + "notices/THIRDPARTYNOTICES.txt", + "ref/net472/Microsoft.Build.Framework.dll", + "ref/net472/Microsoft.Build.Framework.xml", + "ref/net8.0/Microsoft.Build.Framework.dll", + "ref/net8.0/Microsoft.Build.Framework.xml", + "ref/netstandard2.0/Microsoft.Build.Framework.dll", + "ref/netstandard2.0/Microsoft.Build.Framework.xml" + ] + }, + "Microsoft.Build.Locator/1.7.8": { + "sha512": "sPy10x527Ph16S2u0yGME4S6ohBKJ69WfjeGG/bvELYeZVmJdKjxgnlL8cJJJLGV/cZIRqSfB12UDB8ICakOog==", + "type": "package", + "path": "microsoft.build.locator/1.7.8", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "MSBuild-NuGet-Icon.png", + "build/Microsoft.Build.Locator.props", + "build/Microsoft.Build.Locator.targets", + "lib/net46/Microsoft.Build.Locator.dll", + "lib/net6.0/Microsoft.Build.Locator.dll", + "microsoft.build.locator.1.7.8.nupkg.sha512", + "microsoft.build.locator.nuspec" + ] + }, + "Microsoft.CodeAnalysis.Analyzers/3.3.4": { + "sha512": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==", + "type": "package", + "path": "microsoft.codeanalysis.analyzers/3.3.4", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.txt", + "analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll", + "analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll", + "analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll", + "analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll", + "analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll", + "buildTransitive/Microsoft.CodeAnalysis.Analyzers.props", + "buildTransitive/Microsoft.CodeAnalysis.Analyzers.targets", + "buildTransitive/config/analysislevel_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevel_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevel_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_all.globalconfig", + "buildTransitive/config/analysislevel_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_default.globalconfig", + "buildTransitive/config/analysislevel_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevel_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_none.globalconfig", + "buildTransitive/config/analysislevel_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevel_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_all.globalconfig", + "buildTransitive/config/analysislevel_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_default.globalconfig", + "buildTransitive/config/analysislevel_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_minimum.globalconfig", + "buildTransitive/config/analysislevel_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_none.globalconfig", + "buildTransitive/config/analysislevel_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_3_recommended.globalconfig", + "buildTransitive/config/analysislevel_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_4_3_all.globalconfig", + "buildTransitive/config/analysislevel_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_4_3_default.globalconfig", + "buildTransitive/config/analysislevel_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevel_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_4_3_none.globalconfig", + "buildTransitive/config/analysislevel_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevel_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevel_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevelcorrectness_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_all.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_default.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_none.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_all.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_default.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_minimum.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_none.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_recommended.globalconfig", + "buildTransitive/config/analysislevelcorrectness_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_all.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_default.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_none.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevelcorrectness_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevellibrary_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_all.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_default.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_none.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevellibrary_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_all.globalconfig", + "buildTransitive/config/analysislevellibrary_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_default.globalconfig", + "buildTransitive/config/analysislevellibrary_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_minimum.globalconfig", + "buildTransitive/config/analysislevellibrary_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_none.globalconfig", + "buildTransitive/config/analysislevellibrary_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_3_recommended.globalconfig", + "buildTransitive/config/analysislevellibrary_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_all.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_default.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_none.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevellibrary_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscompatibility_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysiscorrectness_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdesign_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisdocumentation_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysislocalization_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisperformance_4_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_2_9_8_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_3_recommended_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_all.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_all_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_default.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_default_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_minimum.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_minimum_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_none.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_none_warnaserror.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_recommended.globalconfig", + "buildTransitive/config/analysislevelmicrosoftcodeanalysisreleasetracking_4_3_recommended_warnaserror.globalconfig", + "documentation/Analyzer Configuration.md", + "documentation/Microsoft.CodeAnalysis.Analyzers.md", + "documentation/Microsoft.CodeAnalysis.Analyzers.sarif", + "editorconfig/AllRulesDefault/.editorconfig", + "editorconfig/AllRulesDisabled/.editorconfig", + "editorconfig/AllRulesEnabled/.editorconfig", + "editorconfig/CorrectnessRulesDefault/.editorconfig", + "editorconfig/CorrectnessRulesEnabled/.editorconfig", + "editorconfig/DataflowRulesDefault/.editorconfig", + "editorconfig/DataflowRulesEnabled/.editorconfig", + "editorconfig/LibraryRulesDefault/.editorconfig", + "editorconfig/LibraryRulesEnabled/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig", + "editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig", + "editorconfig/PortedFromFxCopRulesDefault/.editorconfig", + "editorconfig/PortedFromFxCopRulesEnabled/.editorconfig", + "microsoft.codeanalysis.analyzers.3.3.4.nupkg.sha512", + "microsoft.codeanalysis.analyzers.nuspec", + "rulesets/AllRulesDefault.ruleset", + "rulesets/AllRulesDisabled.ruleset", + "rulesets/AllRulesEnabled.ruleset", + "rulesets/CorrectnessRulesDefault.ruleset", + "rulesets/CorrectnessRulesEnabled.ruleset", + "rulesets/DataflowRulesDefault.ruleset", + "rulesets/DataflowRulesEnabled.ruleset", + "rulesets/LibraryRulesDefault.ruleset", + "rulesets/LibraryRulesEnabled.ruleset", + "rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset", + "rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset", + "rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset", + "rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset", + "rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset", + "rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset", + "rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset", + "rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset", + "rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset", + "rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset", + "rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset", + "rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset", + "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset", + "rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset", + "rulesets/PortedFromFxCopRulesDefault.ruleset", + "rulesets/PortedFromFxCopRulesEnabled.ruleset", + "tools/install.ps1", + "tools/uninstall.ps1" + ] + }, + "Microsoft.CodeAnalysis.Common/4.8.0": { + "sha512": "/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", + "type": "package", + "path": "microsoft.codeanalysis.common/4.8.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.rtf", + "lib/net6.0/Microsoft.CodeAnalysis.dll", + "lib/net6.0/Microsoft.CodeAnalysis.pdb", + "lib/net6.0/Microsoft.CodeAnalysis.xml", + "lib/net6.0/cs/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/de/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/es/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/fr/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/it/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/ja/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/ko/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/pl/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/pt-BR/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/ru/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/tr/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/Microsoft.CodeAnalysis.dll", + "lib/net7.0/Microsoft.CodeAnalysis.pdb", + "lib/net7.0/Microsoft.CodeAnalysis.xml", + "lib/net7.0/cs/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/de/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/es/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/fr/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/it/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/ja/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/ko/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/pl/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/ru/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/tr/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/Microsoft.CodeAnalysis.dll", + "lib/netstandard2.0/Microsoft.CodeAnalysis.pdb", + "lib/netstandard2.0/Microsoft.CodeAnalysis.xml", + "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll", + "microsoft.codeanalysis.common.4.8.0.nupkg.sha512", + "microsoft.codeanalysis.common.nuspec" + ] + }, + "Microsoft.CodeAnalysis.CSharp/4.8.0": { + "sha512": "+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", + "type": "package", + "path": "microsoft.codeanalysis.csharp/4.8.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.rtf", + "lib/net6.0/Microsoft.CodeAnalysis.CSharp.dll", + "lib/net6.0/Microsoft.CodeAnalysis.CSharp.pdb", + "lib/net6.0/Microsoft.CodeAnalysis.CSharp.xml", + "lib/net6.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.dll", + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.pdb", + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.xml", + "lib/net7.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll", + "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb", + "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml", + "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll", + "microsoft.codeanalysis.csharp.4.8.0.nupkg.sha512", + "microsoft.codeanalysis.csharp.nuspec" + ] + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces/4.8.0": { + "sha512": "3amm4tq4Lo8/BGvg9p3BJh3S9nKq2wqCXfS7138i69TUpo/bD+XvD0hNurpEBtcNZhi1FyutiomKJqVF39ugYA==", + "type": "package", + "path": "microsoft.codeanalysis.csharp.workspaces/4.8.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.rtf", + "lib/net6.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll", + "lib/net6.0/Microsoft.CodeAnalysis.CSharp.Workspaces.pdb", + "lib/net6.0/Microsoft.CodeAnalysis.CSharp.Workspaces.xml", + "lib/net6.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll", + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.Workspaces.pdb", + "lib/net7.0/Microsoft.CodeAnalysis.CSharp.Workspaces.xml", + "lib/net7.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll", + "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.Workspaces.pdb", + "lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.Workspaces.xml", + "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll", + "microsoft.codeanalysis.csharp.workspaces.4.8.0.nupkg.sha512", + "microsoft.codeanalysis.csharp.workspaces.nuspec" + ] + }, + "Microsoft.CodeAnalysis.Workspaces.Common/4.8.0": { + "sha512": "LXyV+MJKsKRu3FGJA3OmSk40OUIa/dQCFLOnm5X8MNcujx7hzGu8o+zjXlb/cy5xUdZK2UKYb9YaQ2E8m9QehQ==", + "type": "package", + "path": "microsoft.codeanalysis.workspaces.common/4.8.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.rtf", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.dll", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.pdb", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.xml", + "lib/net6.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.dll", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.pdb", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.xml", + "lib/net7.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/Microsoft.CodeAnalysis.Workspaces.dll", + "lib/netstandard2.0/Microsoft.CodeAnalysis.Workspaces.pdb", + "lib/netstandard2.0/Microsoft.CodeAnalysis.Workspaces.xml", + "lib/netstandard2.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll", + "microsoft.codeanalysis.workspaces.common.4.8.0.nupkg.sha512", + "microsoft.codeanalysis.workspaces.common.nuspec" + ] + }, + "Microsoft.CodeAnalysis.Workspaces.MSBuild/4.8.0": { + "sha512": "IEYreI82QZKklp54yPHxZNG9EKSK6nHEkeuf+0Asie9llgS1gp0V1hw7ODG+QyoB7MuAnNQHmeV1Per/ECpv6A==", + "type": "package", + "path": "microsoft.codeanalysis.workspaces.msbuild/4.8.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.rtf", + "lib/net472/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.exe", + "lib/net472/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.pdb", + "lib/net472/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.xml", + "lib/net472/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll", + "lib/net472/Microsoft.CodeAnalysis.Workspaces.MSBuild.pdb", + "lib/net472/Microsoft.CodeAnalysis.Workspaces.MSBuild.xml", + "lib/net472/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net472/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.pdb", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.runtimeconfig.json", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.xml", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.pdb", + "lib/net6.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.xml", + "lib/net6.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.pdb", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.runtimeconfig.json", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.xml", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.pdb", + "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.xml", + "lib/net7.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll", + "microsoft.codeanalysis.workspaces.msbuild.4.8.0.nupkg.sha512", + "microsoft.codeanalysis.workspaces.msbuild.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore/9.0.0": { + "sha512": "wpG+nfnfDAw87R3ovAsUmjr3MZ4tYXf6bFqEPVAIKE6IfPml3DS//iX0DBnf8kWn5ZHSO5oi1m4d/Jf+1LifJQ==", + "type": "package", + "path": "microsoft.entityframeworkcore/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props", + "lib/net8.0/Microsoft.EntityFrameworkCore.dll", + "lib/net8.0/Microsoft.EntityFrameworkCore.xml", + "microsoft.entityframeworkcore.9.0.0.nupkg.sha512", + "microsoft.entityframeworkcore.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore.Abstractions/9.0.0": { + "sha512": "fnmifFL8KaA4ZNLCVgfjCWhZUFxkrDInx5hR4qG7Q8IEaSiy/6VOSRFyx55oH7MV4y7wM3J3EE90nSpcVBI44Q==", + "type": "package", + "path": "microsoft.entityframeworkcore.abstractions/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll", + "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.xml", + "microsoft.entityframeworkcore.abstractions.9.0.0.nupkg.sha512", + "microsoft.entityframeworkcore.abstractions.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore.Analyzers/9.0.0": { + "sha512": "Qje+DzXJOKiXF72SL0XxNlDtTkvWWvmwknuZtFahY5hIQpRKO59qnGuERIQ3qlzuq5x4bAJ8WMbgU5DLhBgeOQ==", + "type": "package", + "path": "microsoft.entityframeworkcore.analyzers/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll", + "docs/PACKAGE.md", + "microsoft.entityframeworkcore.analyzers.9.0.0.nupkg.sha512", + "microsoft.entityframeworkcore.analyzers.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore.Design/9.0.0": { + "sha512": "Pqo8I+yHJ3VQrAoY0hiSncf+5P7gN/RkNilK5e+/K/yKh+yAWxdUAI6t0TG26a9VPlCa9FhyklzyFvRyj3YG9A==", + "type": "package", + "path": "microsoft.entityframeworkcore.design/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "build/net8.0/Microsoft.EntityFrameworkCore.Design.props", + "lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll", + "lib/net8.0/Microsoft.EntityFrameworkCore.Design.xml", + "microsoft.entityframeworkcore.design.9.0.0.nupkg.sha512", + "microsoft.entityframeworkcore.design.nuspec" + ] + }, + "Microsoft.EntityFrameworkCore.Relational/9.0.0": { + "sha512": "j+msw6fWgAE9M3Q/5B9Uhv7pdAdAQUvFPJAiBJmoy+OXvehVbfbCE8ftMAa51Uo2ZeiqVnHShhnv4Y4UJJmUzA==", + "type": "package", + "path": "microsoft.entityframeworkcore.relational/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll", + "lib/net8.0/Microsoft.EntityFrameworkCore.Relational.xml", + "microsoft.entityframeworkcore.relational.9.0.0.nupkg.sha512", + "microsoft.entityframeworkcore.relational.nuspec" + ] + }, + "Microsoft.Extensions.DependencyModel/9.0.0": { + "sha512": "saxr2XzwgDU77LaQfYFXmddEDRUKHF4DaGMZkNB3qjdVSZlax3//dGJagJkKrGMIPNZs2jVFXITyCCR6UHJNdA==", + "type": "package", + "path": "microsoft.extensions.dependencymodel/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.DependencyModel.targets", + "buildTransitive/net462/_._", + "buildTransitive/net8.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyModel.targets", + "lib/net462/Microsoft.Extensions.DependencyModel.dll", + "lib/net462/Microsoft.Extensions.DependencyModel.xml", + "lib/net8.0/Microsoft.Extensions.DependencyModel.dll", + "lib/net8.0/Microsoft.Extensions.DependencyModel.xml", + "lib/net9.0/Microsoft.Extensions.DependencyModel.dll", + "lib/net9.0/Microsoft.Extensions.DependencyModel.xml", + "lib/netstandard2.0/Microsoft.Extensions.DependencyModel.dll", + "lib/netstandard2.0/Microsoft.Extensions.DependencyModel.xml", + "microsoft.extensions.dependencymodel.9.0.0.nupkg.sha512", + "microsoft.extensions.dependencymodel.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.IdentityModel.Abstractions/8.0.1": { + "sha512": "OtlIWcyX01olfdevPKZdIPfBEvbcioDyBiE/Z2lHsopsMD7twcKtlN9kMevHmI5IIPhFpfwCIiR6qHQz1WHUIw==", + "type": "package", + "path": "microsoft.identitymodel.abstractions/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Abstractions.dll", + "lib/net462/Microsoft.IdentityModel.Abstractions.xml", + "lib/net472/Microsoft.IdentityModel.Abstractions.dll", + "lib/net472/Microsoft.IdentityModel.Abstractions.xml", + "lib/net6.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net6.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/net8.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net8.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/net9.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net9.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.xml", + "microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512", + "microsoft.identitymodel.abstractions.nuspec" + ] + }, + "Microsoft.IdentityModel.JsonWebTokens/8.0.1": { + "sha512": "s6++gF9x0rQApQzOBbSyp4jUaAlwm+DroKfL8gdOHxs83k8SJfUXhuc46rDB3rNXBQ1MVRxqKUrqFhO/M0E97g==", + "type": "package", + "path": "microsoft.identitymodel.jsonwebtokens/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net462/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net472/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net472/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net6.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net6.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512", + "microsoft.identitymodel.jsonwebtokens.nuspec" + ] + }, + "Microsoft.IdentityModel.Logging/8.0.1": { + "sha512": "UCPF2exZqBXe7v/6sGNiM6zCQOUXXQ9+v5VTb9gPB8ZSUPnX53BxlN78v2jsbIvK9Dq4GovQxo23x8JgWvm/Qg==", + "type": "package", + "path": "microsoft.identitymodel.logging/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Logging.dll", + "lib/net462/Microsoft.IdentityModel.Logging.xml", + "lib/net472/Microsoft.IdentityModel.Logging.dll", + "lib/net472/Microsoft.IdentityModel.Logging.xml", + "lib/net6.0/Microsoft.IdentityModel.Logging.dll", + "lib/net6.0/Microsoft.IdentityModel.Logging.xml", + "lib/net8.0/Microsoft.IdentityModel.Logging.dll", + "lib/net8.0/Microsoft.IdentityModel.Logging.xml", + "lib/net9.0/Microsoft.IdentityModel.Logging.dll", + "lib/net9.0/Microsoft.IdentityModel.Logging.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Logging.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Logging.xml", + "microsoft.identitymodel.logging.8.0.1.nupkg.sha512", + "microsoft.identitymodel.logging.nuspec" + ] + }, + "Microsoft.IdentityModel.Protocols/8.0.1": { + "sha512": "uA2vpKqU3I2mBBEaeJAWPTjT9v1TZrGWKdgK6G5qJd03CLx83kdiqO9cmiK8/n1erkHzFBwU/RphP83aAe3i3g==", + "type": "package", + "path": "microsoft.identitymodel.protocols/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Protocols.dll", + "lib/net462/Microsoft.IdentityModel.Protocols.xml", + "lib/net472/Microsoft.IdentityModel.Protocols.dll", + "lib/net472/Microsoft.IdentityModel.Protocols.xml", + "lib/net6.0/Microsoft.IdentityModel.Protocols.dll", + "lib/net6.0/Microsoft.IdentityModel.Protocols.xml", + "lib/net8.0/Microsoft.IdentityModel.Protocols.dll", + "lib/net8.0/Microsoft.IdentityModel.Protocols.xml", + "lib/net9.0/Microsoft.IdentityModel.Protocols.dll", + "lib/net9.0/Microsoft.IdentityModel.Protocols.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Protocols.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Protocols.xml", + "microsoft.identitymodel.protocols.8.0.1.nupkg.sha512", + "microsoft.identitymodel.protocols.nuspec" + ] + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": { + "sha512": "AQDbfpL+yzuuGhO/mQhKNsp44pm5Jv8/BI4KiFXR7beVGZoSH35zMV3PrmcfvSTsyI6qrcR898NzUauD6SRigg==", + "type": "package", + "path": "microsoft.identitymodel.protocols.openidconnect/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net462/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/net472/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net472/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/net6.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net6.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.xml", + "microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512", + "microsoft.identitymodel.protocols.openidconnect.nuspec" + ] + }, + "Microsoft.IdentityModel.Tokens/8.0.1": { + "sha512": "kDimB6Dkd3nkW2oZPDkMkVHfQt3IDqO5gL0oa8WVy3OP4uE8Ij+8TXnqg9TOd9ufjsY3IDiGz7pCUbnfL18tjg==", + "type": "package", + "path": "microsoft.identitymodel.tokens/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Microsoft.IdentityModel.Tokens.dll", + "lib/net462/Microsoft.IdentityModel.Tokens.xml", + "lib/net472/Microsoft.IdentityModel.Tokens.dll", + "lib/net472/Microsoft.IdentityModel.Tokens.xml", + "lib/net6.0/Microsoft.IdentityModel.Tokens.dll", + "lib/net6.0/Microsoft.IdentityModel.Tokens.xml", + "lib/net8.0/Microsoft.IdentityModel.Tokens.dll", + "lib/net8.0/Microsoft.IdentityModel.Tokens.xml", + "lib/net9.0/Microsoft.IdentityModel.Tokens.dll", + "lib/net9.0/Microsoft.IdentityModel.Tokens.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Tokens.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Tokens.xml", + "microsoft.identitymodel.tokens.8.0.1.nupkg.sha512", + "microsoft.identitymodel.tokens.nuspec" + ] + }, + "Mono.TextTemplating/3.0.0": { + "sha512": "YqueG52R/Xej4VVbKuRIodjiAhV0HR/XVbLbNrJhCZnzjnSjgMJ/dCdV0akQQxavX6hp/LC6rqLGLcXeQYU7XA==", + "type": "package", + "path": "mono.texttemplating/3.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt/LICENSE", + "buildTransitive/Mono.TextTemplating.targets", + "lib/net472/Mono.TextTemplating.dll", + "lib/net6.0/Mono.TextTemplating.dll", + "lib/netstandard2.0/Mono.TextTemplating.dll", + "mono.texttemplating.3.0.0.nupkg.sha512", + "mono.texttemplating.nuspec", + "readme.md" + ] + }, + "Npgsql/9.0.0": { + "sha512": "zu1nCRt0gWP/GR0reYgg0Bl5o8qyNV7mVAgzAbVLRiAd1CYXcf/9nrubPH0mt93u8iGTKmYqWaLVECEAcE6IfQ==", + "type": "package", + "path": "npgsql/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net6.0/Npgsql.dll", + "lib/net6.0/Npgsql.xml", + "lib/net8.0/Npgsql.dll", + "lib/net8.0/Npgsql.xml", + "npgsql.9.0.0.nupkg.sha512", + "npgsql.nuspec", + "postgresql.png" + ] + }, + "Npgsql.EntityFrameworkCore.PostgreSQL/9.0.0": { + "sha512": "ObngKFRLMBAeMqQzK7SC0Q6WZtWw0imPmEkVPo12yLVF3fioz2TN+w0mhNMJ5cVd/sLB2u+jei0bmA9sDMtkMw==", + "type": "package", + "path": "npgsql.entityframeworkcore.postgresql/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net8.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll", + "lib/net8.0/Npgsql.EntityFrameworkCore.PostgreSQL.xml", + "npgsql.entityframeworkcore.postgresql.9.0.0.nupkg.sha512", + "npgsql.entityframeworkcore.postgresql.nuspec", + "postgresql.png" + ] + }, + "Pipelines.Sockets.Unofficial/2.2.8": { + "sha512": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "type": "package", + "path": "pipelines.sockets.unofficial/2.2.8", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net461/Pipelines.Sockets.Unofficial.dll", + "lib/net461/Pipelines.Sockets.Unofficial.xml", + "lib/net472/Pipelines.Sockets.Unofficial.dll", + "lib/net472/Pipelines.Sockets.Unofficial.xml", + "lib/net5.0/Pipelines.Sockets.Unofficial.dll", + "lib/net5.0/Pipelines.Sockets.Unofficial.xml", + "lib/netcoreapp3.1/Pipelines.Sockets.Unofficial.dll", + "lib/netcoreapp3.1/Pipelines.Sockets.Unofficial.xml", + "lib/netstandard2.0/Pipelines.Sockets.Unofficial.dll", + "lib/netstandard2.0/Pipelines.Sockets.Unofficial.xml", + "lib/netstandard2.1/Pipelines.Sockets.Unofficial.dll", + "lib/netstandard2.1/Pipelines.Sockets.Unofficial.xml", + "pipelines.sockets.unofficial.2.2.8.nupkg.sha512", + "pipelines.sockets.unofficial.nuspec" + ] + }, + "Serilog/4.0.0": { + "sha512": "2jDkUrSh5EofOp7Lx5Zgy0EB+7hXjjxE2ktTb1WVQmU00lDACR2TdROGKU0K1pDTBSJBN1PqgYpgOZF8mL7NJw==", + "type": "package", + "path": "serilog/4.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/net462/Serilog.dll", + "lib/net462/Serilog.xml", + "lib/net471/Serilog.dll", + "lib/net471/Serilog.xml", + "lib/net6.0/Serilog.dll", + "lib/net6.0/Serilog.xml", + "lib/net8.0/Serilog.dll", + "lib/net8.0/Serilog.xml", + "lib/netstandard2.0/Serilog.dll", + "lib/netstandard2.0/Serilog.xml", + "serilog.4.0.0.nupkg.sha512", + "serilog.nuspec" + ] + }, + "Serilog.AspNetCore/8.0.0": { + "sha512": "FAjtKPZ4IzqFQBqZKPv6evcXK/F0ls7RoXI/62Pnx2igkDZ6nZ/jn/C/FxVATqQbEQvtqP+KViWYIe4NZIHa2w==", + "type": "package", + "path": "serilog.aspnetcore/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/net462/Serilog.AspNetCore.dll", + "lib/net462/Serilog.AspNetCore.xml", + "lib/net6.0/Serilog.AspNetCore.dll", + "lib/net6.0/Serilog.AspNetCore.xml", + "lib/net7.0/Serilog.AspNetCore.dll", + "lib/net7.0/Serilog.AspNetCore.xml", + "lib/net8.0/Serilog.AspNetCore.dll", + "lib/net8.0/Serilog.AspNetCore.xml", + "lib/netstandard2.0/Serilog.AspNetCore.dll", + "lib/netstandard2.0/Serilog.AspNetCore.xml", + "serilog.aspnetcore.8.0.0.nupkg.sha512", + "serilog.aspnetcore.nuspec" + ] + }, + "Serilog.Extensions.Hosting/8.0.0": { + "sha512": "db0OcbWeSCvYQkHWu6n0v40N4kKaTAXNjlM3BKvcbwvNzYphQFcBR+36eQ/7hMMwOkJvAyLC2a9/jNdUL5NjtQ==", + "type": "package", + "path": "serilog.extensions.hosting/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/net462/Serilog.Extensions.Hosting.dll", + "lib/net462/Serilog.Extensions.Hosting.xml", + "lib/net6.0/Serilog.Extensions.Hosting.dll", + "lib/net6.0/Serilog.Extensions.Hosting.xml", + "lib/net7.0/Serilog.Extensions.Hosting.dll", + "lib/net7.0/Serilog.Extensions.Hosting.xml", + "lib/net8.0/Serilog.Extensions.Hosting.dll", + "lib/net8.0/Serilog.Extensions.Hosting.xml", + "lib/netstandard2.0/Serilog.Extensions.Hosting.dll", + "lib/netstandard2.0/Serilog.Extensions.Hosting.xml", + "serilog.extensions.hosting.8.0.0.nupkg.sha512", + "serilog.extensions.hosting.nuspec" + ] + }, + "Serilog.Extensions.Logging/8.0.0": { + "sha512": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", + "type": "package", + "path": "serilog.extensions.logging/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net462/Serilog.Extensions.Logging.dll", + "lib/net462/Serilog.Extensions.Logging.xml", + "lib/net6.0/Serilog.Extensions.Logging.dll", + "lib/net6.0/Serilog.Extensions.Logging.xml", + "lib/net7.0/Serilog.Extensions.Logging.dll", + "lib/net7.0/Serilog.Extensions.Logging.xml", + "lib/net8.0/Serilog.Extensions.Logging.dll", + "lib/net8.0/Serilog.Extensions.Logging.xml", + "lib/netstandard2.0/Serilog.Extensions.Logging.dll", + "lib/netstandard2.0/Serilog.Extensions.Logging.xml", + "lib/netstandard2.1/Serilog.Extensions.Logging.dll", + "lib/netstandard2.1/Serilog.Extensions.Logging.xml", + "serilog-extension-nuget.png", + "serilog.extensions.logging.8.0.0.nupkg.sha512", + "serilog.extensions.logging.nuspec" + ] + }, + "Serilog.Formatting.Compact/2.0.0": { + "sha512": "ob6z3ikzFM3D1xalhFuBIK1IOWf+XrQq+H4KeH4VqBcPpNcmUgZlRQ2h3Q7wvthpdZBBoY86qZOI2LCXNaLlNA==", + "type": "package", + "path": "serilog.formatting.compact/2.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net462/Serilog.Formatting.Compact.dll", + "lib/net462/Serilog.Formatting.Compact.xml", + "lib/net471/Serilog.Formatting.Compact.dll", + "lib/net471/Serilog.Formatting.Compact.xml", + "lib/net6.0/Serilog.Formatting.Compact.dll", + "lib/net6.0/Serilog.Formatting.Compact.xml", + "lib/net7.0/Serilog.Formatting.Compact.dll", + "lib/net7.0/Serilog.Formatting.Compact.xml", + "lib/netstandard2.0/Serilog.Formatting.Compact.dll", + "lib/netstandard2.0/Serilog.Formatting.Compact.xml", + "lib/netstandard2.1/Serilog.Formatting.Compact.dll", + "lib/netstandard2.1/Serilog.Formatting.Compact.xml", + "serilog-extension-nuget.png", + "serilog.formatting.compact.2.0.0.nupkg.sha512", + "serilog.formatting.compact.nuspec" + ] + }, + "Serilog.Settings.Configuration/8.0.0": { + "sha512": "nR0iL5HwKj5v6ULo3/zpP8NMcq9E2pxYA6XKTSWCbugVs4YqPyvaqaKOY+OMpPivKp7zMEpax2UKHnDodbRB0Q==", + "type": "package", + "path": "serilog.settings.configuration/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/net462/Serilog.Settings.Configuration.dll", + "lib/net462/Serilog.Settings.Configuration.xml", + "lib/net6.0/Serilog.Settings.Configuration.dll", + "lib/net6.0/Serilog.Settings.Configuration.xml", + "lib/net7.0/Serilog.Settings.Configuration.dll", + "lib/net7.0/Serilog.Settings.Configuration.xml", + "lib/net8.0/Serilog.Settings.Configuration.dll", + "lib/net8.0/Serilog.Settings.Configuration.xml", + "lib/netstandard2.0/Serilog.Settings.Configuration.dll", + "lib/netstandard2.0/Serilog.Settings.Configuration.xml", + "serilog.settings.configuration.8.0.0.nupkg.sha512", + "serilog.settings.configuration.nuspec" + ] + }, + "Serilog.Sinks.Console/6.0.0": { + "sha512": "fQGWqVMClCP2yEyTXPIinSr5c+CBGUvBybPxjAGcf7ctDhadFhrQw03Mv8rJ07/wR5PDfFjewf2LimvXCDzpbA==", + "type": "package", + "path": "serilog.sinks.console/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/net462/Serilog.Sinks.Console.dll", + "lib/net462/Serilog.Sinks.Console.xml", + "lib/net471/Serilog.Sinks.Console.dll", + "lib/net471/Serilog.Sinks.Console.xml", + "lib/net6.0/Serilog.Sinks.Console.dll", + "lib/net6.0/Serilog.Sinks.Console.xml", + "lib/net8.0/Serilog.Sinks.Console.dll", + "lib/net8.0/Serilog.Sinks.Console.xml", + "lib/netstandard2.0/Serilog.Sinks.Console.dll", + "lib/netstandard2.0/Serilog.Sinks.Console.xml", + "serilog.sinks.console.6.0.0.nupkg.sha512", + "serilog.sinks.console.nuspec" + ] + }, + "Serilog.Sinks.Debug/2.0.0": { + "sha512": "Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==", + "type": "package", + "path": "serilog.sinks.debug/2.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net45/Serilog.Sinks.Debug.dll", + "lib/net45/Serilog.Sinks.Debug.xml", + "lib/net46/Serilog.Sinks.Debug.dll", + "lib/net46/Serilog.Sinks.Debug.xml", + "lib/netstandard1.0/Serilog.Sinks.Debug.dll", + "lib/netstandard1.0/Serilog.Sinks.Debug.xml", + "lib/netstandard2.0/Serilog.Sinks.Debug.dll", + "lib/netstandard2.0/Serilog.Sinks.Debug.xml", + "lib/netstandard2.1/Serilog.Sinks.Debug.dll", + "lib/netstandard2.1/Serilog.Sinks.Debug.xml", + "serilog.sinks.debug.2.0.0.nupkg.sha512", + "serilog.sinks.debug.nuspec" + ] + }, + "Serilog.Sinks.File/6.0.0": { + "sha512": "lxjg89Y8gJMmFxVkbZ+qDgjl+T4yC5F7WSLTvA+5q0R04tfKVLRL/EHpYoJ/MEQd2EeCKDuylBIVnAYMotmh2A==", + "type": "package", + "path": "serilog.sinks.file/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net462/Serilog.Sinks.File.dll", + "lib/net462/Serilog.Sinks.File.xml", + "lib/net471/Serilog.Sinks.File.dll", + "lib/net471/Serilog.Sinks.File.xml", + "lib/net6.0/Serilog.Sinks.File.dll", + "lib/net6.0/Serilog.Sinks.File.xml", + "lib/net8.0/Serilog.Sinks.File.dll", + "lib/net8.0/Serilog.Sinks.File.xml", + "lib/netstandard2.0/Serilog.Sinks.File.dll", + "lib/netstandard2.0/Serilog.Sinks.File.xml", + "serilog-sink-nuget.png", + "serilog.sinks.file.6.0.0.nupkg.sha512", + "serilog.sinks.file.nuspec" + ] + }, + "StackExchange.Redis/2.8.16": { + "sha512": "WaoulkOqOC9jHepca3JZKFTqndCWab5uYS7qCzmiQDlrTkFaDN7eLSlEfHycBxipRnQY9ppZM7QSsWAwUEGblw==", + "type": "package", + "path": "stackexchange.redis/2.8.16", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net461/StackExchange.Redis.dll", + "lib/net461/StackExchange.Redis.xml", + "lib/net472/StackExchange.Redis.dll", + "lib/net472/StackExchange.Redis.xml", + "lib/net6.0/StackExchange.Redis.dll", + "lib/net6.0/StackExchange.Redis.xml", + "lib/netcoreapp3.1/StackExchange.Redis.dll", + "lib/netcoreapp3.1/StackExchange.Redis.xml", + "lib/netstandard2.0/StackExchange.Redis.dll", + "lib/netstandard2.0/StackExchange.Redis.xml", + "stackexchange.redis.2.8.16.nupkg.sha512", + "stackexchange.redis.nuspec" + ] + }, + "System.CodeDom/6.0.0": { + "sha512": "CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA==", + "type": "package", + "path": "system.codedom/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.CodeDom.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.CodeDom.dll", + "lib/net461/System.CodeDom.xml", + "lib/net6.0/System.CodeDom.dll", + "lib/net6.0/System.CodeDom.xml", + "lib/netstandard2.0/System.CodeDom.dll", + "lib/netstandard2.0/System.CodeDom.xml", + "system.codedom.6.0.0.nupkg.sha512", + "system.codedom.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Composition/7.0.0": { + "sha512": "tRwgcAkDd85O8Aq6zHDANzQaq380cek9lbMg5Qma46u5BZXq/G+XvIYmu+UI+BIIZ9zssXLYrkTykEqxxvhcmg==", + "type": "package", + "path": "system.composition/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Composition.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Composition.targets", + "lib/net461/_._", + "lib/netcoreapp2.0/_._", + "lib/netstandard2.0/_._", + "system.composition.7.0.0.nupkg.sha512", + "system.composition.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Composition.AttributedModel/7.0.0": { + "sha512": "2QzClqjElKxgI1jK1Jztnq44/8DmSuTSGGahXqQ4TdEV0h9s2KikQZIgcEqVzR7OuWDFPGLHIprBJGQEPr8fAQ==", + "type": "package", + "path": "system.composition.attributedmodel/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Composition.AttributedModel.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Composition.AttributedModel.targets", + "lib/net462/System.Composition.AttributedModel.dll", + "lib/net462/System.Composition.AttributedModel.xml", + "lib/net6.0/System.Composition.AttributedModel.dll", + "lib/net6.0/System.Composition.AttributedModel.xml", + "lib/net7.0/System.Composition.AttributedModel.dll", + "lib/net7.0/System.Composition.AttributedModel.xml", + "lib/netstandard2.0/System.Composition.AttributedModel.dll", + "lib/netstandard2.0/System.Composition.AttributedModel.xml", + "system.composition.attributedmodel.7.0.0.nupkg.sha512", + "system.composition.attributedmodel.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Composition.Convention/7.0.0": { + "sha512": "IMhTlpCs4HmlD8B+J8/kWfwX7vrBBOs6xyjSTzBlYSs7W4OET4tlkR/Sg9NG8jkdJH9Mymq0qGdYS1VPqRTBnQ==", + "type": "package", + "path": "system.composition.convention/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Composition.Convention.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Composition.Convention.targets", + "lib/net462/System.Composition.Convention.dll", + "lib/net462/System.Composition.Convention.xml", + "lib/net6.0/System.Composition.Convention.dll", + "lib/net6.0/System.Composition.Convention.xml", + "lib/net7.0/System.Composition.Convention.dll", + "lib/net7.0/System.Composition.Convention.xml", + "lib/netstandard2.0/System.Composition.Convention.dll", + "lib/netstandard2.0/System.Composition.Convention.xml", + "system.composition.convention.7.0.0.nupkg.sha512", + "system.composition.convention.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Composition.Hosting/7.0.0": { + "sha512": "eB6gwN9S+54jCTBJ5bpwMOVerKeUfGGTYCzz3QgDr1P55Gg/Wb27ShfPIhLMjmZ3MoAKu8uUSv6fcCdYJTN7Bg==", + "type": "package", + "path": "system.composition.hosting/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Composition.Hosting.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Composition.Hosting.targets", + "lib/net462/System.Composition.Hosting.dll", + "lib/net462/System.Composition.Hosting.xml", + "lib/net6.0/System.Composition.Hosting.dll", + "lib/net6.0/System.Composition.Hosting.xml", + "lib/net7.0/System.Composition.Hosting.dll", + "lib/net7.0/System.Composition.Hosting.xml", + "lib/netstandard2.0/System.Composition.Hosting.dll", + "lib/netstandard2.0/System.Composition.Hosting.xml", + "system.composition.hosting.7.0.0.nupkg.sha512", + "system.composition.hosting.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Composition.Runtime/7.0.0": { + "sha512": "aZJ1Zr5Txe925rbo4742XifEyW0MIni1eiUebmcrP3HwLXZ3IbXUj4MFMUH/RmnJOAQiS401leg/2Sz1MkApDw==", + "type": "package", + "path": "system.composition.runtime/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Composition.Runtime.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Composition.Runtime.targets", + "lib/net462/System.Composition.Runtime.dll", + "lib/net462/System.Composition.Runtime.xml", + "lib/net6.0/System.Composition.Runtime.dll", + "lib/net6.0/System.Composition.Runtime.xml", + "lib/net7.0/System.Composition.Runtime.dll", + "lib/net7.0/System.Composition.Runtime.xml", + "lib/netstandard2.0/System.Composition.Runtime.dll", + "lib/netstandard2.0/System.Composition.Runtime.xml", + "system.composition.runtime.7.0.0.nupkg.sha512", + "system.composition.runtime.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Composition.TypedParts/7.0.0": { + "sha512": "ZK0KNPfbtxVceTwh+oHNGUOYV2WNOHReX2AXipuvkURC7s/jPwoWfsu3SnDBDgofqbiWr96geofdQ2erm/KTHg==", + "type": "package", + "path": "system.composition.typedparts/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Composition.TypedParts.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Composition.TypedParts.targets", + "lib/net462/System.Composition.TypedParts.dll", + "lib/net462/System.Composition.TypedParts.xml", + "lib/net6.0/System.Composition.TypedParts.dll", + "lib/net6.0/System.Composition.TypedParts.xml", + "lib/net7.0/System.Composition.TypedParts.dll", + "lib/net7.0/System.Composition.TypedParts.xml", + "lib/netstandard2.0/System.Composition.TypedParts.dll", + "lib/netstandard2.0/System.Composition.TypedParts.xml", + "system.composition.typedparts.7.0.0.nupkg.sha512", + "system.composition.typedparts.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.IdentityModel.Tokens.Jwt/8.0.1": { + "sha512": "GJw3bYkWpOgvN3tJo5X4lYUeIFA2HD293FPUhKmp7qxS+g5ywAb34Dnd3cDAFLkcMohy5XTpoaZ4uAHuw0uSPQ==", + "type": "package", + "path": "system.identitymodel.tokens.jwt/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/System.IdentityModel.Tokens.Jwt.dll", + "lib/net462/System.IdentityModel.Tokens.Jwt.xml", + "lib/net472/System.IdentityModel.Tokens.Jwt.dll", + "lib/net472/System.IdentityModel.Tokens.Jwt.xml", + "lib/net6.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/net6.0/System.IdentityModel.Tokens.Jwt.xml", + "lib/net8.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/net8.0/System.IdentityModel.Tokens.Jwt.xml", + "lib/net9.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/net9.0/System.IdentityModel.Tokens.Jwt.xml", + "lib/netstandard2.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/netstandard2.0/System.IdentityModel.Tokens.Jwt.xml", + "system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512", + "system.identitymodel.tokens.jwt.nuspec" + ] + }, + "System.IO.Hashing/8.0.0": { + "sha512": "ne1843evDugl0md7Fjzy6QjJrzsjh46ZKbhf8GwBXb5f/gw97J4bxMs0NQKifDuThh/f0bZ0e62NPl1jzTuRqA==", + "type": "package", + "path": "system.io.hashing/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.IO.Hashing.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.IO.Hashing.targets", + "lib/net462/System.IO.Hashing.dll", + "lib/net462/System.IO.Hashing.xml", + "lib/net6.0/System.IO.Hashing.dll", + "lib/net6.0/System.IO.Hashing.xml", + "lib/net7.0/System.IO.Hashing.dll", + "lib/net7.0/System.IO.Hashing.xml", + "lib/net8.0/System.IO.Hashing.dll", + "lib/net8.0/System.IO.Hashing.xml", + "lib/netstandard2.0/System.IO.Hashing.dll", + "lib/netstandard2.0/System.IO.Hashing.xml", + "system.io.hashing.8.0.0.nupkg.sha512", + "system.io.hashing.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Yarp.ReverseProxy/2.2.0": { + "sha512": "t16Z+OplJEElJy1Q6t12EwMGF2BeLw8IKjD1ema7ewbCRaMqeVIRPZo3MlxidnRFRK+tV6II8tKYX+7N5ZS98A==", + "type": "package", + "path": "yarp.reverseproxy/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/net6.0/Yarp.ReverseProxy.dll", + "lib/net6.0/Yarp.ReverseProxy.xml", + "lib/net7.0/Yarp.ReverseProxy.dll", + "lib/net7.0/Yarp.ReverseProxy.xml", + "lib/net8.0/Yarp.ReverseProxy.dll", + "lib/net8.0/Yarp.ReverseProxy.xml", + "yarp.reverseproxy.2.2.0.nupkg.sha512", + "yarp.reverseproxy.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + "net10.0": [ + "Microsoft.AspNetCore.Authentication.JwtBearer >= 10.0.0", + "Microsoft.EntityFrameworkCore.Design >= 9.0.0", + "Npgsql.EntityFrameworkCore.PostgreSQL >= 9.0.0", + "Serilog.AspNetCore >= 8.0.0", + "Serilog.Sinks.Console >= 6.0.0", + "Serilog.Sinks.File >= 6.0.0", + "StackExchange.Redis >= 2.8.16", + "Yarp.ReverseProxy >= 2.2.0" + ] + }, + "packageFolders": { + "/Users/movingsam/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/YarpGateway.csproj", + "projectName": "YarpGateway", + "projectPath": "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/YarpGateway.csproj", + "packagesPath": "/Users/movingsam/.nuget/packages/", + "outputPath": "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/movingsam/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "/usr/local/share/dotnet/library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.100" + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "dependencies": { + "Microsoft.AspNetCore.Authentication.JwtBearer": { + "target": "Package", + "version": "[10.0.0, )" + }, + "Microsoft.EntityFrameworkCore.Design": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[9.0.0, )" + }, + "Npgsql.EntityFrameworkCore.PostgreSQL": { + "target": "Package", + "version": "[9.0.0, )" + }, + "Serilog.AspNetCore": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Serilog.Sinks.Console": { + "target": "Package", + "version": "[6.0.0, )" + }, + "Serilog.Sinks.File": { + "target": "Package", + "version": "[6.0.0, )" + }, + "StackExchange.Redis": { + "target": "Package", + "version": "[2.8.16, )" + }, + "Yarp.ReverseProxy": { + "target": "Package", + "version": "[2.2.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.101/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.AspNetCore": "(,10.0.32767]", + "Microsoft.AspNetCore.Antiforgery": "(,10.0.32767]", + "Microsoft.AspNetCore.App": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.BearerToken": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Cookies": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Authentication.OAuth": "(,10.0.32767]", + "Microsoft.AspNetCore.Authorization": "(,10.0.32767]", + "Microsoft.AspNetCore.Authorization.Policy": "(,10.0.32767]", + "Microsoft.AspNetCore.Components": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Authorization": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Endpoints": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Forms": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Server": "(,10.0.32767]", + "Microsoft.AspNetCore.Components.Web": "(,10.0.32767]", + "Microsoft.AspNetCore.Connections.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.CookiePolicy": "(,10.0.32767]", + "Microsoft.AspNetCore.Cors": "(,10.0.32767]", + "Microsoft.AspNetCore.Cryptography.Internal": "(,10.0.32767]", + "Microsoft.AspNetCore.Cryptography.KeyDerivation": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.DataProtection.Extensions": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Diagnostics.HealthChecks": "(,10.0.32767]", + "Microsoft.AspNetCore.HostFiltering": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Hosting.Server.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Html.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Connections": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Connections.Common": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Extensions": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Features": "(,10.0.32767]", + "Microsoft.AspNetCore.Http.Results": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpLogging": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpOverrides": "(,10.0.32767]", + "Microsoft.AspNetCore.HttpsPolicy": "(,10.0.32767]", + "Microsoft.AspNetCore.Identity": "(,10.0.32767]", + "Microsoft.AspNetCore.Localization": "(,10.0.32767]", + "Microsoft.AspNetCore.Localization.Routing": "(,10.0.32767]", + "Microsoft.AspNetCore.Metadata": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.ApiExplorer": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Cors": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.DataAnnotations": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Formatters.Json": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Formatters.Xml": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Localization": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.Razor": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.RazorPages": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.TagHelpers": "(,10.0.32767]", + "Microsoft.AspNetCore.Mvc.ViewFeatures": "(,10.0.32767]", + "Microsoft.AspNetCore.OutputCaching": "(,10.0.32767]", + "Microsoft.AspNetCore.RateLimiting": "(,10.0.32767]", + "Microsoft.AspNetCore.Razor": "(,10.0.32767]", + "Microsoft.AspNetCore.Razor.Runtime": "(,10.0.32767]", + "Microsoft.AspNetCore.RequestDecompression": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCaching": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCaching.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.ResponseCompression": "(,10.0.32767]", + "Microsoft.AspNetCore.Rewrite": "(,10.0.32767]", + "Microsoft.AspNetCore.Routing": "(,10.0.32767]", + "Microsoft.AspNetCore.Routing.Abstractions": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.HttpSys": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.IIS": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.IISIntegration": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.Quic": "(,10.0.32767]", + "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "(,10.0.32767]", + "Microsoft.AspNetCore.Session": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Common": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Core": "(,10.0.32767]", + "Microsoft.AspNetCore.SignalR.Protocols.Json": "(,10.0.32767]", + "Microsoft.AspNetCore.StaticAssets": "(,10.0.32767]", + "Microsoft.AspNetCore.StaticFiles": "(,10.0.32767]", + "Microsoft.AspNetCore.WebSockets": "(,10.0.32767]", + "Microsoft.AspNetCore.WebUtilities": "(,10.0.32767]", + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.Extensions.Caching.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Caching.Memory": "(,10.0.32767]", + "Microsoft.Extensions.Configuration": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Binder": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.CommandLine": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.FileExtensions": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Ini": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Json": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.KeyPerFile": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.UserSecrets": "(,10.0.32767]", + "Microsoft.Extensions.Configuration.Xml": "(,10.0.32767]", + "Microsoft.Extensions.DependencyInjection": "(,10.0.32767]", + "Microsoft.Extensions.DependencyInjection.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.HealthChecks": "(,10.0.32767]", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Features": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Composite": "(,10.0.32767]", + "Microsoft.Extensions.FileProviders.Physical": "(,10.0.32767]", + "Microsoft.Extensions.FileSystemGlobbing": "(,10.0.32767]", + "Microsoft.Extensions.Hosting": "(,10.0.32767]", + "Microsoft.Extensions.Hosting.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Http": "(,10.0.32767]", + "Microsoft.Extensions.Identity.Core": "(,10.0.32767]", + "Microsoft.Extensions.Identity.Stores": "(,10.0.32767]", + "Microsoft.Extensions.Localization": "(,10.0.32767]", + "Microsoft.Extensions.Localization.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Logging": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Abstractions": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Configuration": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Console": "(,10.0.32767]", + "Microsoft.Extensions.Logging.Debug": "(,10.0.32767]", + "Microsoft.Extensions.Logging.EventLog": "(,10.0.32767]", + "Microsoft.Extensions.Logging.EventSource": "(,10.0.32767]", + "Microsoft.Extensions.Logging.TraceSource": "(,10.0.32767]", + "Microsoft.Extensions.ObjectPool": "(,10.0.32767]", + "Microsoft.Extensions.Options": "(,10.0.32767]", + "Microsoft.Extensions.Options.ConfigurationExtensions": "(,10.0.32767]", + "Microsoft.Extensions.Options.DataAnnotations": "(,10.0.32767]", + "Microsoft.Extensions.Primitives": "(,10.0.32767]", + "Microsoft.Extensions.Validation": "(,10.0.32767]", + "Microsoft.Extensions.WebEncoders": "(,10.0.32767]", + "Microsoft.JSInterop": "(,10.0.32767]", + "Microsoft.Net.Http.Headers": "(,10.0.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.EventLog": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Cbor": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Cryptography.Xml": "(,10.0.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.RateLimiting": "(,10.0.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } +} \ No newline at end of file diff --git a/src/YarpGateway/obj/project.nuget.cache b/src/YarpGateway/obj/project.nuget.cache new file mode 100644 index 0000000..911f7df --- /dev/null +++ b/src/YarpGateway/obj/project.nuget.cache @@ -0,0 +1,56 @@ +{ + "version": 2, + "dgSpecHash": "kDkdehON0hM=", + "success": true, + "projectFilePath": "/Users/movingsam/Fengling.Refactory.Buiding/src/YarpGateway/YarpGateway.csproj", + "expectedPackageFiles": [ + "/Users/movingsam/.nuget/packages/humanizer.core/2.14.1/humanizer.core.2.14.1.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.aspnetcore.authentication.jwtbearer/10.0.0/microsoft.aspnetcore.authentication.jwtbearer.10.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.bcl.asyncinterfaces/7.0.0/microsoft.bcl.asyncinterfaces.7.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.build.framework/17.8.3/microsoft.build.framework.17.8.3.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.build.locator/1.7.8/microsoft.build.locator.1.7.8.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.codeanalysis.analyzers/3.3.4/microsoft.codeanalysis.analyzers.3.3.4.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.codeanalysis.common/4.8.0/microsoft.codeanalysis.common.4.8.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.codeanalysis.csharp/4.8.0/microsoft.codeanalysis.csharp.4.8.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.codeanalysis.csharp.workspaces/4.8.0/microsoft.codeanalysis.csharp.workspaces.4.8.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.codeanalysis.workspaces.common/4.8.0/microsoft.codeanalysis.workspaces.common.4.8.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.codeanalysis.workspaces.msbuild/4.8.0/microsoft.codeanalysis.workspaces.msbuild.4.8.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.entityframeworkcore/9.0.0/microsoft.entityframeworkcore.9.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.entityframeworkcore.abstractions/9.0.0/microsoft.entityframeworkcore.abstractions.9.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.entityframeworkcore.analyzers/9.0.0/microsoft.entityframeworkcore.analyzers.9.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.entityframeworkcore.design/9.0.0/microsoft.entityframeworkcore.design.9.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.entityframeworkcore.relational/9.0.0/microsoft.entityframeworkcore.relational.9.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.extensions.dependencymodel/9.0.0/microsoft.extensions.dependencymodel.9.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.identitymodel.abstractions/8.0.1/microsoft.identitymodel.abstractions.8.0.1.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.identitymodel.jsonwebtokens/8.0.1/microsoft.identitymodel.jsonwebtokens.8.0.1.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.identitymodel.logging/8.0.1/microsoft.identitymodel.logging.8.0.1.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.identitymodel.protocols/8.0.1/microsoft.identitymodel.protocols.8.0.1.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.identitymodel.protocols.openidconnect/8.0.1/microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512", + "/Users/movingsam/.nuget/packages/microsoft.identitymodel.tokens/8.0.1/microsoft.identitymodel.tokens.8.0.1.nupkg.sha512", + "/Users/movingsam/.nuget/packages/mono.texttemplating/3.0.0/mono.texttemplating.3.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/npgsql/9.0.0/npgsql.9.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/npgsql.entityframeworkcore.postgresql/9.0.0/npgsql.entityframeworkcore.postgresql.9.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/pipelines.sockets.unofficial/2.2.8/pipelines.sockets.unofficial.2.2.8.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog/4.0.0/serilog.4.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog.aspnetcore/8.0.0/serilog.aspnetcore.8.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog.extensions.hosting/8.0.0/serilog.extensions.hosting.8.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog.extensions.logging/8.0.0/serilog.extensions.logging.8.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog.formatting.compact/2.0.0/serilog.formatting.compact.2.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog.settings.configuration/8.0.0/serilog.settings.configuration.8.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog.sinks.console/6.0.0/serilog.sinks.console.6.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog.sinks.debug/2.0.0/serilog.sinks.debug.2.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/serilog.sinks.file/6.0.0/serilog.sinks.file.6.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/stackexchange.redis/2.8.16/stackexchange.redis.2.8.16.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.codedom/6.0.0/system.codedom.6.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.composition/7.0.0/system.composition.7.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.composition.attributedmodel/7.0.0/system.composition.attributedmodel.7.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.composition.convention/7.0.0/system.composition.convention.7.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.composition.hosting/7.0.0/system.composition.hosting.7.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.composition.runtime/7.0.0/system.composition.runtime.7.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.composition.typedparts/7.0.0/system.composition.typedparts.7.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.identitymodel.tokens.jwt/8.0.1/system.identitymodel.tokens.jwt.8.0.1.nupkg.sha512", + "/Users/movingsam/.nuget/packages/system.io.hashing/8.0.0/system.io.hashing.8.0.0.nupkg.sha512", + "/Users/movingsam/.nuget/packages/yarp.reverseproxy/2.2.0/yarp.reverseproxy.2.2.0.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/src/YarpGateway/sql/init.sql b/src/YarpGateway/sql/init.sql new file mode 100644 index 0000000..050e4d4 --- /dev/null +++ b/src/YarpGateway/sql/init.sql @@ -0,0 +1,72 @@ +CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" ( + "MigrationId" character varying(150) NOT NULL, + "ProductVersion" character varying(32) NOT NULL, + CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY ("MigrationId") +); + +START TRANSACTION; +CREATE TABLE "ServiceInstances" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "ClusterId" character varying(100) NOT NULL, + "DestinationId" character varying(100) NOT NULL, + "Address" character varying(200) NOT NULL, + "Health" integer NOT NULL, + "Weight" integer NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_ServiceInstances" PRIMARY KEY ("Id") +); + +CREATE TABLE "Tenants" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "TenantCode" character varying(50) NOT NULL, + "TenantName" character varying(100) NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_Tenants" PRIMARY KEY ("Id"), + CONSTRAINT "AK_Tenants_TenantCode" UNIQUE ("TenantCode") +); + +CREATE TABLE "TenantRoutes" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "TenantCode" character varying(50) NOT NULL, + "ServiceName" character varying(100) NOT NULL, + "ClusterId" character varying(100) NOT NULL, + "PathPattern" character varying(200) NOT NULL, + "Priority" integer NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_TenantRoutes" PRIMARY KEY ("Id"), + CONSTRAINT "FK_TenantRoutes_Tenants_TenantCode" FOREIGN KEY ("TenantCode") REFERENCES "Tenants" ("TenantCode") ON DELETE RESTRICT +); + +CREATE UNIQUE INDEX "IX_ServiceInstances_ClusterId_DestinationId" ON "ServiceInstances" ("ClusterId", "DestinationId"); + +CREATE INDEX "IX_ServiceInstances_Health" ON "ServiceInstances" ("Health"); + +CREATE INDEX "IX_TenantRoutes_ClusterId" ON "TenantRoutes" ("ClusterId"); + +CREATE UNIQUE INDEX "IX_TenantRoutes_TenantCode_ServiceName" ON "TenantRoutes" ("TenantCode", "ServiceName"); + +CREATE UNIQUE INDEX "IX_Tenants_TenantCode" ON "Tenants" ("TenantCode"); + +INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") +VALUES ('20260201120312_InitialCreate', '9.0.0'); + +COMMIT; + diff --git a/src/YarpGateway/sql/update-isglobal.sql b/src/YarpGateway/sql/update-isglobal.sql new file mode 100644 index 0000000..ba25c48 --- /dev/null +++ b/src/YarpGateway/sql/update-isglobal.sql @@ -0,0 +1,174 @@ +CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" ( + "MigrationId" character varying(150) NOT NULL, + "ProductVersion" character varying(32) NOT NULL, + CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY ("MigrationId") +); + +START TRANSACTION; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + CREATE TABLE "ServiceInstances" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "ClusterId" character varying(100) NOT NULL, + "DestinationId" character varying(100) NOT NULL, + "Address" character varying(200) NOT NULL, + "Health" integer NOT NULL, + "Weight" integer NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_ServiceInstances" PRIMARY KEY ("Id") + ); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + CREATE TABLE "Tenants" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "TenantCode" character varying(50) NOT NULL, + "TenantName" character varying(100) NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_Tenants" PRIMARY KEY ("Id"), + CONSTRAINT "AK_Tenants_TenantCode" UNIQUE ("TenantCode") + ); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + CREATE TABLE "TenantRoutes" ( + "Id" bigint GENERATED BY DEFAULT AS IDENTITY, + "TenantCode" character varying(50) NOT NULL, + "ServiceName" character varying(100) NOT NULL, + "ClusterId" character varying(100) NOT NULL, + "PathPattern" character varying(200) NOT NULL, + "Priority" integer NOT NULL, + "Status" integer NOT NULL, + "CreatedBy" bigint, + "CreatedTime" timestamp with time zone NOT NULL, + "UpdatedBy" bigint, + "UpdatedTime" timestamp with time zone, + "IsDeleted" boolean NOT NULL, + "Version" integer NOT NULL, + CONSTRAINT "PK_TenantRoutes" PRIMARY KEY ("Id"), + CONSTRAINT "FK_TenantRoutes_Tenants_TenantCode" FOREIGN KEY ("TenantCode") REFERENCES "Tenants" ("TenantCode") ON DELETE RESTRICT + ); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + CREATE UNIQUE INDEX "IX_ServiceInstances_ClusterId_DestinationId" ON "ServiceInstances" ("ClusterId", "DestinationId"); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + CREATE INDEX "IX_ServiceInstances_Health" ON "ServiceInstances" ("Health"); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + CREATE INDEX "IX_TenantRoutes_ClusterId" ON "TenantRoutes" ("ClusterId"); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + CREATE UNIQUE INDEX "IX_TenantRoutes_TenantCode_ServiceName" ON "TenantRoutes" ("TenantCode", "ServiceName"); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + CREATE UNIQUE INDEX "IX_Tenants_TenantCode" ON "Tenants" ("TenantCode"); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201120312_InitialCreate') THEN + INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") + VALUES ('20260201120312_InitialCreate', '9.0.0'); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201133826_AddIsGlobalToTenantRoute') THEN + ALTER TABLE "TenantRoutes" DROP CONSTRAINT "FK_TenantRoutes_Tenants_TenantCode"; + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201133826_AddIsGlobalToTenantRoute') THEN + ALTER TABLE "Tenants" DROP CONSTRAINT "AK_Tenants_TenantCode"; + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201133826_AddIsGlobalToTenantRoute') THEN + DROP INDEX "IX_TenantRoutes_TenantCode_ServiceName"; + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201133826_AddIsGlobalToTenantRoute') THEN + ALTER TABLE "TenantRoutes" ADD "IsGlobal" boolean NOT NULL DEFAULT FALSE; + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201133826_AddIsGlobalToTenantRoute') THEN + CREATE INDEX "IX_TenantRoutes_ServiceName" ON "TenantRoutes" ("ServiceName"); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201133826_AddIsGlobalToTenantRoute') THEN + CREATE INDEX "IX_TenantRoutes_ServiceName_IsGlobal_Status" ON "TenantRoutes" ("ServiceName", "IsGlobal", "Status"); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201133826_AddIsGlobalToTenantRoute') THEN + CREATE INDEX "IX_TenantRoutes_TenantCode" ON "TenantRoutes" ("TenantCode"); + END IF; +END $EF$; + +DO $EF$ +BEGIN + IF NOT EXISTS(SELECT 1 FROM "__EFMigrationsHistory" WHERE "MigrationId" = '20260201133826_AddIsGlobalToTenantRoute') THEN + INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") + VALUES ('20260201133826_AddIsGlobalToTenantRoute', '9.0.0'); + END IF; +END $EF$; +COMMIT; +