rwadurian/backend/mpc-system/services/account/domain/entities/account_share.go

115 lines
3.2 KiB
Go

package entities
import (
"time"
"github.com/google/uuid"
"github.com/rwadurian/mpc-system/services/account/domain/value_objects"
)
// AccountShare represents a mapping of key share to account
// Note: This records share location, not share content
type AccountShare struct {
ID uuid.UUID
AccountID value_objects.AccountID
ShareType value_objects.ShareType
PartyID string
PartyIndex int
DeviceType *string
DeviceID *string
CreatedAt time.Time
LastUsedAt *time.Time
IsActive bool
}
// NewAccountShare creates a new AccountShare
func NewAccountShare(
accountID value_objects.AccountID,
shareType value_objects.ShareType,
partyID string,
partyIndex int,
) *AccountShare {
return &AccountShare{
ID: uuid.New(),
AccountID: accountID,
ShareType: shareType,
PartyID: partyID,
PartyIndex: partyIndex,
CreatedAt: time.Now().UTC(),
IsActive: true,
}
}
// SetDeviceInfo sets device information for user device shares
func (s *AccountShare) SetDeviceInfo(deviceType, deviceID string) {
s.DeviceType = &deviceType
s.DeviceID = &deviceID
}
// UpdateLastUsed updates the last used timestamp
func (s *AccountShare) UpdateLastUsed() {
now := time.Now().UTC()
s.LastUsedAt = &now
}
// Deactivate deactivates the share (e.g., when device is lost)
func (s *AccountShare) Deactivate() {
s.IsActive = false
}
// Activate activates the share
func (s *AccountShare) Activate() {
s.IsActive = true
}
// IsUserDeviceShare checks if this is a user device share
func (s *AccountShare) IsUserDeviceShare() bool {
return s.ShareType == value_objects.ShareTypeUserDevice
}
// IsServerShare checks if this is a server share
func (s *AccountShare) IsServerShare() bool {
return s.ShareType == value_objects.ShareTypeServer
}
// IsRecoveryShare checks if this is a recovery share
func (s *AccountShare) IsRecoveryShare() bool {
return s.ShareType == value_objects.ShareTypeRecovery
}
// IsDelegateShare checks if this is a delegate share
func (s *AccountShare) IsDelegateShare() bool {
return s.ShareType == value_objects.ShareTypeDelegate
}
// RequiresUserShare checks if this share type requires user to provide share for signing
func (s *AccountShare) RequiresUserShare() bool {
return s.ShareType.RequiresUserShare()
}
// Validate validates the account share
func (s *AccountShare) Validate() error {
if s.AccountID.IsZero() {
return ErrShareInvalidAccountID
}
if !s.ShareType.IsValid() {
return ErrShareInvalidType
}
if s.PartyID == "" {
return ErrShareInvalidPartyID
}
if s.PartyIndex < 0 {
return ErrShareInvalidPartyIndex
}
return nil
}
// AccountShare errors
var (
ErrShareInvalidAccountID = &AccountError{Code: "SHARE_INVALID_ACCOUNT_ID", Message: "invalid account ID"}
ErrShareInvalidType = &AccountError{Code: "SHARE_INVALID_TYPE", Message: "invalid share type"}
ErrShareInvalidPartyID = &AccountError{Code: "SHARE_INVALID_PARTY_ID", Message: "invalid party ID"}
ErrShareInvalidPartyIndex = &AccountError{Code: "SHARE_INVALID_PARTY_INDEX", Message: "invalid party index"}
ErrShareNotFound = &AccountError{Code: "SHARE_NOT_FOUND", Message: "share not found"}
)