package usermanager import ( "context" "errors" "math/rand" "github.com/getlantern/deepcopy" gamelangpb "git.alfi.li/gamelang/protobuf/gamelang" ) type UserServer struct { gamelangpb.UnimplementedUserServiceServer usermanager *UserManager } func NewUserServer(um *UserManager) *UserServer { return &UserServer{usermanager: um} } func (us UserServer) CreateUser(ctx context.Context, user *gamelangpb.User) (*gamelangpb.User, error) { id := rand.Uint32() name := user.GetName() password := string(user.GetPassword()) _, err := us.usermanager.Create(id, name, password) if err != nil { return &gamelangpb.User{}, err } return user, nil } func (us UserServer) DeleteUser(ctx context.Context, user *gamelangpb.User) (*gamelangpb.User, error) { us.usermanager.Remove(user.GetName()) return user, nil } func (us UserServer) GetUser(ctx context.Context, user *gamelangpb.User) (*gamelangpb.User, error) { users := us.usermanager.List() for _, userB := range users { if user.GetName() == userB.GetName() { returnUser := &gamelangpb.User{} deepcopy.Copy(userB, returnUser) returnUser.Password = []byte{} return returnUser, nil } } return &gamelangpb.User{}, errors.New("User not found") } func (us UserServer) ListUser(user *gamelangpb.User, stream gamelangpb.UserService_ListUserServer) error { users := us.usermanager.List() for _, user := range users { stream.Send(&user) } return nil } func (us UserServer) CheckUser(ctx context.Context, user *gamelangpb.User) (*gamelangpb.User, error) { if _, ok := us.usermanager.CheckUser(user.GetName(), string(user.GetPassword())); ok { return user, nil } return &gamelangpb.User{}, errors.New("user not found or password missmatch") }