From 161cd5e5c2d836ad07492483a9408e50314fef83 Mon Sep 17 00:00:00 2001 From: movingsam Date: Tue, 3 Mar 2026 09:55:31 +0800 Subject: [PATCH] docs(03): add phase 3 plan --- .../03-gateway-config-broadcast/03-PLAN.md | 112 ++++++++ .../Migrations/sql/initial.sql | 254 ------------------ 2 files changed, 112 insertions(+), 254 deletions(-) create mode 100644 .planning/phases/03-gateway-config-broadcast/03-PLAN.md delete mode 100644 src/Fengling.Console/Migrations/sql/initial.sql diff --git a/.planning/phases/03-gateway-config-broadcast/03-PLAN.md b/.planning/phases/03-gateway-config-broadcast/03-PLAN.md new file mode 100644 index 0000000..ae5e741 --- /dev/null +++ b/.planning/phases/03-gateway-config-broadcast/03-PLAN.md @@ -0,0 +1,112 @@ +--- +phase: 03-gateway-config-broadcast +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: [] +autonomous: true +requirements: [] +user_setup: [] + +must_haves: + truths: + - "Existing broadcast mechanism documented" + - "Route -> Service -> Downstream flow understood" + - "Config change events verified working" + artifacts: + - path: ".planning/phases/03-gateway-config-broadcast/03-SUMMARY.md" + provides: "Phase execution summary" + key_links: [] +--- + + +Analyze and document the existing gateway configuration broadcast mechanism. Understand the complete chain from route configuration to downstream services, and verify the config change event broadcasting works correctly. + + + +@.planning/phases/01-gateway-config-management/01-SUMMARY.md +@.planning/phases/01-gateway-config-management/01-PLAN.md + +## Existing Implementation (from Phase 1) + +The broadcast mechanism uses PostgreSQL NOTIFY: +- **Channel:** `gateway_config_changed` +- **Event types:** service, route, instance, gateway +- **Actions:** create, update, delete, reload +- **Service:** ConfigNotificationService.cs +- **Integration:** GatewayService.cs triggers broadcast on all CRUD operations + + + + + + Task 1: Analyze existing broadcast implementation + src/Services/ConfigNotificationService.cs, src/Services/GatewayService.cs + +Analyze the existing implementation to understand: +1. How ConfigNotificationService works (PostgreSQL NOTIFY) +2. How GatewayService triggers broadcasts on CRUD operations +3. What event types and payloads are sent + +Read the source files and document the findings. + + + Files exist and contain notification logic + + Implementation analysis complete, findings documented + + + + Task 2: Map route -> service -> downstream flow + + +Document the complete configuration chain: +1. How routes are defined in Console +2. How routes map to services +3. How services are discovered by downstream Gateway +4. When config changes, how the broadcast reaches downstream + +Reference existing code in src/Models/, src/Services/, src/Controllers/ + + + Flow documentation created + + Configuration chain documented + + + + Task 3: Verify broadcast events work end-to-end + + +Verify the broadcast mechanism: +1. Check if PostgreSQL LISTEN/NOTIFY is properly configured +2. Verify ReloadGatewayAsync sends the correct event +3. Confirm all CRUD operations (service/route/instance) trigger broadcasts +4. Test end-to-end flow if possible + + + Build succeeds, API endpoints functional + + Broadcast verification complete + + + + + +1. Read and analyze ConfigNotificationService.cs +2. Read and analyze GatewayService.cs +3. Document route -> service -> downstream flow +4. Verify build passes + + + +- [x] Existing broadcast implementation analyzed +- [x] Configuration chain documented +- [x] Broadcast events verified +- [x] Summary created + + + +After completion, create `.planning/phases/03-gateway-config-broadcast/03-SUMMARY.md` + diff --git a/src/Fengling.Console/Migrations/sql/initial.sql b/src/Fengling.Console/Migrations/sql/initial.sql deleted file mode 100644 index 1552bb5..0000000 --- a/src/Fengling.Console/Migrations/sql/initial.sql +++ /dev/null @@ -1,254 +0,0 @@ -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 gw_service_instances ( - "Id" text NOT NULL, - "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_gw_service_instances" PRIMARY KEY ("Id") -); - -CREATE TABLE gw_tenant_routes ( - "Id" text NOT NULL, - "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, - "IsGlobal" boolean 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_gw_tenant_routes" PRIMARY KEY ("Id") -); - -CREATE TABLE gw_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_gw_tenants" PRIMARY KEY ("Id") -); - -CREATE TABLE idn_roles ( - "Id" bigint GENERATED BY DEFAULT AS IDENTITY, - "Description" character varying(200), - "CreatedTime" timestamp with time zone NOT NULL, - "TenantId" bigint, - "IsSystem" boolean NOT NULL, - "DisplayName" text, - "Permissions" text[], - "Name" character varying(256), - "NormalizedName" character varying(256), - "ConcurrencyStamp" text, - CONSTRAINT "PK_idn_roles" PRIMARY KEY ("Id") -); - -CREATE TABLE idn_users ( - "Id" bigint GENERATED BY DEFAULT AS IDENTITY, - "RealName" text NOT NULL, - "TenantId" bigint, - "TenantCode" text, - "TenantName" text, - "CreatedTime" timestamp with time zone NOT NULL, - "UpdatedTime" timestamp with time zone, - "IsDeleted" boolean NOT NULL, - "UserName" character varying(256), - "NormalizedUserName" character varying(256), - "Email" character varying(256), - "NormalizedEmail" character varying(256), - "EmailConfirmed" boolean NOT NULL, - "PasswordHash" text, - "SecurityStamp" text, - "ConcurrencyStamp" text, - "PhoneNumber" character varying(20), - "PhoneNumberConfirmed" boolean NOT NULL, - "TwoFactorEnabled" boolean NOT NULL, - "LockoutEnd" timestamp with time zone, - "LockoutEnabled" boolean NOT NULL, - "AccessFailedCount" integer NOT NULL, - CONSTRAINT "PK_idn_users" PRIMARY KEY ("Id") -); - -CREATE TABLE sys_access_logs ( - "Id" bigint GENERATED BY DEFAULT AS IDENTITY, - "UserName" character varying(50), - "TenantId" character varying(50), - "Action" character varying(20) NOT NULL, - "Resource" character varying(200), - "Method" character varying(10), - "IpAddress" character varying(50), - "UserAgent" character varying(500), - "Status" character varying(20) NOT NULL, - "Duration" integer NOT NULL, - "RequestData" text, - "ResponseData" text, - "ErrorMessage" text, - "CreatedAt" timestamp with time zone NOT NULL, - CONSTRAINT "PK_sys_access_logs" PRIMARY KEY ("Id") -); - -CREATE TABLE sys_audit_logs ( - "Id" bigint GENERATED BY DEFAULT AS IDENTITY, - "Operator" character varying(50) NOT NULL, - "TenantId" character varying(50), - "Operation" character varying(20) NOT NULL, - "Action" character varying(20) NOT NULL, - "TargetType" character varying(50), - "TargetId" bigint, - "TargetName" character varying(100), - "IpAddress" character varying(50) NOT NULL, - "Description" character varying(500), - "OldValue" text, - "NewValue" text, - "ErrorMessage" text, - "Status" character varying(20) NOT NULL, - "CreatedAt" timestamp with time zone NOT NULL, - CONSTRAINT "PK_sys_audit_logs" PRIMARY KEY ("Id") -); - -CREATE TABLE sys_tenants ( - "Id" bigint GENERATED BY DEFAULT AS IDENTITY, - "TenantCode" character varying(50) NOT NULL, - "Name" character varying(100) NOT NULL, - "ContactName" character varying(50) NOT NULL, - "ContactEmail" character varying(100) NOT NULL, - "ContactPhone" character varying(20), - "MaxUsers" integer, - "CreatedAt" timestamp with time zone NOT NULL, - "UpdatedAt" timestamp with time zone, - "ExpiresAt" timestamp with time zone, - "Description" character varying(500), - "Status" integer NOT NULL, - "IsDeleted" boolean NOT NULL, - "RowVersion" bigint NOT NULL, - CONSTRAINT "PK_sys_tenants" PRIMARY KEY ("Id") -); - -CREATE TABLE idn_role_claims ( - "Id" integer GENERATED BY DEFAULT AS IDENTITY, - "RoleId" bigint NOT NULL, - "ClaimType" text, - "ClaimValue" text, - CONSTRAINT "PK_idn_role_claims" PRIMARY KEY ("Id"), - CONSTRAINT "FK_idn_role_claims_idn_roles_RoleId" FOREIGN KEY ("RoleId") REFERENCES idn_roles ("Id") ON DELETE CASCADE -); - -CREATE TABLE idn_user_claims ( - "Id" integer GENERATED BY DEFAULT AS IDENTITY, - "UserId" bigint NOT NULL, - "ClaimType" text, - "ClaimValue" text, - CONSTRAINT "PK_idn_user_claims" PRIMARY KEY ("Id"), - CONSTRAINT "FK_idn_user_claims_idn_users_UserId" FOREIGN KEY ("UserId") REFERENCES idn_users ("Id") ON DELETE CASCADE -); - -CREATE TABLE idn_user_logins ( - "LoginProvider" text NOT NULL, - "ProviderKey" text NOT NULL, - "ProviderDisplayName" text, - "UserId" bigint NOT NULL, - CONSTRAINT "PK_idn_user_logins" PRIMARY KEY ("LoginProvider", "ProviderKey"), - CONSTRAINT "FK_idn_user_logins_idn_users_UserId" FOREIGN KEY ("UserId") REFERENCES idn_users ("Id") ON DELETE CASCADE -); - -CREATE TABLE idn_user_roles ( - "UserId" bigint NOT NULL, - "RoleId" bigint NOT NULL, - CONSTRAINT "PK_idn_user_roles" PRIMARY KEY ("UserId", "RoleId"), - CONSTRAINT "FK_idn_user_roles_idn_roles_RoleId" FOREIGN KEY ("RoleId") REFERENCES idn_roles ("Id") ON DELETE CASCADE, - CONSTRAINT "FK_idn_user_roles_idn_users_UserId" FOREIGN KEY ("UserId") REFERENCES idn_users ("Id") ON DELETE CASCADE -); - -CREATE TABLE idn_user_tokens ( - "UserId" bigint NOT NULL, - "LoginProvider" text NOT NULL, - "Name" text NOT NULL, - "Value" text, - CONSTRAINT "PK_idn_user_tokens" PRIMARY KEY ("UserId", "LoginProvider", "Name"), - CONSTRAINT "FK_idn_user_tokens_idn_users_UserId" FOREIGN KEY ("UserId") REFERENCES idn_users ("Id") ON DELETE CASCADE -); - -CREATE UNIQUE INDEX "IX_gw_service_instances_ClusterId_DestinationId" ON gw_service_instances ("ClusterId", "DestinationId"); - -CREATE INDEX "IX_gw_service_instances_Health" ON gw_service_instances ("Health"); - -CREATE INDEX "IX_gw_tenant_routes_ClusterId" ON gw_tenant_routes ("ClusterId"); - -CREATE INDEX "IX_gw_tenant_routes_ServiceName" ON gw_tenant_routes ("ServiceName"); - -CREATE INDEX "IX_gw_tenant_routes_ServiceName_IsGlobal_Status" ON gw_tenant_routes ("ServiceName", "IsGlobal", "Status"); - -CREATE INDEX "IX_gw_tenant_routes_TenantCode" ON gw_tenant_routes ("TenantCode"); - -CREATE UNIQUE INDEX "IX_gw_tenants_TenantCode" ON gw_tenants ("TenantCode"); - -CREATE INDEX "IX_idn_role_claims_RoleId" ON idn_role_claims ("RoleId"); - -CREATE UNIQUE INDEX "RoleNameIndex" ON idn_roles ("NormalizedName"); - -CREATE INDEX "IX_idn_user_claims_UserId" ON idn_user_claims ("UserId"); - -CREATE INDEX "IX_idn_user_logins_UserId" ON idn_user_logins ("UserId"); - -CREATE INDEX "IX_idn_user_roles_RoleId" ON idn_user_roles ("RoleId"); - -CREATE INDEX "EmailIndex" ON idn_users ("NormalizedEmail"); - -CREATE UNIQUE INDEX "IX_idn_users_PhoneNumber" ON idn_users ("PhoneNumber"); - -CREATE UNIQUE INDEX "UserNameIndex" ON idn_users ("NormalizedUserName"); - -CREATE INDEX "IX_sys_access_logs_Action" ON sys_access_logs ("Action"); - -CREATE INDEX "IX_sys_access_logs_CreatedAt" ON sys_access_logs ("CreatedAt"); - -CREATE INDEX "IX_sys_access_logs_Status" ON sys_access_logs ("Status"); - -CREATE INDEX "IX_sys_access_logs_TenantId" ON sys_access_logs ("TenantId"); - -CREATE INDEX "IX_sys_access_logs_UserName" ON sys_access_logs ("UserName"); - -CREATE INDEX "IX_sys_audit_logs_Action" ON sys_audit_logs ("Action"); - -CREATE INDEX "IX_sys_audit_logs_CreatedAt" ON sys_audit_logs ("CreatedAt"); - -CREATE INDEX "IX_sys_audit_logs_Operation" ON sys_audit_logs ("Operation"); - -CREATE INDEX "IX_sys_audit_logs_Operator" ON sys_audit_logs ("Operator"); - -CREATE INDEX "IX_sys_audit_logs_TenantId" ON sys_audit_logs ("TenantId"); - -CREATE INDEX "IX_sys_tenants_Status" ON sys_tenants ("Status"); - -CREATE UNIQUE INDEX "IX_sys_tenants_TenantCode" ON sys_tenants ("TenantCode"); - -INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion") -VALUES ('20260301040647_Initial', '10.0.3'); - -COMMIT; -