cisd/docs/plans/2026-03-02-cisd-init-schema-dto-plan.md
2026-03-05 11:08:57 +08:00

4.6 KiB

CISD Init Request Schema DTO Implementation Plan

For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

Goal: Replace placeholder init preview request with a production-ready CISD initialization request DTO and server-side rule validation based on preset product type.

Architecture: Keep the current single-module Spring Boot structure. Introduce strong-typed nested DTOs for init request payload, centralize preset version/product-type sourcing in configuration properties (as current phase baseline), and enforce cross-field conditional rules in InitService before preview generation. Surface preset product type in /api/v1/device/info for frontend auto-rendering.

Tech Stack: JDK 17, Spring Boot 3.5, Jakarta Bean Validation, JUnit 5.


Task 1: Add failing tests for init request rule validation

Files:

  • Create: src/test/java/com/cisd/tms/modules/init/service/InitServiceTest.java

Step 1: Write failing tests

  • Add tests for:
    • missing preset product type should reject init preview.
    • enterprise + TLQ should require tlqLicenseFileId.
    • direct + RABBITMQ_CFMQ should require cfmqConfigFileId, cfgZipFileId, and sign server fields.
    • valid enterprise request should pass and generate summary.

Step 2: Run targeted tests to verify red

  • Run: mvn -q -Dtest=InitServiceTest test
  • Expected: FAIL because InitService still uses old DTO and has no rule engine.

Task 2: Implement strong-typed init request DTO model

Files:

  • Modify: src/main/java/com/cisd/tms/modules/init/dto/InitPreviewRequest.java

Step 1: Replace old placeholder fields

  • Remove version/nodeCount.
  • Add nested models for:
    • basic institution fields
    • deploy mode + nodes
    • mq settings
    • licenses
    • sign server

Step 2: Add validation annotations

  • Add required constraints for common fields (orgCodeType, orgCode, orgNameCn, deployMode, node01Ip, mqType, channelUsername, channelPassword, receiverLicenseFileId).

Step 3: Keep model minimal and serializable

  • Use static inner classes with getters/setters only.

Task 3: Add preset product type source and expose in device info

Files:

  • Create: src/main/java/com/cisd/tms/common/config/properties/CisdPresetProperties.java
  • Modify: src/main/java/com/cisd/tms/modules/device/dto/DeviceInfoResponse.java
  • Modify: src/main/java/com/cisd/tms/modules/device/service/DeviceService.java
  • Modify: src/main/resources/application.yml

Step 1: Add configuration properties bean

  • Prefix: tms.cisd.preset
  • Fields: productType, version, source.

Step 2: Extend device status response

  • Add presetProductType, presetVersion, presetSource.

Step 3: Populate response from preset config

  • Inject CisdPresetProperties into DeviceService and map values.

Task 4: Implement rule validation in InitService

Files:

  • Modify: src/main/java/com/cisd/tms/modules/init/service/InitService.java
  • Modify: src/main/java/com/cisd/tms/modules/init/dto/InitPreviewResponse.java
  • Modify: src/main/java/com/cisd/tms/modules/init/dto/InitPlanTemplateResponse.java

Step 1: Add preset guard

  • If preset product type missing/invalid, throw BizException and block preview/template.

Step 2: Add product-type conditional validation

  • Enterprise/Indirect:
    • deploy mode only SINGLE/DUAL
    • mq type only RABBITMQ/TLQ
    • TLQ requires tlqLicenseFileId
    • DUAL requires node02Ip
  • Direct:
    • deploy mode SINGLE/DUAL/QUAD
    • mq type RABBITMQ_TLQ/RABBITMQ_CFMQ
    • cfgZipFileId required
    • sign server fields required
    • TLQ requires tlqLicenseFileId
    • CFMQ requires cfmqConfigFileId
    • DUAL/QUAD require node02Ip; QUAD require node03Ip/node04Ip

Step 3: Produce meaningful preview summary

  • Set response fields: resolved product type, step count estimate, and concise summary.

Task 5: Add developer-facing validation spec doc

Files:

  • Create: docs/plans/2026-03-02-cisd-init-request-schema-spec.md

Step 1: Document payload JSON schema shape

  • Include common object structure and conditional fields by product type.

Step 2: Document prefilled vs user-input fields

  • Explicitly list DB creds and RabbitMQ admin creds as prefilled-only.

Task 6: Verify and stabilize

Files:

  • N/A

Step 1: Run targeted tests

  • mvn -q -Dtest=InitServiceTest test

Step 2: Run compile check

  • mvn -q -DskipTests compile

Step 3: Run full test suite if stable

  • mvn -q test

Step 4: Record results in response

  • Include changed files, command outputs summary, remaining risks.