Skip to content

Account

Commands

AccountCommandActivate

AccountCommandActivate is a domain command to activate an account.

Domain Command Struct:

go
type AccountCommandActivate struct {
	// Outline of the command
	Email string `json:"email"` // Email of the account to activate.
}

Domain Command Handling Method: AccountCommandActivate is a domain command handler handling the activation of an account. (AccountCommandActivate)

go
func (ch *commandHandler) AccountCommandActivate(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandActivate) ([]comby.Event, error)

AccountCommandChangePassword

Domain Command Struct:

go
type AccountCommandChangePassword struct {
	Email           string `json:"email"`
	PasswordCurrent string `json:"passwordCurrent"`
	NewPassword     string `json:"newPassword"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandChangePassword(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandChangePassword) ([]comby.Event, error)

AccountCommandConfirmPasswordReset

Domain Command Struct:

go
type AccountCommandConfirmPasswordReset struct {
	OneTimeToken string `json:"oneTimeToken"`
	NewPassword  string `json:"newPassword"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandConfirmPasswordReset(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandConfirmPasswordReset) ([]comby.Event, error)

AccountCommandConfirmRegister

Domain Command Struct:

go
type AccountCommandConfirmRegister struct {
	OneTimeToken string `json:"oneTimeToken"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandConfirmRegister(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandConfirmRegister) ([]comby.Event, error)

AccountCommandCreate

Domain Command Struct:

go
type AccountCommandCreate struct {
	AccountUuid string `json:"accountUuid"`
	Email       string `json:"email,omitempty"`
	Password    string `json:"password,omitempty"`
	Type        string `json:"type,omitempty"` // default: emailPassword (available: emailPassword, opaque)
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandCreate(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandCreate) ([]comby.Event, error)

AccountCommandLogin

Domain Command Struct:

go
type AccountCommandLogin struct {
	Email       string `json:"email"`
	Password    string `json:"password"`
	SessionUuid string `json:"sessionUuid"`
	SessionKey  string `json:"sessionKey"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandLogin(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandLogin) ([]comby.Event, error)

AccountCommandLoginOAuth

Domain Command Struct:

go
type AccountCommandLoginOAuth struct {
	AccountUuid string `json:"accountUuid"`
	Email       string `json:"email,omitempty"`
	NewPassword string `json:"newPassword,omitempty"`
	SessionUuid string `json:"sessionUuid"`
	SessionKey  string `json:"sessionKey"`
	Attributes  string `json:"attributes,omitempty"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandLoginOAuth(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandLoginOAuth) ([]comby.Event, error)

AccountCommandLoginOpaque

AccountCommandLoginOpaque represents OPAQUE login command

Domain Command Struct:

go
type AccountCommandLoginOpaque struct {
	Email       string `json:"email"`
	SessionUuid string `json:"sessionUuid"`
	SessionKey  string `json:"sessionKey"`
	SessionData []byte `json:"sessionData"` // OPAQUE session key data
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandLoginOpaque(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandLoginOpaque) ([]comby.Event, error)

AccountCommandLogout

AccountCommandLogout handles logging out of a user account or session, with strict access control to ensure security and proper authorization.

This command enforces the following rules:

  1. Self-Logout:
  • A user can log out their own account or session.
  • This ensures users have full control over their own sessions while preventing unauthorized access to other accounts.
  1. System Tenant Authorization:
  • Only the system tenant is permitted to log out other users or their sessions.
  • This restriction ensures that account-wide or cross-tenant session management is tightly controlled and limited to system-level administrators.

Domain Command Struct:

go
type AccountCommandLogout struct {
	AccountUuid string `json:"accountUuid,omitempty"`
	SessionUuid string `json:"sessionUuid,omitempty"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandLogout(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandLogout) ([]comby.Event, error)

AccountCommandRegister

Domain Command Struct:

go
type AccountCommandRegister struct {
	AccountUuid     string `json:"accountUuid"`
	Email           string `json:"email"`
	Password        string `json:"password"`
	InvitationToken string `json:"invitationToken,omitempty"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandRegister(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandRegister) ([]comby.Event, error)

AccountCommandRegisterOpaque

Domain Command Struct:

go
type AccountCommandRegisterOpaque struct {
	AccountUuid            string                         `json:"accountUuid"`
	Email                  string                         `json:"email"`
	OpaqueCredentialRecord *opaque.OpaqueCredentialRecord `json:"opaqueCredentialRecord"`
	InvitationToken        string                         `json:"invitationToken,omitempty"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandRegisterOpaque(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandRegisterOpaque) ([]comby.Event, error)

AccountCommandRemove

AccountCommandRemove handles the deletion of accounts, with strict rules to ensure proper access control.

This command enforces the following restrictions:

  1. Self-Deletion Prohibited:
  • A user cannot delete their own account under any circumstances. This ensures a safeguard against accidental or unauthorized self-deletion.
  1. System Tenant Authorization:
  • Only system tenants are permitted to delete accounts belonging to other users or tenants.
  • This restriction ensures that account deletion is controlled centrally and prevents unauthorized cross-tenant modifications.

Domain Command Struct:

go
type AccountCommandRemove struct {
	AccountUuid string `json:"accountUuid"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandRemove(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandRemove) ([]comby.Event, error)

AccountCommandRemoveAttribute

Domain Command Struct:

go
type AccountCommandRemoveAttribute struct {
	AccountUuid string `json:"accountUuid"`
	Key         string `json:"key"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandRemoveAttribute(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandRemoveAttribute) ([]comby.Event, error)

AccountCommandRequestPasswordReset

Domain Command Struct:

go
type AccountCommandRequestPasswordReset struct {
	Email string `json:"email"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandRequestPasswordReset(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandRequestPasswordReset) ([]comby.Event, error)

AccountCommandSetAttribute

Domain Command Struct:

go
type AccountCommandSetAttribute struct {
	AccountUuid string `json:"accountUuid"`
	Key         string `json:"key"`
	Value       any    `json:"value"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandSetAttribute(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandSetAttribute) ([]comby.Event, error)

AccountCommandUpdate

Domain Command Struct:

go
type AccountCommandUpdate struct {
	AccountUuid   string   `json:"accountUuid"`
	Attributes    string   `json:"attributes,omitempty"`
	PatchedFields []string `json:"patchedFields"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandUpdate(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandUpdate) ([]comby.Event, error)

AccountCommandUpdateCredentials

AccountCommandUpdateCredentials handles updating the credentials (email and password) of an account, with strict access control to ensure security and proper authorization.

This command enforces the following rules:

  1. Self-Account Update:
  • A user can only update the credentials of their own account.
  • This restriction ensures users cannot modify the credentials of other accounts, maintaining strict isolation.
  1. System Tenant Administrator Override:
  • The system tenant administrator is allowed to update credentials for any account.
  • This provides a controlled mechanism for administrative recovery or management of user credentials.

Domain Command Struct:

go
type AccountCommandUpdateCredentials struct {
	AccountUuid string `json:"accountUuid"`
	Email       string `json:"email"`
	Password    string `json:"password"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandUpdateCredentials(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandUpdateCredentials) ([]comby.Event, error)

AccountCommandUpdateCredentialsOpaque

Domain Command Struct:

go
type AccountCommandUpdateCredentialsOpaque struct {
	Email                  string                         `json:"email"`
	PasswordResetToken     string                         `json:"passwordResetToken"`
	OpaqueCredentialRecord *opaque.OpaqueCredentialRecord `json:"opaqueCredentialRecord"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandUpdateCredentialsOpaque(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandUpdateCredentialsOpaque) ([]comby.Event, error)

AccountCommandUpdateState

Domain Command Struct:

go
type AccountCommandUpdateState struct {
	AccountUuid string `json:"accountUuid"`
	State       string `json:"state"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) AccountCommandUpdateState(ctx context.Context, cmd comby.Command, domainCmd *AccountCommandUpdateState) ([]comby.Event, error)

Queries

Domain Query Structs:

Domain Query Responses:

AccountQueryList

AccountQueryList returns a list of accounts based on the context of the requestor.

This query exhibits unique behavior, as its results vary depending on the context of the requesting entity. Specifically, the query's outcome can be classified into three distinct cases:

  1. System Tenant Context:
  • When the requestor represents the system tenant, the query retrieves all accounts.
  • This includes not only the accounts directly tied to the system tenant but also any identities belonging to other tenants.
  • This behavior ensures that the system tenant maintains global visibility across all tenant identities.
  1. Specific Tenant Context:
  • If the requestor represents a specific tenant, the query returns all accounts associated with that tenant.
  • Importantly, it excludes accounts or identities that are linked to other tenants.
  • This ensures that a tenant's view remains isolated, adhering to a strict multi-tenancy principle.
  1. Equal Sender and Target Context:
  • In cases where an account requests the list of accounts, the query returns only the requesting account itself.
  • This includes all identities associated with the requesting account, regardless of their tenant.
  • This behavior ensures that the account sees only its own information while maintaining visibility into all related identities.

Domain Query Struct:

go
type AccountQueryList struct {
	Page       int64  `json:"page,omitempty"`
	PageSize   int64  `json:"pageSize,omitempty"`
	OrderBy    string `json:"orderBy,omitempty"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Query Handling Method:

go
func (qh *queryHandler) AccountQueryList(ctx context.Context, qry comby.Query, domainQry *AccountQueryList) (*AccountQueryListResponse, error)

AccountQueryModelByEmail

Domain Query Struct:

go
type AccountQueryModelByEmail struct {
	Email string `json:"email"`
}

Domain Query Handling Method:

go
func (qh *queryHandler) AccountQueryModelByEmail(ctx context.Context, qry comby.Query, domainQry *AccountQueryModelByEmail) (*AccountQueryItemResponse, error)

AccountQueryModelEmailPassword

Domain Query Struct:

go
type AccountQueryModelEmailPassword struct {
	Email              string `json:"email"`
	Password           string `json:"password"`
	IncludeLastSession bool   `json:"includeLastSession,omitempty"`
	IncludeAllSessions bool   `json:"includeAllSessions,omitempty"`
}

Domain Query Handling Method:

go
func (qh *queryHandler) AccountQueryModelEmailPassword(ctx context.Context, qry comby.Query, domainQry *AccountQueryModelEmailPassword) (*AccountQueryItemResponse, error)

AccountQueryModel

Domain Query Struct:

go
type AccountQueryModel struct {
	AccountUuid string `json:"accountUuid"`
}

Domain Query Handling Method:

go
func (qh *queryHandler) AccountQueryModel(ctx context.Context, qry comby.Query, domainQry *AccountQueryModel) (*AccountQueryItemResponse, error)

AccountQueryModelOneTimeToken

Domain Query Struct:

go
type AccountQueryModelOneTimeToken struct {
	OneTimeToken string `json:"ott"`
}

Domain Query Handling Method:

go
func (qh *queryHandler) AccountQueryModelOneTimeToken(ctx context.Context, qry comby.Query, domainQry *AccountQueryModelOneTimeToken) (*AccountQueryItemResponse, error)

AccountQueryListResponse

go
type AccountQueryListResponse struct {
	Items    []*readmodel.AccountModel `json:"items,omitempty"`
	Total    int64                     `json:"total,omitempty"`
	Page     int64                     `json:"page,omitempty"`
	PageSize int64                     `json:"pageSize,omitempty"`
}

AccountQueryItemResponse

go
type AccountQueryItemResponse struct {
	Item *readmodel.AccountModel `json:"item,omitempty"`
}

Events

AccountPasswordChangedEvent

AccountPasswordChangedEvent is an domain event that is triggered when the password of an account has changed.

Domain Event Struct:

go
type AccountPasswordChangedEvent struct {
	NewHashedPassword string `json:"newHashedPassword"` // The new hashed password for the account.
}

Domain Event Handling Method:

go
func (agg *Account) AccountPasswordChangedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountPasswordChangedEvent) (error)

AccountPasswordResetConfirmedEvent

Domain Event Struct:

go
type AccountPasswordResetConfirmedEvent struct {
	NewHashedPassword string `json:"newHashedPassword"`
	State             string `json:"state"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountPasswordResetConfirmedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountPasswordResetConfirmedEvent) (error)

AccountRegisterConfirmedEvent

Domain Event Struct:

go
type AccountRegisterConfirmedEvent struct {
	State string `json:"state"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountRegisterConfirmedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountRegisterConfirmedEvent) (error)

AccountLoggedInEvent

Domain Event Struct:

go
type AccountLoggedInEvent struct {
	SessionUuid string `json:"sessionUuid"`
	SessionKey  string `json:"sessionKey"`
	ExpiredAt   int64  `json:"expiredAt"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountLoggedInEvent(ctx context.Context, evt comby.Event, domainEvt *AccountLoggedInEvent) (error)

AccountLoggedInOpaqueEvent

Events for OPAQUE operations

Domain Event Struct:

go
type AccountLoggedInOpaqueEvent struct {
	Email       string `json:"email"`
	SessionUuid string `json:"sessionUuid"`
	SessionKey  string `json:"sessionKey"`
	ExpiredAt   int64  `json:"expiredAt"`
	Success     bool   `json:"success"`
}

Domain Event Handling Method: Event handler for OPAQUE login

go
func (agg *Account) AccountLoggedInOpaqueEvent(ctx context.Context, evt comby.Event, domainEvt *AccountLoggedInOpaqueEvent) (error)

AccountLoggedOutEvent

Domain Event Struct:

go
type AccountLoggedOutEvent struct {
	SessionUuid string `json:"sessionUuid"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountLoggedOutEvent(ctx context.Context, evt comby.Event, domainEvt *AccountLoggedOutEvent) (error)

AccountRegisteredEvent

Domain Event Struct:

go
type AccountRegisteredEvent struct {
	State string `json:"state,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountRegisteredEvent(ctx context.Context, evt comby.Event, domainEvt *AccountRegisteredEvent) (error)

AccountRegisteredOpaqueEvent

Domain Event Struct:

go
type AccountRegisteredOpaqueEvent struct {
	State                  string                         `json:"state,omitempty"`
	Email                  string                         `json:"email,omitempty"`
	OpaqueCredentialRecord *opaque.OpaqueCredentialRecord `json:"opaqueCredentialRecord,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountRegisteredOpaqueEvent(ctx context.Context, evt comby.Event, domainEvt *AccountRegisteredOpaqueEvent) (error)

AccountRemovedEvent

Domain Event Struct:

go
type AccountRemovedEvent struct {
	State string `json:"state,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountRemovedEvent) (error)

AccountAttributeRemovedEvent

Domain Event Struct:

go
type AccountAttributeRemovedEvent struct {
	Key string `json:"key"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountAttributeRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountAttributeRemovedEvent) (error)

AccountPasswordResetRequestedEvent

Domain Event Struct:

go
type AccountPasswordResetRequestedEvent struct {
	Email string `json:"email"`
	Code  string `json:"code"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountPasswordResetRequestedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountPasswordResetRequestedEvent) (error)

AccountPasswordResetOpaqueRequestedEvent

Domain Event Struct:

go
type AccountPasswordResetOpaqueRequestedEvent struct {
	Email string `json:"email"`
	Code  string `json:"code"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountPasswordResetOpaqueRequestedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountPasswordResetOpaqueRequestedEvent) (error)

AccountAttributeSetEvent

Domain Event Struct:

go
type AccountAttributeSetEvent struct {
	Key   string `json:"key"`
	Value any    `json:"value"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountAttributeSetEvent(ctx context.Context, evt comby.Event, domainEvt *AccountAttributeSetEvent) (error)

AccountUpdatedEvent

Domain Event Struct:

go
type AccountUpdatedEvent struct {
	Attributes string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountUpdatedEvent) (error)

AccountCredentialsUpdatedEvent

Domain Event Struct:

go
type AccountCredentialsUpdatedEvent struct {
	Email    string `json:"email,omitempty"`
	Password string `json:"password,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountCredentialsUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountCredentialsUpdatedEvent) (error)

AccountCredentialsOpaqueUpdatedEvent

Domain Event Struct:

go
type AccountCredentialsOpaqueUpdatedEvent struct {
	Email                  string                         `json:"email"`
	OpaqueCredentialRecord *opaque.OpaqueCredentialRecord `json:"opaqueCredentialRecord"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountCredentialsOpaqueUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountCredentialsOpaqueUpdatedEvent) (error)

AccountOneTimeTokenUpdatedEvent

Domain Event Struct:

go
type AccountOneTimeTokenUpdatedEvent struct {
	Key       string `json:"key"`
	ExpiredAt int64  `json:"expiredAt"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountOneTimeTokenUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountOneTimeTokenUpdatedEvent) (error)

AccountStateUpdatedEvent

Domain Event Struct:

go
type AccountStateUpdatedEvent struct {
	State string `json:"state"`
}

Domain Event Handling Method:

go
func (agg *Account) AccountStateUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *AccountStateUpdatedEvent) (error)

Aggregate

Account represents the root aggregate for managing authentication and session handling.

  • Credentials: Attributes for email, password, and the next allowed login time.
  • CredentialsOpaque: OPAQUE credentials for passwordless authentication.
  • OneTimeToken: Single-use tokens with attributes for the key, type, and expiration time.
  • Session: Details about active user sessions, including a unique session UUID, session key, and expiration time.

Aggregate Struct:

go
type Account struct {
	*comby.BaseAggregate
	// Entities
	Credentials       *Credentials
	CredentialsOpaque *CredentialsOpaque
	OneTimeToken      *OneTimeToken
	Sessions          []*Session
	// Value Objects
	State string
}

Methods

ChangePassword

go
func (agg *Account) ChangePassword(passwordCurrent, newPassword string) (error)

ConfirmPasswordReset

go
func (agg *Account) ConfirmPasswordReset(oneTimeToken, newPassword string) (error)

ConfirmRegister

go
func (agg *Account) ConfirmRegister(oneTimeToken string) (error)

Login

go
func (agg *Account) Login(email, password, sessionUuid, sessionKey string) (error)

LoginWithOpaque

LoginWithOpaque handles OPAQUE-based authentication

go
func (agg *Account) LoginWithOpaque(email, sessionUuid, sessionKey string, sessionData []byte) (error)

Logout

go
func (agg *Account) Logout() (error)

LogoutSession

go
func (agg *Account) LogoutSession(sessionUuid string) (error)

Register

go
func (agg *Account) Register(email, password, state string) (error)

RegisterWithOPAQUE

RegisterWithOPAQUE registers an account using OPAQUE credentials

go
func (agg *Account) RegisterWithOPAQUE(email, state string, credentialRecord *opaque.OpaqueCredentialRecord) (error)

Remove

go
func (agg *Account) Remove() (error)

RemoveAttribute

go
func (agg *Account) RemoveAttribute(key string) (error)

RequestPasswordReset

go
func (agg *Account) RequestPasswordReset(email string) (error)

RequestPasswordResetOpaque

go
func (agg *Account) RequestPasswordResetOpaque(email string) (error)

SetAttribute

go
func (agg *Account) SetAttribute(key string, value any) (error)

Update

go
func (agg *Account) Update(attributes string) (error)

UpdateCredentials

go
func (agg *Account) UpdateCredentials(email, password string) (error)

UpdateCredentialsOpaque

go
func (agg *Account) UpdateCredentialsOpaque(email string, opaqueCredentialRecord *opaque.OpaqueCredentialRecord) (error)

UpdateOneTimeToken

go
func (agg *Account) UpdateOneTimeToken(key string, expiredAt int64) (error)

UpdateState

go
func (agg *Account) UpdateState(state string) (error)

Event Handlers

Reactor

Domain EventMethod
aggregate.AccountRegisteredEventAccountRegisteredEvent
aggregate.AccountPasswordResetRequestedEventAccountPasswordResetRequestedEvent

AccountReadmodel

Domain EventMethod
tenantAggregate.TenantAttributeRemovedEventTenantAttributeRemovedEvent
tenantAggregate.TenantAttributeSetEventTenantAttributeSetEvent
tenantAggregate.TenantUpdatedEventTenantUpdatedEvent
tenantAggregate.TenantRemovedEventTenantRemovedEvent
tenantAggregate.TenantCreatedEventTenantCreatedEvent
identityAggregate.IdentityRemovedEventIdentityRemovedEvent
identityAggregate.IdentityProfileUpdatedEventIdentityProfileUpdatedEvent
identityAggregate.IdentityAddedGroupEventIdentityAddedGroupEvent
identityAggregate.IdentityCreatedEventIdentityCreatedEvent
groupAggregate.GroupAddedEventGroupAddedEvent
groupAggregate.GroupRemovedEventGroupRemovedEvent
groupAggregate.GroupUpdatedEventGroupUpdatedEvent
accountAggregate.AccountCredentialsOpaqueUpdatedEventAccountCredentialsOpaqueUpdatedEvent
accountAggregate.AccountOneTimeTokenUpdatedEventAccountOneTimeTokenUpdatedEvent
accountAggregate.AccountStateUpdatedEventAccountStateUpdatedEvent
accountAggregate.AccountRegisteredOpaqueEventAccountRegisteredOpaqueEvent
accountAggregate.AccountLoggedInOpaqueEventAccountLoggedInOpaqueEvent
accountAggregate.AccountAttributeRemovedEventAccountAttributeRemovedEvent
accountAggregate.AccountAttributeSetEventAccountAttributeSetEvent
accountAggregate.AccountLoggedOutEventAccountLoggedOutEvent
accountAggregate.AccountLoggedInEventAccountLoggedInEvent
accountAggregate.AccountUpdatedEventAccountUpdatedEvent
accountAggregate.AccountRegisteredEventAccountRegisteredEvent
accountAggregate.AccountCredentialsUpdatedEventAccountCredentialsUpdatedEvent
accountAggregate.AccountRemovedEventAccountRemovedEvent
accountAggregate.AccountPasswordResetConfirmedEventAccountPasswordResetConfirmedEvent
accountAggregate.AccountPasswordResetRequestedEventAccountPasswordResetRequestedEvent
accountAggregate.AccountPasswordChangedEventAccountPasswordChangedEvent
accountAggregate.AccountRegisterConfirmedEventAccountRegisterConfirmedEvent

Custom Permissions

NameTypeComment
AccountCommandActivateCommandActivate an existing account
AccountCommandChangePasswordCommandChange password of an existing account
AccountCommandRequestPasswordResetCommandRequest password reset of an existing account
AccountCommandConfirmPasswordResetCommandConfirm password reset of an existing account
AccountCommandConfirmRegisterCommandConfirm registration of an new account
AccountCommandCreateCommandCreate new account manually
AccountCommandLoginOAuthCommandLogin into an existing account using OAuth
AccountCommandLoginCommandLogin into an existing account
AccountCommandLogoutCommandLogout an account
AccountCommandRegisterCommandRegister new account
AccountCommandRemoveCommandRemove existing account
AccountCommandUpdateCredentialsCommandUpdate credentials of an existing account
AccountCommandUpdateCommandUpdate account
AccountCommandSetAttributeCommandSet single attribute of an existing account
AccountCommandRemoveAttributeCommandRemove single attribute of an existing account
AccountCommandUpdateStateCommandUpdate state of an existing account
AccountCommandRegisterOpaqueCommandRegister a new account (OPAQUE)
AccountCommandLoginOpaqueCommandLogin to an existing account (OPAQUE)
AccountQueryModelOneTimeTokenQueryRequest account details by one time password
AccountQueryModelEmailPasswordQueryRequest account details by email and password
AccountQueryModelQueryRequest account details

Asset

Commands

AssetCommandAdd

Domain Command Struct:

go
type AssetCommandAdd struct {
	AssetUuid        string `json:"assetUuid"`
	IdentityUuid     string `json:"identityUuid,omitempty"`
	AssetName        string `json:"assetName,omitempty"`
	AssetSize        int64  `json:"assetSize,omitempty"`
	AssetContentType string `json:"assetContentType,omitempty"`
	Attributes       string `json:"attributes,omitempty"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) AssetCommandAdd(ctx context.Context, cmd comby.Command, domainCmd *AssetCommandAdd) ([]comby.Event, error)

AssetCommandRemove

Domain Command Struct:

go
type AssetCommandRemove struct {
	AssetUuid string `json:"assetUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) AssetCommandRemove(ctx context.Context, cmd comby.Command, domainCmd *AssetCommandRemove) ([]comby.Event, error)

AssetCommandRemoveAttribute

Domain Command Struct:

go
type AssetCommandRemoveAttribute struct {
	AssetUuid string `json:"assetUuid"`
	Key       string `json:"key"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) AssetCommandRemoveAttribute(ctx context.Context, cmd comby.Command, domainCmd *AssetCommandRemoveAttribute) ([]comby.Event, error)

AssetCommandSetAttribute

Domain Command Struct:

go
type AssetCommandSetAttribute struct {
	AssetUuid string `json:"assetUuid"`
	Key       string `json:"key"`
	Value     any    `json:"value"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) AssetCommandSetAttribute(ctx context.Context, cmd comby.Command, domainCmd *AssetCommandSetAttribute) ([]comby.Event, error)

AssetCommandUpdate

Domain Command Struct:

go
type AssetCommandUpdate struct {
	IdentityUuid     string   `json:"identityUuid"`
	AssetUuid        string   `json:"assetUuid"`
	AssetName        string   `json:"assetName,omitempty"`
	AssetSize        int64    `json:"assetSize,omitempty"`
	AssetContentType string   `json:"assetContentType,omitempty"`
	Attributes       string   `json:"attributes,omitempty"`
	PatchedFields    []string `json:"patchedFields"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) AssetCommandUpdate(ctx context.Context, cmd comby.Command, domainCmd *AssetCommandUpdate) ([]comby.Event, error)

Queries

Domain Query Structs:

Domain Query Responses:

AssetQueryDownload

Domain Query Struct:

go
type AssetQueryDownload struct {
	AssetUuid string `json:"assetUuid"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) AssetQueryDownload(ctx context.Context, qry comby.Query, domainQry *AssetQueryDownload) (*AssetQueryItemResponse, error)

AssetQueryList

Domain Query Struct:

go
type AssetQueryList struct {
	TenantUuid string `json:"tenantUuid"`
	Page       int64  `json:"page,omitempty"`
	PageSize   int64  `json:"pageSize,omitempty"`
	OrderBy    string `json:"orderBy,omitempty"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) AssetQueryList(ctx context.Context, qry comby.Query, domainQry *AssetQueryList) (*AssetQueryListResponse, error)

AssetQueryModelByBucketObject

Domain Query Struct:

go
type AssetQueryModelByBucketObject struct {
	BucketName string `json:"bucketName"`
	ObjectName string `json:"objectName"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) AssetQueryModelByBucketObject(ctx context.Context, qry comby.Query, domainQry *AssetQueryModelByBucketObject) (*AssetQueryItemResponse, error)

AssetQueryModel

Domain Query Struct:

go
type AssetQueryModel struct {
	AssetUuid string `json:"assetUuid"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) AssetQueryModel(ctx context.Context, qry comby.Query, domainQry *AssetQueryModel) (*AssetQueryItemResponse, error)

AssetQueryItemResponse

go
type AssetQueryItemResponse struct {
	Item *readmodel.AssetModel `json:"item,omitempty"`
}

AssetQueryListResponse

go
type AssetQueryListResponse struct {
	Items    []*readmodel.AssetModel `json:"items,omitempty"`
	Total    int64                   `json:"total,omitempty"`
	Page     int64                   `json:"page,omitempty"`
	PageSize int64                   `json:"pageSize,omitempty"`
}

Events

AssetAddedEvent

Domain Event Struct:

go
type AssetAddedEvent struct {
	IdentityUuid     string `json:"identityUuid,omitempty"`
	AssetName        string `json:"assetName,omitempty"`
	AssetSize        int64  `json:"assetSize,omitempty"`
	AssetContentType string `json:"assetContentType,omitempty"`
	BucketName       string `json:"bucketName,omitempty"`
	ObjectName       string `json:"objectName,omitempty"`
	Attributes       string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Asset) AssetAddedEvent(ctx context.Context, evt comby.Event, domainEvt *AssetAddedEvent) (error)

AssetRemovedEvent

Domain Event Struct:

go
type AssetRemovedEvent struct {
	Reason string `json:"reason,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Asset) AssetRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *AssetRemovedEvent) (error)

AssetAttributeRemovedEvent

Domain Event Struct:

go
type AssetAttributeRemovedEvent struct {
	Key string `json:"key"`
}

Domain Event Handling Method:

go
func (agg *Asset) AssetAttributeRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *AssetAttributeRemovedEvent) (error)

AssetAttributeSetEvent

Domain Event Struct:

go
type AssetAttributeSetEvent struct {
	Key   string `json:"key"`
	Value any    `json:"value"`
}

Domain Event Handling Method:

go
func (agg *Asset) AssetAttributeSetEvent(ctx context.Context, evt comby.Event, domainEvt *AssetAttributeSetEvent) (error)

AssetUpdatedEvent

Domain Event Struct:

go
type AssetUpdatedEvent struct {
	IdentityUuid     string `json:"identityUuid,omitempty"`
	AssetName        string `json:"assetName,omitempty"`
	AssetSize        int64  `json:"assetSize,omitempty"`
	AssetContentType string `json:"assetContentType,omitempty"`
	BucketName       string `json:"bucketName,omitempty"`
	ObjectName       string `json:"objectName,omitempty"`
	Attributes       string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Asset) AssetUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *AssetUpdatedEvent) (error)

Aggregate

Aggregate Struct:

go
type Asset struct {
	*comby.BaseAggregate
	// References
	IdentityUuid string
	// Value Objects (asset)
	Name        string
	Size        int64
	ContentType string
	Path        string
	// Value Objects (storage)
	BucketName string
	ObjectName string
}

Methods

Add

go
func (agg *Asset) Add(identityUuid, assetName string, assetSize int64, assetContentType, bucketName, objectName, attributes string) (error)

Remove

go
func (agg *Asset) Remove() (error)

RemoveAttribute

go
func (agg *Asset) RemoveAttribute(key string) (error)

SetAttribute

go
func (agg *Asset) SetAttribute(key string, value any) (error)

Update

go
func (agg *Asset) Update(identityUuid, assetName string, assetSize int64, assetContentType, bucketName, objectName, attributes string) (error)

Event Handlers

AssetReadmodel

Domain EventMethod
tenantAggregate.TenantCreatedEventTenantCreatedEvent
tenantAggregate.TenantRemovedEventTenantRemovedEvent
tenantAggregate.TenantUpdatedEventTenantUpdatedEvent
identityAggregate.IdentityCreatedEventIdentityCreatedEvent
identityAggregate.IdentityProfileUpdatedEventIdentityProfileUpdatedEvent
identityAggregate.IdentityRemovedEventIdentityRemovedEvent
assetAggregate.AssetAddedEventAssetAddedEvent
assetAggregate.AssetUpdatedEventAssetUpdatedEvent
assetAggregate.AssetRemovedEventAssetRemovedEvent
assetAggregate.AssetAttributeSetEventAssetAttributeSetEvent
assetAggregate.AssetAttributeRemovedEventAssetAttributeRemovedEvent

Custom Permissions

NameTypeComment
AssetCommandAddCommandCreate and upload asset
AssetCommandRemoveCommandRemove existing asset
AssetCommandUpdateCommandUpdate existing asset
AssetCommandSetAttributeCommandSet single attribute for existing asset
AssetCommandRemoveAttributeCommandRemove single attribute from existing asset
AssetQueryDownloadQueryDownload existing asset
AssetQueryListQueryList all assets
AssetQueryModelQueryGet asset
AssetQueryModelByBucketObjectQueryGet asset by bucket and object name

Auth

Commands

CommandWithoutTargetAggregate

Domain Command Struct:

go
type CommandWithoutTargetAggregate struct {
	NewAggAUuid string `json:"newAggAUuid"`
	Name        string
}

Domain Command Handling Method:

go
func (cs *commandHandler) CommandHandlerWithoutTargetAggregateUuid(ctx context.Context, cmd comby.Command, domainCmd *CommandWithoutTargetAggregate) ([]comby.Event, error)

CommandWithTargetAggregate

Domain Command Struct:

go
type CommandWithTargetAggregate struct {
	AggAUuid string `json:"aggAUuid"`
	Name     string
}

Domain Command Handling Method:

go
func (cs *commandHandler) CommandHandlerWithTargetAggregateUuid(ctx context.Context, cmd comby.Command, domainCmd *CommandWithTargetAggregate) ([]comby.Event, error)

Events

AggACreated


Domain Event Struct:

go
type AggACreated struct {
	AggAUuid string `json:"aggAUuid"`
	Other    string `json:"other,omitempty"`
}

Domain Event Handling Method:

go
func (agg *AggA) AggACreated(ctx context.Context, evt comby.Event, domainEvt *AggACreated) (error)

AggAModified

Domain Event Struct:

go
type AggAModified struct {
	AggAUuid string `json:"aggAUuid"`
	Other    string `json:"other,omitempty"`
}

Domain Event Handling Method:

go
func (agg *AggA) AggAModified(ctx context.Context, evt comby.Event, domainEvt *AggAModified) (error)

Aggregate


Aggregate Struct:

go
type AggA struct {
	*comby.BaseAggregate
	Other string
}

Methods

CreateAggA

go
func (agg *AggA) CreateAggA(other string) (error)

ModifyAggA

go
func (agg *AggA) ModifyAggA(other string) (error)

Event Handlers

AccountCtxReadmodel

Domain EventMethod
tenantAggregate.TenantRemovedEventTenantRemovedEvent
tenantAggregate.TenantCreatedEventTenantCreatedEvent
identityAggregate.IdentityRemovedGroupEventIdentityRemovedGroupEvent
identityAggregate.IdentityAddedGroupEventIdentityAddedGroupEvent
identityAggregate.IdentityRemovedTokenEventIdentityRemovedTokenEvent
identityAggregate.IdentityAddedTokenEventIdentityAddedTokenEvent
identityAggregate.IdentityRemovedEventIdentityRemovedEvent
identityAggregate.IdentityCreatedEventIdentityCreatedEvent
groupAggregate.GroupAddedEventGroupAddedEvent
groupAggregate.GroupUpdatedEventGroupUpdatedEvent
groupAggregate.GroupRemovedEventGroupRemovedEvent
accountAggregate.AccountCredentialsUpdatedEventAccountCredentialsUpdatedEvent
accountAggregate.AccountRegisteredEventAccountRegisteredEvent
accountAggregate.AccountAttributeSetEventAccountAttributeSetEvent
accountAggregate.AccountLoggedOutEventAccountLoggedOutEvent
accountAggregate.AccountLoggedInOpaqueEventAccountLoggedInOpaqueEvent
accountAggregate.AccountLoggedInEventAccountLoggedInEvent
accountAggregate.AccountOneTimeTokenUpdatedEventAccountOneTimeTokenUpdatedEvent
accountAggregate.AccountAttributeRemovedEventAccountAttributeRemovedEvent
accountAggregate.AccountRemovedEventAccountRemovedEvent
accountAggregate.AccountPasswordResetConfirmedEventAccountPasswordResetConfirmedEvent
accountAggregate.AccountPasswordResetRequestedEventAccountPasswordResetRequestedEvent
accountAggregate.AccountPasswordChangedEventAccountPasswordChangedEvent
accountAggregate.AccountRegisterConfirmedEventAccountRegisterConfirmedEvent
comby.AllDomainEventOnHandleEventForTenantAggregateTuples

Custom Permissions

NameTypeComment
CommandCommandWithoutTargetAggregate
CommandCommandWithTargetAggregate

Group

Commands

GroupCommandCreate

Domain Command Struct:

go
type GroupCommandCreate struct {
	GroupUuid   string   `json:"groupUuid"`
	Name        string   `json:"name"`
	Description string   `json:"description,omitempty"`
	Attributes  string   `json:"attributes,omitempty"`
	Permissions []string `json:"permissions,omitempty"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) GroupCommandCreate(ctx context.Context, cmd comby.Command, domainCmd *GroupCommandCreate) ([]comby.Event, error)

GroupCommandRemove

Domain Command Struct:

go
type GroupCommandRemove struct {
	GroupUuid string `json:"groupUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) GroupCommandRemove(ctx context.Context, cmd comby.Command, domainCmd *GroupCommandRemove) ([]comby.Event, error)

GroupCommandRemoveAttribute

Domain Command Struct:

go
type GroupCommandRemoveAttribute struct {
	GroupUuid string `json:"groupUuid"`
	Key       string `json:"key"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) GroupCommandRemoveAttribute(ctx context.Context, cmd comby.Command, domainCmd *GroupCommandRemoveAttribute) ([]comby.Event, error)

GroupCommandSetAttribute

Domain Command Struct:

go
type GroupCommandSetAttribute struct {
	GroupUuid string `json:"groupUuid"`
	Key       string `json:"key"`
	Value     any    `json:"value"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) GroupCommandSetAttribute(ctx context.Context, cmd comby.Command, domainCmd *GroupCommandSetAttribute) ([]comby.Event, error)

GroupCommandUpdate

Domain Command Struct:

go
type GroupCommandUpdate struct {
	GroupUuid     string   `json:"groupUuid"`
	Name          string   `json:"name,omitempty"`
	Description   string   `json:"description,omitempty"`
	Attributes    string   `json:"attributes,omitempty"`
	Permissions   []string `json:"permissions,omitempty"`
	PatchedFields []string `json:"patchedFields" doc:"list of fields that should be patched - comma separated" example:"field1,field2"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) GroupCommandUpdate(ctx context.Context, cmd comby.Command, domainCmd *GroupCommandUpdate) ([]comby.Event, error)

Queries

Domain Query Structs:

Domain Query Responses:

GroupQueryList

Domain Query Struct:

go
type GroupQueryList struct {
	TenantUuid string `json:"tenantUuid"`
	Page       int64  `json:"page,omitempty"`
	PageSize   int64  `json:"pageSize,omitempty"`
	OrderBy    string `json:"orderBy,omitempty"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) GroupQueryList(ctx context.Context, qry comby.Query, domainQry *GroupQueryList) (*GroupQueryListResponse, error)

GroupQueryModelByName

Domain Query Struct:

go
type GroupQueryModelByName struct {
	Name string `json:"name"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) GroupQueryModelByName(ctx context.Context, qry comby.Query, domainQry *GroupQueryModelByName) (*GroupQueryItemResponse, error)

GroupQueryModel

Domain Query Struct:

go
type GroupQueryModel struct {
	GroupUuid string `json:"groupUuid"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) GroupQueryModel(ctx context.Context, qry comby.Query, domainQry *GroupQueryModel) (*GroupQueryItemResponse, error)

GroupQueryListResponse

go
type GroupQueryListResponse struct {
	Items    []*readmodel.GroupModel `json:"items,omitempty"`
	Total    int64                   `json:"total,omitempty"`
	Page     int64                   `json:"page,omitempty"`
	PageSize int64                   `json:"pageSize,omitempty"`
}

GroupQueryItemResponse

go
type GroupQueryItemResponse struct {
	Item *readmodel.GroupModel `json:"item,omitempty"`
}

Events

GroupAddedEvent

Domain Event Struct:

go
type GroupAddedEvent struct {
	Name        string   `json:"name"`
	Description string   `json:"description,omitempty"`
	Attributes  string   `json:"attributes,omitempty"`
	Permissions []string `json:"permissions,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Group) GroupAddedEvent(ctx context.Context, evt comby.Event, domainEvt *GroupAddedEvent) (error)

GroupRemovedEvent

Domain Event Struct:

go
type GroupRemovedEvent struct {
	Reason string `json:"reason,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Group) GroupRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *GroupRemovedEvent) (error)

GroupAttributeRemovedEvent

Domain Event Struct:

go
type GroupAttributeRemovedEvent struct {
	Key string `json:"key"`
}

Domain Event Handling Method:

go
func (agg *Group) GroupAttributeRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *GroupAttributeRemovedEvent) (error)

GroupAttributeSetEvent

Domain Event Struct:

go
type GroupAttributeSetEvent struct {
	Key   string `json:"key"`
	Value any    `json:"value"`
}

Domain Event Handling Method:

go
func (agg *Group) GroupAttributeSetEvent(ctx context.Context, evt comby.Event, domainEvt *GroupAttributeSetEvent) (error)

GroupUpdatedEvent

Domain Event Struct:

go
type GroupUpdatedEvent struct {
	Name        string   `json:"name"`
	Description string   `json:"description"`
	Attributes  string   `json:"attributes,omitempty"`
	Permissions []string `json:"permissions,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Group) GroupUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *GroupUpdatedEvent) (error)

Aggregate

Aggregate Struct:

go
type Group struct {
	*comby.BaseAggregate
	// Value Objects
	Permissions []string
	Name        string
	Description string
}

Methods

Add

go
func (agg *Group) Add(name, description, attributes string, permissions []string) (error)

Remove

go
func (agg *Group) Remove() (error)

RemoveAttribute

go
func (agg *Group) RemoveAttribute(key string) (error)

SetAttribute

go
func (agg *Group) SetAttribute(key string, value any) (error)

Update

go
func (agg *Group) Update(name, description, attributes string, permissions []string) (error)

Event Handlers

GroupReadmodel

Domain EventMethod
tenantAggregate.TenantCreatedEventTenantCreatedEvent
tenantAggregate.TenantRemovedEventTenantRemovedEvent
tenantAggregate.TenantUpdatedEventTenantUpdatedEvent
groupAggregate.GroupAddedEventGroupAddedEvent
groupAggregate.GroupUpdatedEventGroupUpdatedEvent
groupAggregate.GroupRemovedEventGroupRemovedEvent
groupAggregate.GroupAttributeSetEventGroupAttributeSetEvent
groupAggregate.GroupAttributeRemovedEventGroupAttributeRemovedEvent

Custom Permissions

NameTypeComment
GroupCommandCreateCommandCreate new group
GroupCommandUpdateCommandUpdate existing group
GroupCommandRemoveCommandRemove existing group
GroupCommandSetAttributeCommandSet single attribute of existing group
GroupCommandRemoveAttributeCommandRemove single attribute from existing group
GroupQueryListQueryList groups
GroupQueryModelQueryGet group by id
GroupQueryModelByNameQueryGet group by name

Identity

Commands

IdentityCommandAddGroup

Domain Command Struct:

go
type IdentityCommandAddGroup struct {
	IdentityUuid string `json:"identityUuid"`
	GroupUuid    string `json:"groupUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandAddGroup(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandAddGroup) ([]comby.Event, error)

IdentityCommandAddToken

Domain Command Struct:

go
type IdentityCommandAddToken struct {
	IdentityUuid string `json:"identityUuid"`
	TokenUuid    string `json:"tokenUuid"`
	TokenValue   string `json:"tokenValue"`
	Name         string `json:"name,omitempty"`
	Description  string `json:"description,omitempty"`
	ExpiredAt    int64  `json:"expiredAt,omitempty"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandAddToken(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandAddToken) ([]comby.Event, error)

IdentityCommandCreate

Domain Command Struct:

go
type IdentityCommandCreate struct {
	IdentityUuid string   `json:"identityUuid"`
	AccountUuid  string   `json:"accountUuid,omitempty"`
	GroupUuids   []string `json:"groupUuids"`
	Attributes   string   `json:"attributes,omitempty"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandCreate(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandCreate) ([]comby.Event, error)

IdentityCommandRemove

Domain Command Struct:

go
type IdentityCommandRemove struct {
	IdentityUuid string `json:"identityUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandRemove(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandRemove) ([]comby.Event, error)

IdentityCommandRemoveAttribute

Domain Command Struct:

go
type IdentityCommandRemoveAttribute struct {
	IdentityUuid string `json:"identityUuid"`
	Key          string `json:"key"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandRemoveAttribute(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandRemoveAttribute) ([]comby.Event, error)

IdentityCommandRemoveGroup

Domain Command Struct:

go
type IdentityCommandRemoveGroup struct {
	IdentityUuid string `json:"identityUuid"`
	GroupUuid    string `json:"groupUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandRemoveGroup(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandRemoveGroup) ([]comby.Event, error)

IdentityCommandRemoveToken

Domain Command Struct:

go
type IdentityCommandRemoveToken struct {
	IdentityUuid string `json:"identityUuid"`
	TokenUuid    string `json:"tokenUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandRemoveToken(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandRemoveToken) ([]comby.Event, error)

IdentityCommandSetAttribute

Domain Command Struct:

go
type IdentityCommandSetAttribute struct {
	IdentityUuid string `json:"identityUuid"`
	Key          string `json:"key"`
	Value        any    `json:"value"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandSetAttribute(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandSetAttribute) ([]comby.Event, error)

IdentityCommandUpdate

Domain Command Struct:

go
type IdentityCommandUpdate struct {
	IdentityUuid  string   `json:"identityUuid"`
	Attributes    string   `json:"attributes,omitempty"`
	PatchedFields []string `json:"patchedFields"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandUpdate(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandUpdate) ([]comby.Event, error)

IdentityCommandUpdateProfile

Domain Command Struct:

go
type IdentityCommandUpdateProfile struct {
	IdentityUuid  string   `json:"identityUuid"`
	Name          string   `json:"name,omitempty"`
	Email         string   `json:"email,omitempty"`
	Title         string   `json:"title,omitempty"`
	Avatar        string   `json:"avatar,omitempty"`
	PatchedFields []string `json:"patchedFields" doc:"list of fields that should be patched - comma separated" example:"field1,field2"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) IdentityCommandUpdateProfile(ctx context.Context, cmd comby.Command, domainCmd *IdentityCommandUpdateProfile) ([]comby.Event, error)

Queries

Domain Query Structs:

Domain Query Responses:

IdentityQueryListByAccountUuid

Domain Query Struct:

go
type IdentityQueryListByAccountUuid struct {
	AccountUuid string `json:"accountUuid"`
	Page        int64  `json:"page,omitempty"`
	PageSize    int64  `json:"pageSize,omitempty"`
	OrderBy     string `json:"orderBy,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) IdentityQueryListByAccountUuid(ctx context.Context, qry comby.Query, domainQry *IdentityQueryListByAccountUuid) (*IdentityQueryListResponse, error)

IdentityQueryListByAccountTenantUuid

Domain Query Struct:

go
type IdentityQueryListByAccountTenantUuid struct {
	TenantUuid  string `json:"tenantUuid"`
	AccountUuid string `json:"accountUuid"`
	Page        int64  `json:"page,omitempty"`
	PageSize    int64  `json:"pageSize,omitempty"`
	OrderBy     string `json:"orderBy,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) IdentityQueryListByAccountTenantUuid(ctx context.Context, qry comby.Query, domainQry *IdentityQueryListByAccountTenantUuid) (*IdentityQueryListResponse, error)

IdentityQueryList

Domain Query Struct:

go
type IdentityQueryList struct {
	TenantUuid string `json:"tenantUuid"`
	Page       int64  `json:"page,omitempty"`
	PageSize   int64  `json:"pageSize,omitempty"`
	OrderBy    string `json:"orderBy,omitempty"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) IdentityQueryList(ctx context.Context, qry comby.Query, domainQry *IdentityQueryList) (*IdentityQueryListResponse, error)

IdentityQueryModel

Domain Query Struct:

go
type IdentityQueryModel struct {
	IdentityUuid string `json:"identityUuid"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) IdentityQueryModel(ctx context.Context, qry comby.Query, domainQry *IdentityQueryModel) (*IdentityQueryItemResponse, error)

IdentityQueryModelIndependentOfOrganization

Domain Query Struct:

go
type IdentityQueryModelIndependentOfOrganization struct {
	SessionUuid  string `json:"sessionUuid"`
	IdentityUuid string `json:"identityUuid,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) IdentityQueryModelIndependentOfOrganization(ctx context.Context, qry comby.Query, domainQry *IdentityQueryModelIndependentOfOrganization) (*IdentityQueryItemResponse, error)

IdentityQueryListResponse

go
type IdentityQueryListResponse struct {
	Items    []*readmodel.IdentityModel `json:"items,omitempty"`
	Total    int64                      `json:"total,omitempty"`
	Page     int64                      `json:"page,omitempty"`
	PageSize int64                      `json:"pageSize,omitempty"`
}

IdentityQueryItemResponse

go
type IdentityQueryItemResponse struct {
	Item *readmodel.IdentityModel `json:"item,omitempty"`
}

Events

IdentityAddedGroupEvent

Domain Event Struct:

go
type IdentityAddedGroupEvent struct {
	GroupUuid string `json:"groupUuid"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityAddedGroupEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityAddedGroupEvent) (error)

IdentityAddedTokenEvent

Domain Event Struct:

go
type IdentityAddedTokenEvent struct {
	TokenUuid   string `json:"tokenUuid"`
	Name        string `json:"name,omitempty"`
	Description string `json:"description,omitempty"`
	TokenValue  string `json:"tokenValue"`
	ExpiredAt   int64  `json:"expiredAt,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityAddedTokenEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityAddedTokenEvent) (error)

IdentityCreatedEvent

Domain Event Struct:

go
type IdentityCreatedEvent struct {
	AccountUuid string `json:"accountUuid,omitempty"`
	Attributes  string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityCreatedEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityCreatedEvent) (error)

IdentityRemovedEvent

Domain Event Struct:

go
type IdentityRemovedEvent struct {
	Reason string `json:"reason,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityRemovedEvent) (error)

IdentityAttributeRemovedEvent

Domain Event Struct:

go
type IdentityAttributeRemovedEvent struct {
	Key string `json:"key"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityAttributeRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityAttributeRemovedEvent) (error)

IdentityRemovedGroupEvent

Domain Event Struct:

go
type IdentityRemovedGroupEvent struct {
	GroupUuid string `json:"groupUuid"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityRemovedGroupEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityRemovedGroupEvent) (error)

IdentityRemovedTokenEvent

Domain Event Struct:

go
type IdentityRemovedTokenEvent struct {
	TokenUuid string `json:"tokenUuid"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityRemovedTokenEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityRemovedTokenEvent) (error)

IdentityAttributeSetEvent

Domain Event Struct:

go
type IdentityAttributeSetEvent struct {
	Key   string `json:"key"`
	Value any    `json:"value"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityAttributesSetEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityAttributeSetEvent) (error)

IdentityUpdatedEvent

Domain Event Struct:

go
type IdentityUpdatedEvent struct {
	Attributes string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityUpdatedEvent) (error)

IdentityProfileUpdatedEvent

Domain Event Struct:

go
type IdentityProfileUpdatedEvent struct {
	Name   string `json:"name,omitempty"`
	Email  string `json:"email,omitempty"`
	Title  string `json:"title,omitempty"`
	Avatar string `json:"avatar,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Identity) IdentityProfileUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *IdentityProfileUpdatedEvent) (error)

Aggregate

Aggregate Struct:

go
type Identity struct {
	*comby.BaseAggregate
	// References
	AccountUuid string
	GroupUuids  []string
	// Entities
	Profile *Profile
	Tokens  []*Token
}

Methods

AddGroup

go
func (agg *Identity) AddGroup(groupUuid string) (error)

AddToken

go
func (agg *Identity) AddToken(tokenUuid, tokenValue, name, description string, expiredAt int64) (error)

Add

go
func (agg *Identity) Add(accountUuid, attributes string) (error)

Remove

go
func (agg *Identity) Remove() (error)

RemoveAttribute

go
func (agg *Identity) RemoveAttribute(key string) (error)

RemoveGroup

go
func (agg *Identity) RemoveGroup(groupUuid string) (error)

RemoveToken

go
func (agg *Identity) RemoveToken(tokenUuid string) (error)

SetAttribute

go
func (agg *Identity) SetAttribute(key string, value any) (error)

Update

go
func (agg *Identity) Update(attributes string) (error)

UpdateProfile

go
func (agg *Identity) UpdateProfile(name, email, title, avatar string) (error)

Event Handlers

IdentityReadmodel

Domain EventMethod
tenantAggregate.TenantCreatedEventTenantCreatedEvent
tenantAggregate.TenantAttributeRemovedEventTenantAttributeRemovedEvent
tenantAggregate.TenantAttributeSetEventTenantAttributeSetEvent
tenantAggregate.TenantUpdatedEventTenantUpdatedEvent
tenantAggregate.TenantRemovedEventTenantRemovedEvent
identityAggregate.IdentityAttributeRemovedEventIdentityAttributeRemovedEvent
identityAggregate.IdentityRemovedTokenEventIdentityRemovedTokenEvent
identityAggregate.IdentityUpdatedEventIdentityUpdatedEvent
identityAggregate.IdentityRemovedEventIdentityRemovedEvent
identityAggregate.IdentityAddedGroupEventIdentityAddedGroupEvent
identityAggregate.IdentityRemovedGroupEventIdentityRemovedGroupEvent
identityAggregate.IdentityAddedTokenEventIdentityAddedTokenEvent
identityAggregate.IdentityCreatedEventIdentityCreatedEvent
identityAggregate.IdentityProfileUpdatedEventIdentityProfileUpdatedEvent
identityAggregate.IdentityAttributeSetEventIdentityAttributeSetEvent
groupAggregate.GroupUpdatedEventGroupUpdatedEvent
groupAggregate.GroupRemovedEventGroupRemovedEvent
groupAggregate.GroupAddedEventGroupAddedEvent
assetAggregate.AssetAddedEventAssetAddedEvent
assetAggregate.AssetRemovedEventAssetRemovedEvent
assetAggregate.AssetUpdatedEventAssetUpdatedEvent

Custom Permissions

NameTypeComment
IdentityCommandAddTokenCommandAdd token for any other identity
IdentityCommandRemoveTokenCommandRemove token of any other identity
IdentityCommandUpdateProfileCommandUpdate profile of any other identity
IdentityCommandSetAttributeCommandSet attributes of any other identity

Invitation

Commands

InvitationCommandAccept

Domain Command Struct:

go
type InvitationCommandAccept struct {
	InvitationUuid string `json:"invitationUuid"`
	AccountUuid    string `json:"accountUuid"`
	Token          string `json:"token"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) InvitationCommandAccept(ctx context.Context, cmd comby.Command, domainCmd *InvitationCommandAccept) ([]comby.Event, error)

InvitationCommandCreate

Domain Command Struct:

go
type InvitationCommandCreate struct {
	InvitationUuid string   `json:"invitationUuid"`
	IdentityUuid   string   `json:"identityUuid"`
	GroupUuids     []string `json:"groupUuids"`
	Email          string   `json:"email"`
	Attributes     string   `json:"attributes,omitempty"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) InvitationCommandCreate(ctx context.Context, cmd comby.Command, domainCmd *InvitationCommandCreate) ([]comby.Event, error)

InvitationCommandDecline

Domain Command Struct:

go
type InvitationCommandDecline struct {
	InvitationUuid string `json:"invitationUuid"`
	AccountUuid    string `json:"accountUuid"`
	Token          string `json:"token"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) InvitationCommandDecline(ctx context.Context, cmd comby.Command, domainCmd *InvitationCommandDecline) ([]comby.Event, error)

InvitationCommandRemove

Domain Command Struct:

go
type InvitationCommandRemove struct {
	InvitationUuid string `json:"invitationUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) InvitationCommandRemove(ctx context.Context, cmd comby.Command, domainCmd *InvitationCommandRemove) ([]comby.Event, error)

InvitationCommandRemoveAttribute

Domain Command Struct:

go
type InvitationCommandRemoveAttribute struct {
	InvitationUuid string `json:"invitationUuid"`
	Key            string `json:"key"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) InvitationCommandRemoveAttribute(ctx context.Context, cmd comby.Command, domainCmd *InvitationCommandRemoveAttribute) ([]comby.Event, error)

InvitationCommandSend

Domain Command Struct:

go
type InvitationCommandSend struct {
	InvitationUuid string `json:"invitationUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) InvitationCommandSend(ctx context.Context, cmd comby.Command, domainCmd *InvitationCommandSend) ([]comby.Event, error)

InvitationCommandSetAttribute

Domain Command Struct:

go
type InvitationCommandSetAttribute struct {
	InvitationUuid string `json:"invitationUuid"`
	Key            string `json:"key"`
	Value          any    `json:"value"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) InvitationCommandSetAttribute(ctx context.Context, cmd comby.Command, domainCmd *InvitationCommandSetAttribute) ([]comby.Event, error)

InvitationCommandUpdate

Domain Command Struct:

go
type InvitationCommandUpdate struct {
	InvitationUuid string   `json:"invitationUuid"`
	Attributes     string   `json:"attributes,omitempty"`
	PatchedFields  []string `json:"patchedFields"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) InvitationCommandUpdate(ctx context.Context, cmd comby.Command, domainCmd *InvitationCommandUpdate) ([]comby.Event, error)

Queries

Domain Query Structs:

Domain Query Responses:

InvitationQueryList

Domain Query Struct:

go
type InvitationQueryList struct {
	TenantUuid string `json:"tenantUuid"`
	Page       int64  `json:"page,omitempty"`
	PageSize   int64  `json:"pageSize,omitempty"`
	OrderBy    string `json:"orderBy,omitempty"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) InvitationQueryList(ctx context.Context, qry comby.Query, domainQry *InvitationQueryList) (*InvitationQueryListResponse, error)

InvitationQueryModel

Domain Query Struct:

go
type InvitationQueryModel struct {
	InvitationUuid string `json:"invitationUuid"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) InvitationQueryModel(ctx context.Context, qry comby.Query, domainQry *InvitationQueryModel) (*InvitationQueryItemResponse, error)

InvitationQueryModelByInvitationToken

Domain Query Struct:

go
type InvitationQueryModelByInvitationToken struct {
	InvitationToken string `json:"invitationToken"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) InvitationQueryModelByInvitationToken(ctx context.Context, qry comby.Query, domainQry *InvitationQueryModelByInvitationToken) (*InvitationQueryItemResponse, error)

InvitationQueryListResponse

go
type InvitationQueryListResponse struct {
	Items    []*readmodel.InvitationModel `json:"items,omitempty"`
	Total    int64                        `json:"total,omitempty"`
	Page     int64                        `json:"page,omitempty"`
	PageSize int64                        `json:"pageSize,omitempty"`
}

InvitationQueryItemResponse

go
type InvitationQueryItemResponse struct {
	Item *readmodel.InvitationModel `json:"item,omitempty"`
}

Events

InvitationAcceptedEvent

Domain Event Struct:

go
type InvitationAcceptedEvent struct {
	AccountUuid string `json:"accountUuid"`
}

Domain Event Handling Method:

go
func (agg *Invitation) InvitationAcceptedEvent(ctx context.Context, evt comby.Event, domainEvt *InvitationAcceptedEvent) (error)

InvitationCreatedEvent

Domain Event Struct:

go
type InvitationCreatedEvent struct {
	IdentityUuid string   `json:"identityUuid"`
	GroupUuids   []string `json:"groupUuids"`
	Token        string   `json:"token"`
	Email        string   `json:"email"`
	Attributes   string   `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Invitation) InvitationCreatedEvent(ctx context.Context, evt comby.Event, domainEvt *InvitationCreatedEvent) (error)

InvitationDeclinedEvent

Domain Event Struct:

go
type InvitationDeclinedEvent struct {
	AccountUuid string `json:"accountUuid"`
}

Domain Event Handling Method:

go
func (agg *Invitation) InvitationDeclinedEvent(ctx context.Context, evt comby.Event, domainEvt *InvitationDeclinedEvent) (error)

InvitationRemovedEvent

Domain Event Struct:

go
type InvitationRemovedEvent struct {
	Reason string `json:"reason,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Invitation) InvitationRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *InvitationRemovedEvent) (error)

InvitationAttributeRemovedEvent

Domain Event Struct:

go
type InvitationAttributeRemovedEvent struct {
	Key string `json:"key"`
}

Domain Event Handling Method:

go
func (agg *Invitation) InvitationAttributeRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *InvitationAttributeRemovedEvent) (error)

InvitationSentEvent

Domain Event Struct:

go
type InvitationSentEvent struct {
	State string `json:"state"`
}

Domain Event Handling Method:

go
func (agg *Invitation) InvitationSentEvent(ctx context.Context, evt comby.Event, domainEvt *InvitationSentEvent) (error)

InvitationAttributeSetEvent

Domain Event Struct:

go
type InvitationAttributeSetEvent struct {
	Key   string `json:"key"`
	Value any    `json:"value"`
}

Domain Event Handling Method:

go
func (agg *Invitation) InvitationAttributeSetEvent(ctx context.Context, evt comby.Event, domainEvt *InvitationAttributeSetEvent) (error)

InvitationUpdatedEvent

Domain Event Struct:

go
type InvitationUpdatedEvent struct {
	Attributes string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Invitation) InvitationUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *InvitationUpdatedEvent) (error)

Aggregate

Aggregate Struct:

go
type Invitation struct {
	*comby.BaseAggregate
	// GroupUuids groups to which the invited account will be added
	GroupUuids []string
	// IdentityUuid who created the invitation
	IdentityUuid string
	// AccountUuid who accepted the invitation
	AccountUuid string
	// Value Objects
	Token string
	Email string
	State string
}

Methods

Accept

go
func (agg *Invitation) Accept(accountUuid string) (error)

Create

go
func (agg *Invitation) Create(identityUuid string, groupUuids []string, token, email, attributes string) (error)

Decline

go
func (agg *Invitation) Decline(accountUuid string) (error)

Remove

go
func (agg *Invitation) Remove() (error)

RemoveAttribute

go
func (agg *Invitation) RemoveAttribute(key string) (error)

Send

go
func (agg *Invitation) Send() (error)

SetAttribute

go
func (agg *Invitation) SetAttribute(key string, value any) (error)

Update

go
func (agg *Invitation) Update(attributes string) (error)

Event Handlers

Reactor

Domain EventMethod
aggregateInvitation.InvitationCreatedEventInvitationCreatedEvent
aggregateInvitation.InvitationAcceptedEventInvitationAcceptedEvent

InvitationReadmodel

Domain EventMethod
tenantAggregate.TenantCreatedEventTenantCreatedEvent
tenantAggregate.TenantUpdatedEventTenantUpdatedEvent
tenantAggregate.TenantRemovedEventTenantRemovedEvent
invitationAggregate.InvitationSentEventInvitationSentEvent
invitationAggregate.InvitationAcceptedEventInvitationAcceptedEvent
invitationAggregate.InvitationAttributeRemovedEventInvitationAttributeRemovedEvent
invitationAggregate.InvitationAttributeSetEventInvitationAttributeSetEvent
invitationAggregate.InvitationCreatedEventInvitationCreatedEvent
invitationAggregate.InvitationUpdatedEventInvitationUpdatedEvent
invitationAggregate.InvitationRemovedEventInvitationRemovedEvent
invitationAggregate.InvitationDeclinedEventInvitationDeclinedEvent
identityAggregate.IdentityCreatedEventIdentityCreatedEvent
identityAggregate.IdentityProfileUpdatedEventIdentityProfileUpdatedEvent
identityAggregate.IdentityRemovedEventIdentityRemovedEvent
groupAggregate.GroupUpdatedEventGroupUpdatedEvent
groupAggregate.GroupRemovedEventGroupRemovedEvent
groupAggregate.GroupAddedEventGroupAddedEvent
accountAggregate.AccountCredentialsUpdatedEventAccountCredentialsUpdatedEvent

Tenant

Commands

TenantCommandCreate

Domain Command Struct:

go
type TenantCommandCreate struct {
	TenantUuid string `json:"tenantUuid"`
	Name       string `json:"name"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) TenantCommandCreate(ctx context.Context, cmd comby.Command, domainCmd *TenantCommandCreate) ([]comby.Event, error)

TenantCommandRemove

Domain Command Struct:

go
type TenantCommandRemove struct {
	TenantUuid string `json:"tenantUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) TenantCommandRemove(ctx context.Context, cmd comby.Command, domainCmd *TenantCommandRemove) ([]comby.Event, error)

TenantCommandRemoveAttribute

Domain Command Struct:

go
type TenantCommandRemoveAttribute struct {
	TenantUuid string `json:"tenantUuid"`
	Key        string `json:"key"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) TenantCommandRemoveAttribute(ctx context.Context, cmd comby.Command, domainCmd *TenantCommandRemoveAttribute) ([]comby.Event, error)

TenantCommandRemoveSecret

Domain Command Struct:

go
type TenantCommandRemoveSecret struct {
	TenantUuid string `json:"tenantUuid"`
	SecretKey  string `json:"secretKey"`
}

Domain Command Handling Method:

go
func (ch *commandHandler) TenantCommandRemoveSecret(ctx context.Context, cmd comby.Command, domainCmd *TenantCommandRemoveSecret) ([]comby.Event, error)

TenantCommandSetAttribute

Domain Command Struct:

go
type TenantCommandSetAttribute struct {
	TenantUuid string `json:"tenantUuid"`
	Key        string `json:"key"`
	Value      any    `json:"value"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) TenantCommandSetAttribute(ctx context.Context, cmd comby.Command, domainCmd *TenantCommandSetAttribute) ([]comby.Event, error)

TenantCommandSetSecret

Domain Command Struct:

go
type TenantCommandSetSecret struct {
	TenantUuid  string `json:"tenantUuid"`
	SecretKey   string `json:"secretKey"`
	SecretValue string `json:"secretValue,omitempty"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) TenantCommandSetSecret(ctx context.Context, cmd comby.Command, domainCmd *TenantCommandSetSecret) ([]comby.Event, error)

TenantCommandUpdate

Domain Command Struct:

go
type TenantCommandUpdate struct {
	TenantUuid    string   `json:"tenantUuid"`
	Name          string   `json:"name,omitempty"`
	Attributes    string   `json:"attributes,omitempty"`
	PatchedFields []string `json:"patchedFields" doc:"list of fields that should be patched - comma separated" example:"field1,field2"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) TenantCommandUpdate(ctx context.Context, cmd comby.Command, domainCmd *TenantCommandUpdate) ([]comby.Event, error)

Queries

Domain Query Structs:

Domain Query Responses:

TenantQueryList

TenantQueryList returns a list of tenants based on the context of the requestor.

This query determines the list of tenants a requestor is allowed to access, with behavior depending on the requestor's context. The query outcome is classified into two distinct cases:

  1. System Tenant Context:
  • When the requestor represents the system tenant, the query retrieves a complete list of all tenants.
  • This includes tenants from all contexts, providing global visibility for the system tenant.
  1. Specific Tenant Context:
  • If the requestor represents a specific tenant, the query returns a list containing only the tenant associated with the requestor.
  • This ensures that the tenant has access only to its own information, adhering to strict isolation principles in a multi-tenant architecture.

Domain Query Struct:

go
type TenantQueryList struct {
	Page       int64  `json:"page,omitempty"`
	PageSize   int64  `json:"pageSize,omitempty"`
	OrderBy    string `json:"orderBy,omitempty"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) TenantQueryList(ctx context.Context, qry comby.Query, domainQry *TenantQueryList) (*TenantQueryListResponse, error)

TenantQueryModelByName

Domain Query Struct:

go
type TenantQueryModelByName struct {
	Name string `json:"name"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) TenantQueryModelByName(ctx context.Context, qry comby.Query, domainQry *TenantQueryModelByName) (*TenantQueryItemResponse, error)

TenantQueryModel

Domain Query Struct:

go
type TenantQueryModel struct {
	TenantUuid string `json:"tenantUuid"`
}

Domain Query Handling Method:

go
func (qs *queryHandler) TenantQueryModel(ctx context.Context, qry comby.Query, domainQry *TenantQueryModel) (*TenantQueryItemResponse, error)

TenantQueryListResponse

go
type TenantQueryListResponse struct {
	Items    []*readmodel.TenantModel `json:"items,omitempty"`
	Total    int64                    `json:"total,omitempty"`
	Page     int64                    `json:"page,omitempty"`
	PageSize int64                    `json:"pageSize,omitempty"`
}

TenantQueryItemResponse

go
type TenantQueryItemResponse struct {
	Item *readmodel.TenantModel `json:"item,omitempty"`
}

Events

TenantCreatedEvent

Domain Event Struct:

go
type TenantCreatedEvent struct {
	Name       string `json:"name"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Tenant) TenantCreatedEvent(ctx context.Context, evt comby.Event, domainEvt *TenantCreatedEvent) (error)

TenantRemovedEvent

Domain Event Struct:

go
type TenantRemovedEvent struct {
	Reason string `json:"reason,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Tenant) TenantRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *TenantRemovedEvent) (error)

TenantAttributeRemovedEvent

Domain Event Struct:

go
type TenantAttributeRemovedEvent struct {
	Key string `json:"key"`
}

Domain Event Handling Method:

go
func (agg *Tenant) TenantAttributeRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *TenantAttributeRemovedEvent) (error)

TenantSecretRemovedEvent

Domain Event Struct:

go
type TenantSecretRemovedEvent struct {
	SecretKey string `json:"secretKey"`
}

Domain Event Handling Method:

go
func (agg *Tenant) TenantSecretRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *TenantSecretRemovedEvent) (error)

TenantAttributeSetEvent

Domain Event Struct:

go
type TenantAttributeSetEvent struct {
	Key   string `json:"key"`
	Value any    `json:"value"`
}

Domain Event Handling Method:

go
func (agg *Tenant) TenantAttributeSetEvent(ctx context.Context, evt comby.Event, domainEvt *TenantAttributeSetEvent) (error)

TenantSecretSetEvent

Domain Event Struct:

go
type TenantSecretSetEvent struct {
	SecretKey   string `json:"SecretKey"`
	SecretValue string `json:"SecretValue,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Tenant) TenantSecretSetEvent(ctx context.Context, evt comby.Event, domainEvt *TenantSecretSetEvent) (error)

TenantUpdatedEvent

Domain Event Struct:

go
type TenantUpdatedEvent struct {
	Name       string `json:"name,omitempty"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Tenant) TenantUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *TenantUpdatedEvent) (error)

Aggregate

Aggregate Struct:

go
type Tenant struct {
	*comby.BaseAggregate
	// Value Objects
	Name    string
	Secrets *comby.Attributes
}

Methods

Create

go
func (agg *Tenant) Create(name, attributes string) (error)

Remove

go
func (agg *Tenant) Remove() (error)

RemoveAttribute

go
func (agg *Tenant) RemoveAttribute(key string) (error)

RemoveSecret

go
func (agg *Tenant) RemoveSecret(key string) (error)

SetAttribute

go
func (agg *Tenant) SetAttribute(key string, value any) (error)

SetSecret

go
func (agg *Tenant) SetSecret(key, value string) (error)

Update

go
func (agg *Tenant) Update(name, attributes string) (error)

Event Handlers

TenantReadmodel

Domain EventMethod
webhookAggregate.WebhookRemovedEventWebhookRemovedEvent
webhookAggregate.WebhookAddedEventWebhookAddedEvent
tenantAggregate.TenantCreatedEventTenantCreatedEvent
tenantAggregate.TenantSecretRemovedEventTenantSecretRemovedEvent
tenantAggregate.TenantSecretSetEventTenantSecretSetEvent
tenantAggregate.TenantAttributeRemovedEventTenantAttributeRemovedEvent
tenantAggregate.TenantAttributeSetEventTenantAttributeSetEvent
tenantAggregate.TenantUpdatedEventTenantUpdatedEvent
tenantAggregate.TenantRemovedEventTenantRemovedEvent
invitationAggregate.InvitationCreatedEventInvitationCreatedEvent
invitationAggregate.InvitationRemovedEventInvitationRemovedEvent
identityAggregate.IdentityProfileUpdatedEventIdentityProfileUpdatedEvent
identityAggregate.IdentityRemovedEventIdentityRemovedEvent
identityAggregate.IdentityCreatedEventIdentityCreatedEvent
groupAggregate.GroupUpdatedEventGroupUpdatedEvent
groupAggregate.GroupRemovedEventGroupRemovedEvent
groupAggregate.GroupAddedEventGroupAddedEvent
assetAggregate.AssetAddedEventAssetAddedEvent
assetAggregate.AssetRemovedEventAssetRemovedEvent

Webhook

Commands

WebhookCommandAdd

Domain Command Struct:

go
type WebhookCommandAdd struct {
	WebhookUuid         string `json:"webhookUuid"`
	DomainEvtIdentifier string `json:"domainEvtIdentifier"`
	WebhookUrl          string `json:"webhookUrl"`
	Attributes          string `json:"attributes,omitempty"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) WebhookCommandAdd(ctx context.Context, cmd comby.Command, domainCmd *WebhookCommandAdd) ([]comby.Event, error)

WebhookCommandRemove

Domain Command Struct:

go
type WebhookCommandRemove struct {
	WebhookUuid string `json:"webhookUuid"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) WebhookCommandRemove(ctx context.Context, cmd comby.Command, domainCmd *WebhookCommandRemove) ([]comby.Event, error)

WebhookCommandRemoveAttribute

Domain Command Struct:

go
type WebhookCommandRemoveAttribute struct {
	WebhookUuid string `json:"webhookUuid"`
	Key         string `json:"key"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) WebhookCommandRemoveAttribute(ctx context.Context, cmd comby.Command, domainCmd *WebhookCommandRemoveAttribute) ([]comby.Event, error)

WebhookCommandSetAttribute

Domain Command Struct:

go
type WebhookCommandSetAttribute struct {
	WebhookUuid string `json:"webhookUuid"`
	Key         string `json:"key"`
	Value       any    `json:"value"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) WebhookCommandSetAttribute(ctx context.Context, cmd comby.Command, domainCmd *WebhookCommandSetAttribute) ([]comby.Event, error)

WebhookCommandUpdate

Domain Command Struct:

go
type WebhookCommandUpdate struct {
	WebhookUuid         string   `json:"webhookUuid"`
	Active              bool     `json:"active,omitempty"`
	DomainEvtIdentifier string   `json:"domainEvtIdentifier,omitempty"`
	WebhookUrl          string   `json:"webhookUrl,omitempty"`
	Attributes          string   `json:"attributes,omitempty"`
	PatchedFields       []string `json:"patchedFields"`
}

Domain Command Handling Method:

go
func (cs *commandHandler) WebhookCommandUpdate(ctx context.Context, cmd comby.Command, domainCmd *WebhookCommandUpdate) ([]comby.Event, error)

Queries

Domain Query Structs:

Domain Query Responses:

WebhookQueryList

Domain Query Struct:

go
type WebhookQueryList struct {
	TenantUuid string `json:"tenantUuid"`
	Page       int64  `json:"page,omitempty"`
	PageSize   int64  `json:"pageSize,omitempty"`
	OrderBy    string `json:"orderBy,omitempty"`
	Attributes string `json:"attributes,omitempty"`
}

Domain Query Handling Method:

go
func (qs *queryService) WebhookQueryList(ctx context.Context, qry comby.Query, domainQry *WebhookQueryList) (*WebhookQueryListResponse, error)

WebhookQueryModel

Domain Query Struct:

go
type WebhookQueryModel struct {
	WebhookUuid string `json:"webhookUuid"`
}

Domain Query Handling Method:

go
func (qs *queryService) WebhookQueryModel(ctx context.Context, qry comby.Query, domainQry *WebhookQueryModel) (*WebhookQueryItemResponse, error)

WebhookQueryListResponse

go
type WebhookQueryListResponse struct {
	Items    []*readmodel.WebhookModel `json:"items,omitempty"`
	Total    int64                     `json:"total,omitempty"`
	Page     int64                     `json:"page,omitempty"`
	PageSize int64                     `json:"pageSize,omitempty"`
}

WebhookQueryItemResponse

go
type WebhookQueryItemResponse struct {
	Item *readmodel.WebhookModel `json:"item,omitempty"`
}

Events

WebhookAddedEvent

Domain Event Struct:

go
type WebhookAddedEvent struct {
	DomainEvtIdentifier string `json:"domainEvtIdentifier"`
	WebhookUrl          string `json:"webhookUrl"`
	Attributes          string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Webhook) WebhookAddedEvent(ctx context.Context, evt comby.Event, domainEvt *WebhookAddedEvent) (error)

WebhookRemovedEvent

Domain Event Struct:

go
type WebhookRemovedEvent struct {
	Reason string `json:"reason,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Webhook) WebhookRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *WebhookRemovedEvent) (error)

WebhookAttributeRemovedEvent

Domain Event Struct:

go
type WebhookAttributeRemovedEvent struct {
	Key string `json:"key"`
}

Domain Event Handling Method:

go
func (agg *Webhook) WebhookAttributeRemovedEvent(ctx context.Context, evt comby.Event, domainEvt *WebhookAttributeRemovedEvent) (error)

WebhookAttributeSetEvent

Domain Event Struct:

go
type WebhookAttributeSetEvent struct {
	Key   string `json:"key"`
	Value any    `json:"value"`
}

Domain Event Handling Method:

go
func (agg *Webhook) WebhookAttributeSetEvent(ctx context.Context, evt comby.Event, domainEvt *WebhookAttributeSetEvent) (error)

WebhookUpdatedEvent

Domain Event Struct:

go
type WebhookUpdatedEvent struct {
	Active              bool   `json:"active"`
	DomainEvtIdentifier string `json:"domainEvtIdentifier"`
	WebhookUrl          string `json:"webhookUrl"`
	Attributes          string `json:"attributes,omitempty"`
}

Domain Event Handling Method:

go
func (agg *Webhook) WebhookUpdatedEvent(ctx context.Context, evt comby.Event, domainEvt *WebhookUpdatedEvent) (error)

Aggregate

Aggregate Struct:

go
type Webhook struct {
	*comby.BaseAggregate
	// Value Objects
	Active              bool
	DomainEvtIdentifier string
	WebhookUrl          string
}

Methods

Add

go
func (agg *Webhook) Add(domainEvtIdentifier, webhookUrl, attributes string) (error)

Remove

go
func (agg *Webhook) Remove() (error)

RemoveAttribute

go
func (agg *Webhook) RemoveAttribute(key string) (error)

SetAttribute

go
func (agg *Webhook) SetAttribute(key string, value any) (error)

Update

go
func (agg *Webhook) Update(active bool, domainEvtIdentifier, webhookUrl, attributes string) (error)

Event Handlers

WebhookReadmodel

Domain EventMethod
webhookAggregate.WebhookAddedEventWebhookAddedEvent
webhookAggregate.WebhookUpdatedEventWebhookUpdatedEvent
webhookAggregate.WebhookRemovedEventWebhookRemovedEvent
webhookAggregate.WebhookAttributeSetEventWebhookAttributeSetEvent
webhookAggregate.WebhookAttributeRemovedEventWebhookAttributeRemovedEvent
tenantAggregate.TenantCreatedEventTenantCreatedEvent
tenantAggregate.TenantRemovedEventTenantRemovedEvent
tenantAggregate.TenantUpdatedEventTenantUpdatedEvent