fix: query tenant-sharded private messages
Deploy im-server production / deploy (push) Successful in 7m7s
Deploy im-server production / deploy (push) Successful in 7m7s
This commit is contained in:
@@ -72,6 +72,19 @@ func TestMessageQuerySpecsExposeAdminFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPrivateMessageQueryUsesTenantShardTables(t *testing.T) {
|
||||||
|
spec := privateMessagesInternalQuerySpecForTenant(types.TenantID(9))
|
||||||
|
query := strings.ToLower(spec.From)
|
||||||
|
for _, table := range []string{"im_009_messages", "im_009_subscriptions"} {
|
||||||
|
if !strings.Contains(query, table) {
|
||||||
|
t.Fatalf("private message query must use tenant shard table %q: %s", table, query)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if strings.Contains(query, "from im_messages ") || strings.Contains(query, "from im_subscriptions ") {
|
||||||
|
t.Fatalf("private message query must not use legacy shared tables: %s", query)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestGroupMessageQuerySupportsOperationalFilters(t *testing.T) {
|
func TestGroupMessageQuerySupportsOperationalFilters(t *testing.T) {
|
||||||
req := httptest.NewRequest("GET", "/?seq_id=42&sender_username=alice&sender_nickname=%E5%B0%8F%E6%98%8E&group_name=%E6%B5%8B%E8%AF%95%E7%BE%A4", nil)
|
req := httptest.NewRequest("GET", "/?seq_id=42&sender_username=alice&sender_nickname=%E5%B0%8F%E6%98%8E&group_name=%E6%B5%8B%E8%AF%95%E7%BE%A4", nil)
|
||||||
query, _, args, _, _, err := buildInternalAdminListQuery(req, groupMessagesInternalQuerySpec(), "", types.TenantID(1))
|
query, _, args, _, _, err := buildInternalAdminListQuery(req, groupMessagesInternalQuerySpec(), "", types.TenantID(1))
|
||||||
|
|||||||
@@ -127,6 +127,9 @@ func serveInternalAdminResourceList(wrt http.ResponseWriter, req *http.Request,
|
|||||||
writeIMError(wrt, req, http.StatusNotFound, 30004, imReasonMalformedRequest, "resource not found", nil)
|
writeIMError(wrt, req, http.StatusNotFound, 30004, imReasonMalformedRequest, "resource not found", nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if resource == "private-messages" {
|
||||||
|
spec = privateMessagesInternalQuerySpecForTenant(tenantID)
|
||||||
|
}
|
||||||
if resource == "group-messages" {
|
if resource == "group-messages" {
|
||||||
var err error
|
var err error
|
||||||
spec, err = groupMessagesInternalQuerySpecForTenant(tenantID)
|
spec, err = groupMessagesInternalQuerySpecForTenant(tenantID)
|
||||||
@@ -400,6 +403,14 @@ func privateMessagesInternalQuerySpec() *internalQuerySpec {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func privateMessagesInternalQuerySpecForTenant(tenantID types.TenantID) *internalQuerySpec {
|
||||||
|
spec := privateMessagesInternalQuerySpec()
|
||||||
|
prefix := fmt.Sprintf("im_%03d_", tenantID)
|
||||||
|
spec.From = strings.Replace(spec.From, "FROM im_messages ", "FROM "+prefix+"messages ", 1)
|
||||||
|
spec.From = strings.ReplaceAll(spec.From, "FROM im_subscriptions ", "FROM "+prefix+"subscriptions ")
|
||||||
|
return spec
|
||||||
|
}
|
||||||
|
|
||||||
func groupMessagesInternalQuerySpec() *internalQuerySpec {
|
func groupMessagesInternalQuerySpec() *internalQuerySpec {
|
||||||
status := `CASE WHEN aa.action='delete' THEN 'deleted' WHEN aa.action='hide' THEN 'hidden' WHEN m.status='recalled' THEN 'recalled' WHEN m.status IN ('deleted','blocked') THEN m.status ELSE 'normal' END`
|
status := `CASE WHEN aa.action='delete' THEN 'deleted' WHEN aa.action='hide' THEN 'hidden' WHEN m.status='recalled' THEN 'recalled' WHEN m.status IN ('deleted','blocked') THEN m.status ELSE 'normal' END`
|
||||||
contentType := `CASE m.msg_type WHEN 'call' THEN 'system' WHEN 'system_notice' THEN 'system' WHEN 'contact_card' THEN 'card' WHEN 'forward_bundle' THEN 'card' WHEN 'link' THEN 'text' ELSE m.msg_type END`
|
contentType := `CASE m.msg_type WHEN 'call' THEN 'system' WHEN 'system_notice' THEN 'system' WHEN 'contact_card' THEN 'card' WHEN 'forward_bundle' THEN 'card' WHEN 'link' THEN 'text' ELSE m.msg_type END`
|
||||||
|
|||||||
Reference in New Issue
Block a user