fix room pin list sql assembly

This commit is contained in:
zhx 2026-06-23 19:29:10 +08:00
parent ebc99a097d
commit 395470f3ba
3 changed files with 47 additions and 3 deletions

View File

@ -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) {

View File

@ -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))
}
}

View File

@ -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)
}
}