Scope the table-info counts to the territory
table-info feeds two things and was scoped for neither: the status bar's "total rows", and the figure the load progress promises while it waits. So an account that can see a fraction of the table was told the whole size of it -- jbukowski's 542k rows reported as 2.8M. It only showed on the larger territories. The seeded figure is replaced by X-Row-Count when the headers arrive, and on a small territory the aggregate returns fast enough that the wrong number barely appears. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5cc59b5792
commit
f2734ab5b2
@ -1,6 +1,7 @@
|
|||||||
const express = require('express');
|
const express = require('express');
|
||||||
const { fcTable, mapType } = require('../lib/utils');
|
const { fcTable, mapType } = require('../lib/utils');
|
||||||
const { sessionUser } = require('../lib/auth');
|
const { sessionUser, sessionTerritory } = require('../lib/auth');
|
||||||
|
const { buildTerritoryClause } = require('../lib/sql_generator');
|
||||||
|
|
||||||
module.exports = function(pool) {
|
module.exports = function(pool) {
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
@ -194,7 +195,7 @@ ${colDefs},
|
|||||||
router.get('/versions/:id/table-info', async (req, res) => {
|
router.get('/versions/:id/table-info', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const verResult = await pool.query(`
|
const verResult = await pool.query(`
|
||||||
SELECT v.id, v.name, v.status, s.schema, s.tname
|
SELECT v.id, v.name, v.status, s.schema, s.tname, s.id AS source_id
|
||||||
FROM pf.version v
|
FROM pf.version v
|
||||||
JOIN pf.source s ON s.id = v.source_id
|
JOIN pf.source s ON s.id = v.source_id
|
||||||
WHERE v.id = $1
|
WHERE v.id = $1
|
||||||
@ -210,10 +211,23 @@ ${colDefs},
|
|||||||
);
|
);
|
||||||
const exists = existsResult.rows[0].exists;
|
const exists = existsResult.rows[0].exists;
|
||||||
|
|
||||||
|
// Scoped like every other read. Unscoped it reported the whole
|
||||||
|
// table to an account that can see a fraction of it -- the status
|
||||||
|
// bar's row count, and the figure the load progress promises, both
|
||||||
|
// came from here: a rep with 330k rows was told the load was
|
||||||
|
// fetching 2.8M.
|
||||||
|
const terrCol = (await pool.query(
|
||||||
|
`SELECT cname FROM pf.col_meta WHERE source_id = $1 AND is_territory LIMIT 1`,
|
||||||
|
[v.source_id]
|
||||||
|
)).rows[0]?.cname || null;
|
||||||
|
const terr = buildTerritoryClause(sessionTerritory(req), terrCol);
|
||||||
|
|
||||||
let rows = null, byIter = [];
|
let rows = null, byIter = [];
|
||||||
if (exists) {
|
if (exists) {
|
||||||
const countResult = await pool.query(
|
const countResult = await pool.query(
|
||||||
`SELECT pf_iter, count(*)::int AS n FROM ${fc} GROUP BY pf_iter ORDER BY pf_iter`
|
`SELECT pf_iter, count(*)::int AS n FROM ${fc}
|
||||||
|
${terr ? `WHERE ${terr}` : ''}
|
||||||
|
GROUP BY pf_iter ORDER BY pf_iter`
|
||||||
);
|
);
|
||||||
byIter = countResult.rows;
|
byIter = countResult.rows;
|
||||||
rows = byIter.reduce((a, r) => a + r.n, 0);
|
rows = byIter.reduce((a, r) => a + r.n, 0);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user