package events import ( "encoding/json" "time" "tyapi-server/internal/domains/user/entities" "github.com/google/uuid" ) // UserEventType 用户事件类型 type UserEventType string const ( UserRegisteredEvent UserEventType = "user.registered" UserLoggedInEvent UserEventType = "user.logged_in" UserPasswordChangedEvent UserEventType = "user.password_changed" ) // BaseUserEvent 用户事件基础结构 type BaseUserEvent 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 *BaseUserEvent) GetID() string { return e.ID } func (e *BaseUserEvent) GetType() string { return e.Type } func (e *BaseUserEvent) GetVersion() string { return e.Version } func (e *BaseUserEvent) GetTimestamp() time.Time { return e.Timestamp } func (e *BaseUserEvent) GetPayload() interface{} { return e.Payload } func (e *BaseUserEvent) GetMetadata() map[string]interface{} { return e.Metadata } func (e *BaseUserEvent) GetSource() string { return e.Source } func (e *BaseUserEvent) GetAggregateID() string { return e.AggregateID } func (e *BaseUserEvent) GetAggregateType() string { return e.AggregateType } func (e *BaseUserEvent) GetDomainVersion() string { return e.DomainVersion } func (e *BaseUserEvent) GetCausationID() string { return e.CausationID } func (e *BaseUserEvent) GetCorrelationID() string { return e.CorrelationID } func (e *BaseUserEvent) Marshal() ([]byte, error) { return json.Marshal(e) } func (e *BaseUserEvent) Unmarshal(data []byte) error { return json.Unmarshal(data, e) } // UserRegistered 用户注册事件 type UserRegistered struct { *BaseUserEvent User *entities.User `json:"user"` } func NewUserRegisteredEvent(user *entities.User, correlationID string) *UserRegistered { return &UserRegistered{ BaseUserEvent: &BaseUserEvent{ ID: uuid.New().String(), Type: string(UserRegisteredEvent), Version: "1.0", Timestamp: time.Now(), Source: "user-service", AggregateID: user.ID, AggregateType: "User", DomainVersion: "1.0", CorrelationID: correlationID, Metadata: map[string]interface{}{ "user_id": user.ID, "phone": user.Phone, }, }, User: user, } } func (e *UserRegistered) GetPayload() interface{} { return e.User } // UserLoggedIn 用户登录事件 type UserLoggedIn struct { *BaseUserEvent UserID string `json:"user_id"` Phone string `json:"phone"` IPAddress string `json:"ip_address"` UserAgent string `json:"user_agent"` } func NewUserLoggedInEvent(userID, phone, ipAddress, userAgent, correlationID string) *UserLoggedIn { return &UserLoggedIn{ BaseUserEvent: &BaseUserEvent{ ID: uuid.New().String(), Type: string(UserLoggedInEvent), Version: "1.0", Timestamp: time.Now(), Source: "user-service", AggregateID: userID, AggregateType: "User", DomainVersion: "1.0", CorrelationID: correlationID, Metadata: map[string]interface{}{ "user_id": userID, "phone": phone, "ip_address": ipAddress, "user_agent": userAgent, }, }, UserID: userID, Phone: phone, IPAddress: ipAddress, UserAgent: userAgent, } } // UserPasswordChanged 用户密码修改事件 type UserPasswordChanged struct { *BaseUserEvent UserID string `json:"user_id"` Phone string `json:"phone"` } func NewUserPasswordChangedEvent(userID, phone, correlationID string) *UserPasswordChanged { return &UserPasswordChanged{ BaseUserEvent: &BaseUserEvent{ ID: uuid.New().String(), Type: string(UserPasswordChangedEvent), Version: "1.0", Timestamp: time.Now(), Source: "user-service", AggregateID: userID, AggregateType: "User", DomainVersion: "1.0", CorrelationID: correlationID, Metadata: map[string]interface{}{ "user_id": userID, "phone": phone, }, }, UserID: userID, Phone: phone, } }