-
-
Save enpassant/35894bc97a04f1bc2dcbbaeb375b7585 to your computer and use it in GitHub Desktop.
User service example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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