From 630da26f3fa911d7066dedccaba6f8c99ccd1ba4 Mon Sep 17 00:00:00 2001 From: Fernando Takagi Date: Wed, 23 Nov 2022 19:57:42 -0300 Subject: [PATCH] Ensure group count does not update when failing to add a member. (#935) --- CHANGELOG.md | 1 + server/core_group.go | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 101f259ef..e3d685a47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr - Correct handling of `httpRequest` calls in the Lua runtime Nakama module. - Fix handling of users attempting to leave groups they're banned from. - Fix handling of optional parameters in JS runtime token generate function. +- Ensure group count does not update when failing to add a member. ## [3.14.0] - 2022-10-14 ### Added diff --git a/server/core_group.go b/server/core_group.go index 46968ac02..ca8b268e6 100644 --- a/server/core_group.go +++ b/server/core_group.go @@ -428,11 +428,20 @@ WHERE (id = $1) AND (disable_time = '1970-01-01 00:00:00 UTC')` } query = "UPDATE groups SET edge_count = edge_count + 1, update_time = now() WHERE id = $1::UUID AND edge_count+1 <= max_count" - if _, err = tx.ExecContext(ctx, query, groupID); err != nil { + res, err := tx.ExecContext(ctx, query, groupID) + if err != nil { logger.Debug("Could not update group edge_count.", zap.String("group_id", groupID.String()), zap.String("user_id", userID.String())) return err } + if rowsAffected, err := res.RowsAffected(); err != nil { + logger.Debug("Could not update group edge_count.", zap.Error(err), zap.String("group_id", groupID.String()), zap.String("user_id", userID.String())) + return err + } else if rowsAffected == 0 { + logger.Info("Could not add users as group maximum count was reached.", zap.String("group_id", groupID.String()), zap.String("user_id", userID.String())) + return runtime.ErrGroupFull + } + query = `INSERT INTO message (id, code, sender_id, username, stream_mode, stream_subject, stream_descriptor, stream_label, content, create_time, update_time) VALUES ($1, $2, $3, $4, $5, $6::UUID, $7::UUID, $8, $9, $10, $10)` if _, err = tx.ExecContext(ctx, query, message.MessageId, message.Code.Value, message.SenderId, message.Username, stream.Mode, stream.Subject, stream.Subcontext, stream.Label, message.Content, time.Unix(message.CreateTime.Seconds, 0).UTC()); err != nil { -- GitLab