300 lines
7.7 KiB
Go
300 lines
7.7 KiB
Go
package events
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"tyapi-server/internal/domains/user/entities"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// UserEventType 用户事件类型
|
|
type UserEventType string
|
|
|
|
const (
|
|
UserCreatedEvent UserEventType = "user.created"
|
|
UserUpdatedEvent UserEventType = "user.updated"
|
|
UserDeletedEvent UserEventType = "user.deleted"
|
|
UserRestoredEvent UserEventType = "user.restored"
|
|
UserLoggedInEvent UserEventType = "user.logged_in"
|
|
UserLoggedOutEvent UserEventType = "user.logged_out"
|
|
UserPasswordChangedEvent UserEventType = "user.password_changed"
|
|
UserStatusChangedEvent UserEventType = "user.status_changed"
|
|
UserProfileUpdatedEvent UserEventType = "user.profile_updated"
|
|
)
|
|
|
|
// 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)
|
|
}
|
|
|
|
// UserCreated 用户创建事件
|
|
type UserCreated struct {
|
|
*BaseUserEvent
|
|
User *entities.User `json:"user"`
|
|
}
|
|
|
|
func NewUserCreatedEvent(user *entities.User, correlationID string) *UserCreated {
|
|
return &UserCreated{
|
|
BaseUserEvent: &BaseUserEvent{
|
|
ID: uuid.New().String(),
|
|
Type: string(UserCreatedEvent),
|
|
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,
|
|
"username": user.Username,
|
|
"email": user.Email,
|
|
},
|
|
},
|
|
User: user,
|
|
}
|
|
}
|
|
|
|
func (e *UserCreated) GetPayload() interface{} {
|
|
return e.User
|
|
}
|
|
|
|
// UserUpdated 用户更新事件
|
|
type UserUpdated struct {
|
|
*BaseUserEvent
|
|
UserID string `json:"user_id"`
|
|
Changes map[string]interface{} `json:"changes"`
|
|
OldValues map[string]interface{} `json:"old_values"`
|
|
NewValues map[string]interface{} `json:"new_values"`
|
|
}
|
|
|
|
func NewUserUpdatedEvent(userID string, changes, oldValues, newValues map[string]interface{}, correlationID string) *UserUpdated {
|
|
return &UserUpdated{
|
|
BaseUserEvent: &BaseUserEvent{
|
|
ID: uuid.New().String(),
|
|
Type: string(UserUpdatedEvent),
|
|
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,
|
|
"changed_fields": len(changes),
|
|
},
|
|
},
|
|
UserID: userID,
|
|
Changes: changes,
|
|
OldValues: oldValues,
|
|
NewValues: newValues,
|
|
}
|
|
}
|
|
|
|
// UserDeleted 用户删除事件
|
|
type UserDeleted struct {
|
|
*BaseUserEvent
|
|
UserID string `json:"user_id"`
|
|
Username string `json:"username"`
|
|
Email string `json:"email"`
|
|
SoftDelete bool `json:"soft_delete"`
|
|
}
|
|
|
|
func NewUserDeletedEvent(userID, username, email string, softDelete bool, correlationID string) *UserDeleted {
|
|
return &UserDeleted{
|
|
BaseUserEvent: &BaseUserEvent{
|
|
ID: uuid.New().String(),
|
|
Type: string(UserDeletedEvent),
|
|
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,
|
|
"username": username,
|
|
"email": email,
|
|
"soft_delete": softDelete,
|
|
},
|
|
},
|
|
UserID: userID,
|
|
Username: username,
|
|
Email: email,
|
|
SoftDelete: softDelete,
|
|
}
|
|
}
|
|
|
|
// UserLoggedIn 用户登录事件
|
|
type UserLoggedIn struct {
|
|
*BaseUserEvent
|
|
UserID string `json:"user_id"`
|
|
Username string `json:"username"`
|
|
IPAddress string `json:"ip_address"`
|
|
UserAgent string `json:"user_agent"`
|
|
}
|
|
|
|
func NewUserLoggedInEvent(userID, username, 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,
|
|
"username": username,
|
|
"ip_address": ipAddress,
|
|
"user_agent": userAgent,
|
|
},
|
|
},
|
|
UserID: userID,
|
|
Username: username,
|
|
IPAddress: ipAddress,
|
|
UserAgent: userAgent,
|
|
}
|
|
}
|
|
|
|
// UserPasswordChanged 用户密码修改事件
|
|
type UserPasswordChanged struct {
|
|
*BaseUserEvent
|
|
UserID string `json:"user_id"`
|
|
Username string `json:"username"`
|
|
}
|
|
|
|
func NewUserPasswordChangedEvent(userID, username, 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,
|
|
"username": username,
|
|
},
|
|
},
|
|
UserID: userID,
|
|
Username: username,
|
|
}
|
|
}
|
|
|
|
// UserStatusChanged 用户状态变更事件
|
|
type UserStatusChanged struct {
|
|
*BaseUserEvent
|
|
UserID string `json:"user_id"`
|
|
Username string `json:"username"`
|
|
OldStatus entities.UserStatus `json:"old_status"`
|
|
NewStatus entities.UserStatus `json:"new_status"`
|
|
}
|
|
|
|
func NewUserStatusChangedEvent(userID, username string, oldStatus, newStatus entities.UserStatus, correlationID string) *UserStatusChanged {
|
|
return &UserStatusChanged{
|
|
BaseUserEvent: &BaseUserEvent{
|
|
ID: uuid.New().String(),
|
|
Type: string(UserStatusChangedEvent),
|
|
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,
|
|
"username": username,
|
|
"old_status": oldStatus,
|
|
"new_status": newStatus,
|
|
},
|
|
},
|
|
UserID: userID,
|
|
Username: username,
|
|
OldStatus: oldStatus,
|
|
NewStatus: newStatus,
|
|
}
|
|
}
|