Skip to content

Instantly share code, notes, and snippets.

@enpassant
Forked from sagikazarmark/user.go
Last active August 12, 2020 06:41
Show Gist options
  • Save enpassant/35894bc97a04f1bc2dcbbaeb375b7585 to your computer and use it in GitHub Desktop.
Save enpassant/35894bc97a04f1bc2dcbbaeb375b7585 to your computer and use it in GitHub Desktop.
User service example
package user
import "errors"
type VerifiedID string
type IDService interface {
VerifyID(id string) (error, VerifiedId)
}
type NewUser struct {
Username string
Password string
IDNumber string
}
type CheckedUserName string
type Login struct {
Username string
Password string
}
type CheckedLogin struct {
CheckedUserName CheckedUserName
Password string
}
type VerifiedUser struct {
checkedLogin CheckedLogin
verifiedId VerifiedID
}
type SavedUser struct {
VerifiedUser VerifiedUser
}
type UserRepository interface {
CheckUsername(username string) (error, CheckedUserName)
SaveUser(verifiedUser VerifiedUser) (error, SavedUser)
}
type UserService struct {
IDService IDService
Users UserRepository
}
func CheckUserLogin(userName string, password string) (error, Login) {
if userName == "" || password == "" {
return errors.New("username or password is empty"), null
}
return (nil, Login{userName, password})
}
func (s UserService) RegisterUser(newUser NewUser) (error, SavedUser) {
// Business validation
err, login := CheckUserLogin(newUser.Username, newUser.Password)
if err != nil {
return err
}
// Validate there is no such username
err, checkedUserName := s.Users.CheckUsername(login.Username)
if err != nil {
return err
}
checkedLogin := CheckedLogin{checkedUserName, login.password}
// Call an external (government?) service to verify the ID number
err, verifiedID := s.IDService.VerifyID(newUser.IDNumber)
if err != nil {
return err
}
verifiedUser := VerifiedUser{checkedLogin, verifiedID}
// Save the user in the persistent store
err, savedUser := s.Users.SaveUser(verifiedUser)
if err != nil {
return err
}
return (nil, savedUser)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment