package user import "errors" type IDService interface { VerifyID(id string) error } type NewUser struct { Username string Password string IDNumber string } type UserRepository interface { CheckUsername(username string) error SaveUser(newUser NewUser) error } type UserService struct { IDService IDService Users UserRepository } func (s UserService) RegisterUser(newUser NewUser) error { // Business validation if newUser.Username == "" || newUser.Password == "" { errors.New("username or password is empty") } // Validate there is no such username if err := s.Users.CheckUsername(newUser.Username); err != nil { return err } // Call an external (government?) service to verify the ID number if err := s.IDService.VerifyID(newUser.IDNumber); err != nil { return err } // Save the user in the persistent store if err := s.Users.SaveUser(newUser); err != nil { return err } return nil }