105 lines
3.3 KiB
Go
105 lines
3.3 KiB
Go
package entities
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/rwadurian/mpc-system/services/account/domain/value_objects"
|
|
)
|
|
|
|
// RecoverySession represents an account recovery session
|
|
type RecoverySession struct {
|
|
ID uuid.UUID
|
|
AccountID value_objects.AccountID
|
|
RecoveryType value_objects.RecoveryType
|
|
OldShareType *value_objects.ShareType
|
|
NewKeygenSessionID *uuid.UUID
|
|
Status value_objects.RecoveryStatus
|
|
RequestedAt time.Time
|
|
CompletedAt *time.Time
|
|
}
|
|
|
|
// NewRecoverySession creates a new RecoverySession
|
|
func NewRecoverySession(
|
|
accountID value_objects.AccountID,
|
|
recoveryType value_objects.RecoveryType,
|
|
) *RecoverySession {
|
|
return &RecoverySession{
|
|
ID: uuid.New(),
|
|
AccountID: accountID,
|
|
RecoveryType: recoveryType,
|
|
Status: value_objects.RecoveryStatusRequested,
|
|
RequestedAt: time.Now().UTC(),
|
|
}
|
|
}
|
|
|
|
// SetOldShareType sets the old share type being replaced
|
|
func (r *RecoverySession) SetOldShareType(shareType value_objects.ShareType) {
|
|
r.OldShareType = &shareType
|
|
}
|
|
|
|
// StartKeygen starts the keygen process for recovery
|
|
func (r *RecoverySession) StartKeygen(keygenSessionID uuid.UUID) error {
|
|
if r.Status != value_objects.RecoveryStatusRequested {
|
|
return ErrRecoveryInvalidState
|
|
}
|
|
r.NewKeygenSessionID = &keygenSessionID
|
|
r.Status = value_objects.RecoveryStatusInProgress
|
|
return nil
|
|
}
|
|
|
|
// Complete marks the recovery as completed
|
|
func (r *RecoverySession) Complete() error {
|
|
if r.Status != value_objects.RecoveryStatusInProgress {
|
|
return ErrRecoveryInvalidState
|
|
}
|
|
now := time.Now().UTC()
|
|
r.CompletedAt = &now
|
|
r.Status = value_objects.RecoveryStatusCompleted
|
|
return nil
|
|
}
|
|
|
|
// Fail marks the recovery as failed
|
|
func (r *RecoverySession) Fail() error {
|
|
if r.Status == value_objects.RecoveryStatusCompleted {
|
|
return ErrRecoveryAlreadyCompleted
|
|
}
|
|
r.Status = value_objects.RecoveryStatusFailed
|
|
return nil
|
|
}
|
|
|
|
// IsCompleted checks if recovery is completed
|
|
func (r *RecoverySession) IsCompleted() bool {
|
|
return r.Status == value_objects.RecoveryStatusCompleted
|
|
}
|
|
|
|
// IsFailed checks if recovery failed
|
|
func (r *RecoverySession) IsFailed() bool {
|
|
return r.Status == value_objects.RecoveryStatusFailed
|
|
}
|
|
|
|
// IsInProgress checks if recovery is in progress
|
|
func (r *RecoverySession) IsInProgress() bool {
|
|
return r.Status == value_objects.RecoveryStatusInProgress
|
|
}
|
|
|
|
// Validate validates the recovery session
|
|
func (r *RecoverySession) Validate() error {
|
|
if r.AccountID.IsZero() {
|
|
return ErrRecoveryInvalidAccountID
|
|
}
|
|
if !r.RecoveryType.IsValid() {
|
|
return ErrRecoveryInvalidType
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Recovery errors
|
|
var (
|
|
ErrRecoveryInvalidAccountID = &AccountError{Code: "RECOVERY_INVALID_ACCOUNT_ID", Message: "invalid account ID for recovery"}
|
|
ErrRecoveryInvalidType = &AccountError{Code: "RECOVERY_INVALID_TYPE", Message: "invalid recovery type"}
|
|
ErrRecoveryInvalidState = &AccountError{Code: "RECOVERY_INVALID_STATE", Message: "invalid recovery state for this operation"}
|
|
ErrRecoveryAlreadyCompleted = &AccountError{Code: "RECOVERY_ALREADY_COMPLETED", Message: "recovery already completed"}
|
|
ErrRecoveryNotFound = &AccountError{Code: "RECOVERY_NOT_FOUND", Message: "recovery session not found"}
|
|
)
|