Commit 898bae53 authored by Mo Firouz's avatar Mo Firouz Committed by Andrei Mihu
Browse files

Allow full account update from runtime. (#201)

parent fd910988
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ func (s *ApiServer) UpdateAccount(ctx context.Context, in *api.UpdateAccountRequ
	}

	userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID)
	err := UpdateAccount(s.db, s.logger, userID, username, in.GetDisplayName(), in.GetTimezone(), in.GetLocation(), in.GetLangTag(), in.GetAvatarUrl())
	err := UpdateAccount(s.db, s.logger, userID, username, in.GetDisplayName(), in.GetTimezone(), in.GetLocation(), in.GetLangTag(), in.GetAvatarUrl(), nil)

	if err != nil {
		if _, ok := err.(*pq.Error); ok {
+2 −1
Original line number Diff line number Diff line
@@ -108,7 +108,8 @@ func (s *ApiServer) DeleteFriends(ctx context.Context, in *api.DeleteFriendsRequ
	}

	if len(userIDs)+len(in.GetIds()) == 0 {
		return nil, status.Error(codes.InvalidArgument, "No valid ID or username was provided.")
		s.logger.Info("No valid ID or username was provided.")
		return &empty.Empty{}, nil
	}

	allIDs := make([]string, 0, len(in.GetIds())+len(userIDs))
+7 −1
Original line number Diff line number Diff line
@@ -127,7 +127,7 @@ WHERE id = $1`
}

func UpdateAccount(db *sql.DB, logger *zap.Logger, userID uuid.UUID, username string,
	displayName, timezone, location, langTag, avatarURL *wrappers.StringValue) error {
	displayName, timezone, location, langTag, avatarURL, metadata *wrappers.StringValue) error {

	index := 1
	statements := make([]string, 0)
@@ -192,6 +192,12 @@ func UpdateAccount(db *sql.DB, logger *zap.Logger, userID uuid.UUID, username st
		}
	}

	if metadata != nil {
		statements = append(statements, "metadata = $"+strconv.Itoa(index))
		params = append(params, metadata.GetValue())
		index++
	}

	if len(statements) == 0 {
		return errors.New("No fields to update.")
	}
+4 −0
Original line number Diff line number Diff line
@@ -187,8 +187,12 @@ func fetchUserID(db *sql.DB, usernames []string) ([]string, error) {
	query := "SELECT id FROM users WHERE username IN (" + strings.Join(statements, ", ") + ")"
	rows, err := db.Query(query, params...)
	if err != nil {
		if err == sql.ErrNoRows {
			return ids, nil
		}
		return nil, err
	}
	defer rows.Close()

	for rows.Next() {
		var id string
+60 −0
Original line number Diff line number Diff line
@@ -143,6 +143,7 @@ func (n *NakamaModule) Loader(l *lua.LState) int {
		"logger_warn":                 n.loggerWarn,
		"logger_error":                n.loggerError,
		"account_get_id":              n.accountGetId,
		"account_update_id":           n.accountUpdateId,
		"users_get_id":                n.usersGetId,
		"users_get_username":          n.usersGetUsername,
		"stream_user_list":            n.streamUserList,
@@ -3674,3 +3675,62 @@ func (n *NakamaModule) userGroupsList(l *lua.LState) int {
	l.Push(userGroups)
	return 1
}

func (n *NakamaModule) accountUpdateId(l *lua.LState) int {
	userID, err := uuid.FromString(l.CheckString(1))
	if err != nil {
		l.ArgError(1, "expects user ID to be a valid identifier")
		return 0
	}

	metadataTable := l.OptTable(2, nil)
	var metadata *wrappers.StringValue
	if metadataTable != nil {
		metadataMap := ConvertLuaTable(metadataTable)
		metadataBytes, err := json.Marshal(metadataMap)
		if err != nil {
			l.RaiseError("error encoding metadata: %v", err.Error())
			return 0
		}
		metadata = &wrappers.StringValue{Value: string(metadataBytes)}
	}

	username := l.OptString(3, "")

	displayNameL := l.Get(4)
	var displayName *wrappers.StringValue
	if displayNameL != nil {
		displayName = &wrappers.StringValue{Value: l.OptString(4, "")}
	}

	timezoneL := l.Get(5)
	var timezone *wrappers.StringValue
	if timezoneL != nil {
		timezone = &wrappers.StringValue{Value: l.OptString(5, "")}
	}

	locationL := l.Get(6)
	var location *wrappers.StringValue
	if locationL != nil {
		location = &wrappers.StringValue{Value: l.OptString(6, "")}
	}

	langL := l.Get(7)
	var lang *wrappers.StringValue
	if langL != nil {
		lang = &wrappers.StringValue{Value: l.OptString(7, "")}
	}

	avatarL := l.Get(8)
	var avatar *wrappers.StringValue
	if avatarL != nil {
		avatar = &wrappers.StringValue{Value: l.OptString(8, "")}
	}

	if err = UpdateAccount(n.db, n.logger, userID, username, displayName, timezone, location, lang, avatar, metadata); err != nil {
		l.RaiseError("error while trying to update user: %v", err.Error())
		return 0
	}

	return 0
}