暂存
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m32s

This commit is contained in:
2026-08-06 09:35:00 +08:00
parent 8659dfc658
commit 88cc5e96ec
75 changed files with 6520 additions and 513 deletions

View File

@@ -23,38 +23,46 @@ func (s *Service) SetAccessAudit(writer *audit.Writer) {
s.auditWriter = writer
}
// WriteCardStateAudit 将卡观测事务中的人工状态操作写入统一 Audit Event。
// WriteCardStateAudit 将卡观测事务中的人工、回调或 Worker 状态变化写入统一 Audit Event。
func (s *Service) WriteCardStateAudit(ctx context.Context, tx *gorm.DB, input cardapp.StateAudit) error {
extraResources := make([]audit.ResourceInput, 0, 1)
if input.IntegrationID != "" {
extraResources = append(extraResources, callbackIntegrationAuditResource(ctx, input.IntegrationID))
extraResources = append(extraResources, cardStateIntegrationAuditResource(ctx, input.IntegrationID))
}
return s.appendCardLifecycleAudit(ctx, tx, input.ActionCode, input.Summary, constants.AuditResultSuccess,
input.Card, input.BeforeData, input.AfterData, nil, extraResources...)
}
// WriteCardStateFailure 使用独立短事务记录已解析卡资源后的回调失败。
// WriteCardStateFailure 使用独立短事务记录已解析卡资源后的回调或 Worker 失败。
func (s *Service) WriteCardStateFailure(ctx context.Context, input cardapp.StateAudit, businessErr error) {
extraResources := make([]audit.ResourceInput, 0, 1)
if input.IntegrationID != "" {
extraResources = append(extraResources, callbackIntegrationAuditResource(ctx, input.IntegrationID))
extraResources = append(extraResources, cardStateIntegrationAuditResource(ctx, input.IntegrationID))
}
s.recordCardLifecycleFailure(ctx, input.ActionCode, input.Summary, constants.AuditResultFailed,
input.Card, input.Card.ID, businessErr, extraResources...)
}
func callbackIntegrationAuditResource(ctx context.Context, integrationID string) audit.ResourceInput {
func cardStateIntegrationAuditResource(ctx context.Context, integrationID string) audit.ResourceInput {
linkage := auditcontext.From(ctx)
correlationID := linkage.CorrelationID
if correlationID == "" {
correlationID = linkage.RequestID
}
direction := constants.IntegrationDirectionInbound
role := constants.AuditResourceRoleCallbackIntegration
provider := linkage.ActorID
if linkage.Source == constants.AuditSourceWorker {
direction = constants.IntegrationDirectionOutbound
role = constants.AuditResourceRoleWorkerIntegration
provider = constants.IntegrationProviderGateway
}
return audit.ResourceInput{
Type: constants.AuditResourceIntegrationLog, Key: integrationID, DisplayName: integrationID,
Relation: constants.AuditResourceRelationReference, Role: constants.AuditResourceRoleCallbackIntegration,
Relation: constants.AuditResourceRelationReference, Role: role,
IdentitySnapshot: map[string]any{
"integration_id": integrationID, "provider": linkage.ActorID,
"direction": constants.IntegrationDirectionInbound, "correlation_id": correlationID,
"integration_id": integrationID, "provider": provider,
"direction": direction, "correlation_id": correlationID,
},
SubjectVisibility: constants.AuditSubjectInternalOnly,
}