- Add /api/rules CRUD, nested actions, and expr validation - Add rules migration, models, and RuleEngine/Expression services - Run ORDER_CREATED rules after order create (non-blocking) and refresh tests - Update OpenAPI tags/schemas/paths and bundled docs
317 lines
7.3 KiB
YAML
317 lines
7.3 KiB
YAML
/api/rules:
|
|
get:
|
|
tags: [Rules]
|
|
summary: List rules
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: EventCode
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by event code
|
|
- name: Active
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
enum: [0, 1]
|
|
description: Filter by active flag
|
|
- name: ScopeType
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum: [GLOBAL, TESTSITE]
|
|
description: Filter by scope type
|
|
- name: TestSiteID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by TestSiteID (for TESTSITE scope)
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Search by rule name
|
|
responses:
|
|
'200':
|
|
description: List of rules
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '../components/schemas/rules.yaml#/RuleDef'
|
|
|
|
post:
|
|
tags: [Rules]
|
|
summary: Create rule
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
Name:
|
|
type: string
|
|
Description:
|
|
type: string
|
|
EventCode:
|
|
type: string
|
|
example: ORDER_CREATED
|
|
ScopeType:
|
|
type: string
|
|
enum: [GLOBAL, TESTSITE]
|
|
TestSiteID:
|
|
type: integer
|
|
nullable: true
|
|
ConditionExpr:
|
|
type: string
|
|
nullable: true
|
|
Priority:
|
|
type: integer
|
|
Active:
|
|
type: integer
|
|
enum: [0, 1]
|
|
actions:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
Seq:
|
|
type: integer
|
|
ActionType:
|
|
type: string
|
|
ActionParams:
|
|
oneOf:
|
|
- type: string
|
|
- type: object
|
|
required: [Name, EventCode, ScopeType]
|
|
responses:
|
|
'201':
|
|
description: Rule created
|
|
|
|
/api/rules/{id}:
|
|
get:
|
|
tags: [Rules]
|
|
summary: Get rule (with actions)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Rule details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '../components/schemas/rules.yaml#/RuleWithActions'
|
|
'404':
|
|
description: Rule not found
|
|
|
|
patch:
|
|
tags: [Rules]
|
|
summary: Update rule
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
Name: { type: string }
|
|
Description: { type: string }
|
|
EventCode: { type: string }
|
|
ScopeType: { type: string, enum: [GLOBAL, TESTSITE] }
|
|
TestSiteID: { type: integer, nullable: true }
|
|
ConditionExpr: { type: string, nullable: true }
|
|
Priority: { type: integer }
|
|
Active: { type: integer, enum: [0, 1] }
|
|
responses:
|
|
'200':
|
|
description: Rule updated
|
|
'404':
|
|
description: Rule not found
|
|
|
|
delete:
|
|
tags: [Rules]
|
|
summary: Soft delete rule
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Rule deleted
|
|
'404':
|
|
description: Rule not found
|
|
|
|
/api/rules/validate:
|
|
post:
|
|
tags: [Rules]
|
|
summary: Validate/evaluate an expression
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
expr:
|
|
type: string
|
|
context:
|
|
type: object
|
|
additionalProperties: true
|
|
required: [expr]
|
|
responses:
|
|
'200':
|
|
description: Validation result
|
|
|
|
/api/rules/{id}/actions:
|
|
get:
|
|
tags: [Rules]
|
|
summary: List actions for a rule
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Actions list
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '../components/schemas/rules.yaml#/RuleAction'
|
|
|
|
post:
|
|
tags: [Rules]
|
|
summary: Create action for a rule
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
Seq:
|
|
type: integer
|
|
ActionType:
|
|
type: string
|
|
ActionParams:
|
|
oneOf:
|
|
- type: string
|
|
- type: object
|
|
required: [ActionType]
|
|
responses:
|
|
'201':
|
|
description: Action created
|
|
|
|
/api/rules/{id}/actions/{actionId}:
|
|
patch:
|
|
tags: [Rules]
|
|
summary: Update action
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: actionId
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
Seq: { type: integer }
|
|
ActionType: { type: string }
|
|
ActionParams:
|
|
oneOf:
|
|
- type: string
|
|
- type: object
|
|
responses:
|
|
'200':
|
|
description: Action updated
|
|
|
|
delete:
|
|
tags: [Rules]
|
|
summary: Soft delete action
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: actionId
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Action deleted
|