diff --git a/services/room-service/internal/storage/mysql/admin_room.go b/services/room-service/internal/storage/mysql/admin_room.go index dba67dd7..abb78a5b 100644 --- a/services/room-service/internal/storage/mysql/admin_room.go +++ b/services/room-service/internal/storage/mysql/admin_room.go @@ -337,7 +337,7 @@ func (r *Repository) AdminListRoomPins(ctx context.Context, query roomservice.Ad } where, args := adminRoomPinWhere(ctx, query) var total int64 - if err := r.db.QueryRowContext(ctx, `SELECT COUNT(*) `+where, args...).Scan(&total); err != nil { + if err := r.db.QueryRowContext(ctx, `SELECT COUNT(*) `+adminRoomPinFromSQL()+where, args...).Scan(&total); err != nil { return nil, 0, err } rows, err := r.db.QueryContext(ctx, adminRoomPinSelectSQL()+where+` ORDER BY p.weight DESC, p.expires_at_ms DESC, p.id DESC LIMIT ? OFFSET ?`, append(args, query.PageSize, (query.Page-1)*query.PageSize)...) @@ -426,7 +426,11 @@ func adminRoomPinSelectSQL() string { p.pinned_at_ms, p.expires_at_ms, p.cancelled_at_ms, p.created_by_admin_id, p.cancelled_by_admin_id, p.created_at_ms, p.updated_at_ms, r.room_short_id, r.visible_region_id, r.title, r.cover_url, r.owner_user_id, r.status - FROM room_region_pins p + ` + adminRoomPinFromSQL() +} + +func adminRoomPinFromSQL() string { + return ` FROM room_region_pins p JOIN room_list_entries r ON r.app_code = p.app_code AND r.room_id = p.room_id ` } @@ -461,7 +465,7 @@ func adminRoomPinWhere(ctx context.Context, query roomservice.AdminRoomPinQuery) where = append(where, "(p.room_id LIKE ? ESCAPE '\\\\' OR r.room_short_id LIKE ? ESCAPE '\\\\' OR r.title LIKE ? ESCAPE '\\\\' OR CAST(r.owner_user_id AS CHAR) LIKE ? ESCAPE '\\\\')") args = append(args, like, like, like, like) } - return ` FROM room_region_pins p JOIN room_list_entries r ON r.app_code = p.app_code AND r.room_id = p.room_id WHERE ` + strings.Join(where, " AND "), args + return ` WHERE ` + strings.Join(where, " AND "), args } func scanAdminRoomPin(scanner interface{ Scan(dest ...any) error }) (roomservice.AdminRoomPinEntry, error) { diff --git a/services/room-service/internal/storage/mysql/admin_room_pin_repository_test.go b/services/room-service/internal/storage/mysql/admin_room_pin_repository_test.go new file mode 100644 index 00000000..15ef21e1 --- /dev/null +++ b/services/room-service/internal/storage/mysql/admin_room_pin_repository_test.go @@ -0,0 +1,29 @@ +package mysql_test + +import ( + "context" + "testing" + + "hyapp/pkg/appcode" + roomservice "hyapp/services/room-service/internal/room/service" + "hyapp/services/room-service/internal/testutil/mysqltest" +) + +func TestAdminListRoomPinsEmptyTable(t *testing.T) { + repo := mysqltest.NewRepository(t) + ctx := appcode.WithContext(context.Background(), appcode.Default) + + items, total, err := repo.AdminListRoomPins(ctx, roomservice.AdminRoomPinQuery{ + Page: 1, + PageSize: 20, + Status: "active", + PinType: "region", + NowMS: 1000, + }) + if err != nil { + t.Fatalf("list empty room pins failed: %v", err) + } + if total != 0 || len(items) != 0 { + t.Fatalf("empty room pins mismatch: total=%d len=%d", total, len(items)) + } +} diff --git a/services/room-service/internal/storage/mysql/repository_test.go b/services/room-service/internal/storage/mysql/repository_test.go index 044e9d6b..0a5d5b79 100644 --- a/services/room-service/internal/storage/mysql/repository_test.go +++ b/services/room-service/internal/storage/mysql/repository_test.go @@ -2,7 +2,10 @@ package mysql import ( "reflect" + "strings" "testing" + + roomservice "hyapp/services/room-service/internal/room/service" ) func TestSplitHumanRobotAllowedOwnerIDs(t *testing.T) { @@ -14,3 +17,11 @@ func TestSplitHumanRobotAllowedOwnerIDs(t *testing.T) { t.Fatalf("owner user ids mismatch: got %+v", userIDs) } } + +func TestAdminRoomPinListSQLUsesSingleFromClause(t *testing.T) { + where, _ := adminRoomPinWhere(t.Context(), roomservice.AdminRoomPinQuery{Status: "active", PinType: "region", NowMS: 1000}) + query := adminRoomPinSelectSQL() + where + if count := strings.Count(query, "FROM room_region_pins"); count != 1 { + t.Fatalf("room pin list SQL must contain one FROM clause, got %d in %q", count, query) + } +}