Skip to content

Instantly share code, notes, and snippets.

@AntonStoeckl
Last active May 7, 2020 11:07
Show Gist options
  • Select an option

  • Save AntonStoeckl/adc6a0a893d7bad16c1fd32275fc3c42 to your computer and use it in GitHub Desktop.

Select an option

Save AntonStoeckl/adc6a0a893d7bad16c1fd32275fc3c42 to your computer and use it in GitHub Desktop.
Example for my iDDD with Go blog article series at https://medium.com/@TonyBologni
package customer
import (
"github.com/AntonStoeckl/go-iddd/service/customeraccounts/application/domain"
"github.com/AntonStoeckl/go-iddd/service/customeraccounts/application/domain/customer/value"
"github.com/AntonStoeckl/go-iddd/service/shared/es"
)
const (
ShouldAddUniqueEmailAddress = iota
ShouldReplaceUniqueEmailAddress
ShouldRemoveUniqueEmailAddress
)
type ForBuildingUniqueEmailAddressAssertions func(recordedEvents ...es.DomainEvent) UniqueEmailAddressAssertions
type UniqueEmailAddressAssertion struct {
desiredAction int
customerID value.CustomerID
emailAddressToAdd value.EmailAddress
emailAddressToRemove value.EmailAddress
}
type UniqueEmailAddressAssertions []UniqueEmailAddressAssertion
func (spec UniqueEmailAddressAssertion) DesiredAction() int {
return spec.desiredAction
}
func (spec UniqueEmailAddressAssertion) CustomerID() value.CustomerID {
return spec.customerID
}
func (spec UniqueEmailAddressAssertion) EmailAddressToAdd() value.EmailAddress {
return spec.emailAddressToAdd
}
func (spec UniqueEmailAddressAssertion) EmailAddressToRemove() value.EmailAddress {
return spec.emailAddressToRemove
}
func BuildUniqueEmailAddressAssertions(recordedEvents ...es.DomainEvent) UniqueEmailAddressAssertions {
var specifications UniqueEmailAddressAssertions
for _, event := range recordedEvents {
switch actualEvent := event.(type) {
case domain.CustomerRegistered:
specifications = append(
specifications,
UniqueEmailAddressAssertion{
desiredAction: ShouldAddUniqueEmailAddress,
customerID: actualEvent.CustomerID(),
emailAddressToAdd: actualEvent.EmailAddress(),
},
)
case domain.CustomerEmailAddressChanged:
specifications = append(
specifications,
UniqueEmailAddressAssertion{
desiredAction: ShouldReplaceUniqueEmailAddress,
emailAddressToAdd: actualEvent.EmailAddress(),
emailAddressToRemove: actualEvent.PreviousEmailAddress(),
},
)
case domain.CustomerDeleted:
specifications = append(
specifications,
UniqueEmailAddressAssertion{
desiredAction: ShouldRemoveUniqueEmailAddress,
emailAddressToRemove: actualEvent.EmailAddress(),
},
)
}
}
return specifications
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment