fix: resolve 4 bugs from QA round 6 (BUG-F/G/H/I)
BUG-F (P1): Fake webhook lookupInbox used JSONB @> operator on a TEXT
column, causing all fake webhooks to return "ignored". Cast
channel_config::jsonb before the @> operator.
BUG-G (P3): Vue Router history.state warning on Activity page. Four
call sites replaced history.state with null/{}, destroying Vue Router's
internal navigation state. Now all replaceState calls preserve
window.history.state.
BUG-H (P3): Inbox list showed stale data because cache_keys endpoint
returned hardcoded "0000000000" for inbox/label/team, so the frontend
IndexedDB cache never invalidated. Cache keys are now derived from
actual DB state (row count + MAX(updated_at)), with defensive fallback
for missing tables.
BUG-I (P3): All worker goroutines shared the same Redis consumer name,
so XINFO CONSUMERS showed 1 consumer instead of N. Each goroutine now
generates a unique consumer ID (workerID-index).
This commit is contained in:
@@ -539,8 +539,10 @@ export default {
|
||||
// Append the tab key only if it's not the default.
|
||||
const newUrl =
|
||||
tab.key === 'inbox-settings' ? baseUrl : `${baseUrl}/${tab.key}`;
|
||||
// Update URL without triggering route watcher
|
||||
window.history.replaceState(null, '', newUrl);
|
||||
// Update URL without triggering route watcher.
|
||||
// Preserve history.state so Vue Router's internal navigation state
|
||||
// (current position, scroll, etc.) is not lost on subsequent navigation.
|
||||
window.history.replaceState(window.history.state, '', newUrl);
|
||||
},
|
||||
setTabFromRouteParam() {
|
||||
const { tab: tabParam } = this.$route.params;
|
||||
|
||||
+2
-1
@@ -30,7 +30,8 @@ onMounted(() => {
|
||||
}
|
||||
// User need to remove the error params from the url to avoid the error to be shown again after page reload, so that user can try again
|
||||
const cleanURL = window.location.pathname;
|
||||
window.history.replaceState({}, document.title, cleanURL);
|
||||
// Preserve history.state so Vue Router's internal state is not lost.
|
||||
window.history.replaceState(window.history.state, document.title, cleanURL);
|
||||
});
|
||||
|
||||
const requestAuthorization = async () => {
|
||||
|
||||
+2
-1
@@ -30,7 +30,8 @@ onMounted(() => {
|
||||
}
|
||||
// User need to remove the error params from the url to avoid the error to be shown again after page reload, so that user can try again
|
||||
const cleanURL = window.location.pathname;
|
||||
window.history.replaceState({}, document.title, cleanURL);
|
||||
// Preserve history.state so Vue Router's internal state is not lost.
|
||||
window.history.replaceState(window.history.state, document.title, cleanURL);
|
||||
});
|
||||
|
||||
const requestAuthorization = async () => {
|
||||
|
||||
@@ -33,7 +33,8 @@ export const removeQueryParamsFromUrl = (queryParam = 'theme') => {
|
||||
|
||||
if (param) {
|
||||
url.searchParams.delete(queryParam);
|
||||
window.history.replaceState({}, '', url.toString()); // Convert URL to string
|
||||
// Preserve history.state so Vue Router's internal state is not lost.
|
||||
window.history.replaceState(window.history.state, '', url.toString());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user