greatape/app/commands/signup.go

67 wiersze
1.8 KiB
Go

package commands
import (
. "github.com/reiver/greatape/components/constants"
. "github.com/reiver/greatape/components/contracts"
)
func Signup(x IDispatcher, username string, email string, password string) (ISignupResult, error) {
if x.IdentityExistsWhich(func(identity IIdentity) bool {
return identity.Username() == username || identity.Email() == email
}) {
return nil, ERROR_USERNAME_OR_EMAIL_ALREADY_REGISTERED
}
salt := x.GenerateSalt()
hash := x.GenerateHash(password, salt)
token := x.GenerateJwtToken()
code := x.GenerateCode()
privateKey, publicKey, err := x.GenerateRSAKeyPair()
x.AssertNoError(err)
x.Atomic(func() error {
identity := x.AddIdentity(
username, // username
EMPTY, // phoneNumber
false, // phoneNumberConfirmed
EMPTY, // firstName
EMPTY, // lastName
EMPTY, // displayName
email, // email
false, // emailConfirmed
EMPTY, // avatar
EMPTY, // banner
EMPTY, // summary
code, // token
false, // multiFactor
hash, // hash
salt, // salt
publicKey, // publicKey
privateKey, // privateKey
ACL_PERMISSION_USER, // permission
ACL_RESTRICTION_NONE, // restriction
NOT_SET, // lastLogin
0, // loginCount
)
x.AddUser(
identity.Id(), // identityId
EMPTY, // github
)
return nil
})
if x.IsStagingEnvironment() || x.IsProductionEnvironment() {
x.Email(email, "sign-up",
map[string]interface{}{
"app": "GreatApe",
"code": code,
})
code = "000000"
}
return x.NewSignupResult(token, code), nil
}