new
This commit is contained in:
572
internal/domains/statistics/events/statistics_events.go
Normal file
572
internal/domains/statistics/events/statistics_events.go
Normal file
@@ -0,0 +1,572 @@
|
||||
package events
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
// StatisticsEventType 统计事件类型
|
||||
type StatisticsEventType string
|
||||
|
||||
const (
|
||||
// 指标相关事件
|
||||
MetricCreatedEventType StatisticsEventType = "statistics.metric.created"
|
||||
MetricUpdatedEventType StatisticsEventType = "statistics.metric.updated"
|
||||
MetricAggregatedEventType StatisticsEventType = "statistics.metric.aggregated"
|
||||
|
||||
// 报告相关事件
|
||||
ReportCreatedEventType StatisticsEventType = "statistics.report.created"
|
||||
ReportGenerationStartedEventType StatisticsEventType = "statistics.report.generation_started"
|
||||
ReportCompletedEventType StatisticsEventType = "statistics.report.completed"
|
||||
ReportFailedEventType StatisticsEventType = "statistics.report.failed"
|
||||
ReportExpiredEventType StatisticsEventType = "statistics.report.expired"
|
||||
|
||||
// 仪表板相关事件
|
||||
DashboardCreatedEventType StatisticsEventType = "statistics.dashboard.created"
|
||||
DashboardUpdatedEventType StatisticsEventType = "statistics.dashboard.updated"
|
||||
DashboardActivatedEventType StatisticsEventType = "statistics.dashboard.activated"
|
||||
DashboardDeactivatedEventType StatisticsEventType = "statistics.dashboard.deactivated"
|
||||
)
|
||||
|
||||
// BaseStatisticsEvent 统计事件基础结构
|
||||
type BaseStatisticsEvent struct {
|
||||
ID string `json:"id"`
|
||||
Type string `json:"type"`
|
||||
Version string `json:"version"`
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
Source string `json:"source"`
|
||||
AggregateID string `json:"aggregate_id"`
|
||||
AggregateType string `json:"aggregate_type"`
|
||||
Metadata map[string]interface{} `json:"metadata"`
|
||||
Payload interface{} `json:"payload"`
|
||||
|
||||
// DDD特有字段
|
||||
DomainVersion string `json:"domain_version"`
|
||||
CausationID string `json:"causation_id"`
|
||||
CorrelationID string `json:"correlation_id"`
|
||||
}
|
||||
|
||||
// 实现 Event 接口
|
||||
func (e *BaseStatisticsEvent) GetID() string {
|
||||
return e.ID
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetType() string {
|
||||
return e.Type
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetVersion() string {
|
||||
return e.Version
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetTimestamp() time.Time {
|
||||
return e.Timestamp
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetPayload() interface{} {
|
||||
return e.Payload
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetMetadata() map[string]interface{} {
|
||||
return e.Metadata
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetSource() string {
|
||||
return e.Source
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetAggregateID() string {
|
||||
return e.AggregateID
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetAggregateType() string {
|
||||
return e.AggregateType
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetDomainVersion() string {
|
||||
return e.DomainVersion
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetCausationID() string {
|
||||
return e.CausationID
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) GetCorrelationID() string {
|
||||
return e.CorrelationID
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) Marshal() ([]byte, error) {
|
||||
return json.Marshal(e)
|
||||
}
|
||||
|
||||
func (e *BaseStatisticsEvent) Unmarshal(data []byte) error {
|
||||
return json.Unmarshal(data, e)
|
||||
}
|
||||
|
||||
// ================ 指标相关事件 ================
|
||||
|
||||
// MetricCreatedEvent 指标创建事件
|
||||
type MetricCreatedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
MetricID string `json:"metric_id"`
|
||||
MetricType string `json:"metric_type"`
|
||||
MetricName string `json:"metric_name"`
|
||||
Value float64 `json:"value"`
|
||||
Dimension string `json:"dimension"`
|
||||
Date time.Time `json:"date"`
|
||||
}
|
||||
|
||||
func NewMetricCreatedEvent(metricID, metricType, metricName, dimension string, value float64, date time.Time, correlationID string) *MetricCreatedEvent {
|
||||
return &MetricCreatedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(MetricCreatedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: metricID,
|
||||
AggregateType: "StatisticsMetric",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"metric_id": metricID,
|
||||
"metric_type": metricType,
|
||||
"metric_name": metricName,
|
||||
"dimension": dimension,
|
||||
},
|
||||
},
|
||||
MetricID: metricID,
|
||||
MetricType: metricType,
|
||||
MetricName: metricName,
|
||||
Value: value,
|
||||
Dimension: dimension,
|
||||
Date: date,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *MetricCreatedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"metric_id": e.MetricID,
|
||||
"metric_type": e.MetricType,
|
||||
"metric_name": e.MetricName,
|
||||
"value": e.Value,
|
||||
"dimension": e.Dimension,
|
||||
"date": e.Date,
|
||||
}
|
||||
}
|
||||
|
||||
// MetricUpdatedEvent 指标更新事件
|
||||
type MetricUpdatedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
MetricID string `json:"metric_id"`
|
||||
OldValue float64 `json:"old_value"`
|
||||
NewValue float64 `json:"new_value"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
func NewMetricUpdatedEvent(metricID string, oldValue, newValue float64, correlationID string) *MetricUpdatedEvent {
|
||||
return &MetricUpdatedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(MetricUpdatedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: metricID,
|
||||
AggregateType: "StatisticsMetric",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"metric_id": metricID,
|
||||
},
|
||||
},
|
||||
MetricID: metricID,
|
||||
OldValue: oldValue,
|
||||
NewValue: newValue,
|
||||
UpdatedAt: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func (e *MetricUpdatedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"metric_id": e.MetricID,
|
||||
"old_value": e.OldValue,
|
||||
"new_value": e.NewValue,
|
||||
"updated_at": e.UpdatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
// MetricAggregatedEvent 指标聚合事件
|
||||
type MetricAggregatedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
MetricType string `json:"metric_type"`
|
||||
Dimension string `json:"dimension"`
|
||||
AggregatedAt time.Time `json:"aggregated_at"`
|
||||
RecordCount int `json:"record_count"`
|
||||
TotalValue float64 `json:"total_value"`
|
||||
}
|
||||
|
||||
func NewMetricAggregatedEvent(metricType, dimension string, recordCount int, totalValue float64, correlationID string) *MetricAggregatedEvent {
|
||||
return &MetricAggregatedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(MetricAggregatedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: uuid.New().String(),
|
||||
AggregateType: "StatisticsMetric",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"metric_type": metricType,
|
||||
"dimension": dimension,
|
||||
},
|
||||
},
|
||||
MetricType: metricType,
|
||||
Dimension: dimension,
|
||||
AggregatedAt: time.Now(),
|
||||
RecordCount: recordCount,
|
||||
TotalValue: totalValue,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *MetricAggregatedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"metric_type": e.MetricType,
|
||||
"dimension": e.Dimension,
|
||||
"aggregated_at": e.AggregatedAt,
|
||||
"record_count": e.RecordCount,
|
||||
"total_value": e.TotalValue,
|
||||
}
|
||||
}
|
||||
|
||||
// ================ 报告相关事件 ================
|
||||
|
||||
// ReportCreatedEvent 报告创建事件
|
||||
type ReportCreatedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
ReportID string `json:"report_id"`
|
||||
ReportType string `json:"report_type"`
|
||||
Title string `json:"title"`
|
||||
Period string `json:"period"`
|
||||
UserRole string `json:"user_role"`
|
||||
}
|
||||
|
||||
func NewReportCreatedEvent(reportID, reportType, title, period, userRole, correlationID string) *ReportCreatedEvent {
|
||||
return &ReportCreatedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(ReportCreatedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: reportID,
|
||||
AggregateType: "StatisticsReport",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"report_id": reportID,
|
||||
"report_type": reportType,
|
||||
"user_role": userRole,
|
||||
},
|
||||
},
|
||||
ReportID: reportID,
|
||||
ReportType: reportType,
|
||||
Title: title,
|
||||
Period: period,
|
||||
UserRole: userRole,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *ReportCreatedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"report_id": e.ReportID,
|
||||
"report_type": e.ReportType,
|
||||
"title": e.Title,
|
||||
"period": e.Period,
|
||||
"user_role": e.UserRole,
|
||||
}
|
||||
}
|
||||
|
||||
// ReportGenerationStartedEvent 报告生成开始事件
|
||||
type ReportGenerationStartedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
ReportID string `json:"report_id"`
|
||||
GeneratedBy string `json:"generated_by"`
|
||||
StartedAt time.Time `json:"started_at"`
|
||||
}
|
||||
|
||||
func NewReportGenerationStartedEvent(reportID, generatedBy, correlationID string) *ReportGenerationStartedEvent {
|
||||
return &ReportGenerationStartedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(ReportGenerationStartedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: reportID,
|
||||
AggregateType: "StatisticsReport",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"report_id": reportID,
|
||||
"generated_by": generatedBy,
|
||||
},
|
||||
},
|
||||
ReportID: reportID,
|
||||
GeneratedBy: generatedBy,
|
||||
StartedAt: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func (e *ReportGenerationStartedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"report_id": e.ReportID,
|
||||
"generated_by": e.GeneratedBy,
|
||||
"started_at": e.StartedAt,
|
||||
}
|
||||
}
|
||||
|
||||
// ReportCompletedEvent 报告完成事件
|
||||
type ReportCompletedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
ReportID string `json:"report_id"`
|
||||
CompletedAt time.Time `json:"completed_at"`
|
||||
ContentSize int `json:"content_size"`
|
||||
}
|
||||
|
||||
func NewReportCompletedEvent(reportID string, contentSize int, correlationID string) *ReportCompletedEvent {
|
||||
return &ReportCompletedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(ReportCompletedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: reportID,
|
||||
AggregateType: "StatisticsReport",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"report_id": reportID,
|
||||
},
|
||||
},
|
||||
ReportID: reportID,
|
||||
CompletedAt: time.Now(),
|
||||
ContentSize: contentSize,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *ReportCompletedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"report_id": e.ReportID,
|
||||
"completed_at": e.CompletedAt,
|
||||
"content_size": e.ContentSize,
|
||||
}
|
||||
}
|
||||
|
||||
// ReportFailedEvent 报告失败事件
|
||||
type ReportFailedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
ReportID string `json:"report_id"`
|
||||
Reason string `json:"reason"`
|
||||
FailedAt time.Time `json:"failed_at"`
|
||||
}
|
||||
|
||||
func NewReportFailedEvent(reportID, reason, correlationID string) *ReportFailedEvent {
|
||||
return &ReportFailedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(ReportFailedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: reportID,
|
||||
AggregateType: "StatisticsReport",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"report_id": reportID,
|
||||
},
|
||||
},
|
||||
ReportID: reportID,
|
||||
Reason: reason,
|
||||
FailedAt: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func (e *ReportFailedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"report_id": e.ReportID,
|
||||
"reason": e.Reason,
|
||||
"failed_at": e.FailedAt,
|
||||
}
|
||||
}
|
||||
|
||||
// ================ 仪表板相关事件 ================
|
||||
|
||||
// DashboardCreatedEvent 仪表板创建事件
|
||||
type DashboardCreatedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
DashboardID string `json:"dashboard_id"`
|
||||
Name string `json:"name"`
|
||||
UserRole string `json:"user_role"`
|
||||
CreatedBy string `json:"created_by"`
|
||||
}
|
||||
|
||||
func NewDashboardCreatedEvent(dashboardID, name, userRole, createdBy, correlationID string) *DashboardCreatedEvent {
|
||||
return &DashboardCreatedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(DashboardCreatedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: dashboardID,
|
||||
AggregateType: "StatisticsDashboard",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"dashboard_id": dashboardID,
|
||||
"user_role": userRole,
|
||||
"created_by": createdBy,
|
||||
},
|
||||
},
|
||||
DashboardID: dashboardID,
|
||||
Name: name,
|
||||
UserRole: userRole,
|
||||
CreatedBy: createdBy,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *DashboardCreatedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"dashboard_id": e.DashboardID,
|
||||
"name": e.Name,
|
||||
"user_role": e.UserRole,
|
||||
"created_by": e.CreatedBy,
|
||||
}
|
||||
}
|
||||
|
||||
// DashboardUpdatedEvent 仪表板更新事件
|
||||
type DashboardUpdatedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
DashboardID string `json:"dashboard_id"`
|
||||
UpdatedBy string `json:"updated_by"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
Changes map[string]interface{} `json:"changes"`
|
||||
}
|
||||
|
||||
func NewDashboardUpdatedEvent(dashboardID, updatedBy string, changes map[string]interface{}, correlationID string) *DashboardUpdatedEvent {
|
||||
return &DashboardUpdatedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(DashboardUpdatedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: dashboardID,
|
||||
AggregateType: "StatisticsDashboard",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"dashboard_id": dashboardID,
|
||||
"updated_by": updatedBy,
|
||||
},
|
||||
},
|
||||
DashboardID: dashboardID,
|
||||
UpdatedBy: updatedBy,
|
||||
UpdatedAt: time.Now(),
|
||||
Changes: changes,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *DashboardUpdatedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"dashboard_id": e.DashboardID,
|
||||
"updated_by": e.UpdatedBy,
|
||||
"updated_at": e.UpdatedAt,
|
||||
"changes": e.Changes,
|
||||
}
|
||||
}
|
||||
|
||||
// DashboardActivatedEvent 仪表板激活事件
|
||||
type DashboardActivatedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
DashboardID string `json:"dashboard_id"`
|
||||
ActivatedBy string `json:"activated_by"`
|
||||
ActivatedAt time.Time `json:"activated_at"`
|
||||
}
|
||||
|
||||
func NewDashboardActivatedEvent(dashboardID, activatedBy, correlationID string) *DashboardActivatedEvent {
|
||||
return &DashboardActivatedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(DashboardActivatedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: dashboardID,
|
||||
AggregateType: "StatisticsDashboard",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"dashboard_id": dashboardID,
|
||||
"activated_by": activatedBy,
|
||||
},
|
||||
},
|
||||
DashboardID: dashboardID,
|
||||
ActivatedBy: activatedBy,
|
||||
ActivatedAt: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func (e *DashboardActivatedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"dashboard_id": e.DashboardID,
|
||||
"activated_by": e.ActivatedBy,
|
||||
"activated_at": e.ActivatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
// DashboardDeactivatedEvent 仪表板停用事件
|
||||
type DashboardDeactivatedEvent struct {
|
||||
*BaseStatisticsEvent
|
||||
DashboardID string `json:"dashboard_id"`
|
||||
DeactivatedBy string `json:"deactivated_by"`
|
||||
DeactivatedAt time.Time `json:"deactivated_at"`
|
||||
}
|
||||
|
||||
func NewDashboardDeactivatedEvent(dashboardID, deactivatedBy, correlationID string) *DashboardDeactivatedEvent {
|
||||
return &DashboardDeactivatedEvent{
|
||||
BaseStatisticsEvent: &BaseStatisticsEvent{
|
||||
ID: uuid.New().String(),
|
||||
Type: string(DashboardDeactivatedEventType),
|
||||
Version: "1.0",
|
||||
Timestamp: time.Now(),
|
||||
Source: "statistics-service",
|
||||
AggregateID: dashboardID,
|
||||
AggregateType: "StatisticsDashboard",
|
||||
DomainVersion: "1.0",
|
||||
CorrelationID: correlationID,
|
||||
Metadata: map[string]interface{}{
|
||||
"dashboard_id": dashboardID,
|
||||
"deactivated_by": deactivatedBy,
|
||||
},
|
||||
},
|
||||
DashboardID: dashboardID,
|
||||
DeactivatedBy: deactivatedBy,
|
||||
DeactivatedAt: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func (e *DashboardDeactivatedEvent) GetPayload() interface{} {
|
||||
return map[string]interface{}{
|
||||
"dashboard_id": e.DashboardID,
|
||||
"deactivated_by": e.DeactivatedBy,
|
||||
"deactivated_at": e.DeactivatedAt,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user