v0.5.4: fix multi-company API — client_id validation, export isolation, 121 tests PASS
This commit is contained in:
@@ -49,9 +49,16 @@ function createEntriesRouter({ q }) {
|
|||||||
if (!c) throw Object.assign(new Error('Company not found'), { status: 404 });
|
if (!c) throw Object.assign(new Error('Company not found'), { status: 404 });
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
// Мульти-компания: если передан client_id — использовать его
|
// Мульти-компания: client_id разрешён только если есть в allClientIds пользователя
|
||||||
const effectiveClientId = req.query.client_id || req.user.clientId;
|
const requestedId = (req.query.client_id || '').trim();
|
||||||
return q.getOrCreateCompany(effectiveClientId, req.user.companyName);
|
const effectiveClientId = (requestedId && req.user.allClientIds && req.user.allClientIds.includes(requestedId))
|
||||||
|
? requestedId
|
||||||
|
: req.user.clientId;
|
||||||
|
// companyName: для переключённой компании — clientId как имя по умолчанию
|
||||||
|
const effectiveName = effectiveClientId === req.user.clientId
|
||||||
|
? req.user.companyName
|
||||||
|
: effectiveClientId;
|
||||||
|
return q.getOrCreateCompany(effectiveClientId, effectiveName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET /api/v1/entries — список записей + лимит
|
// GET /api/v1/entries — список записей + лимит
|
||||||
@@ -75,8 +82,11 @@ function createEntriesRouter({ q }) {
|
|||||||
try {
|
try {
|
||||||
let companyId = null;
|
let companyId = null;
|
||||||
if (!req.user.isAdmin) {
|
if (!req.user.isAdmin) {
|
||||||
const effectiveClientId = req.query.client_id || req.user.clientId;
|
const requestedId = (req.query.client_id || '').trim();
|
||||||
const company = await q.getOrCreateCompany(effectiveClientId, req.user.companyName);
|
const effectiveClientId = (requestedId && req.user.allClientIds && req.user.allClientIds.includes(requestedId))
|
||||||
|
? requestedId
|
||||||
|
: req.user.clientId;
|
||||||
|
const company = await q.getOrCreateCompany(effectiveClientId, effectiveClientId);
|
||||||
companyId = company.id;
|
companyId = company.id;
|
||||||
} else if (req.query.company) {
|
} else if (req.query.company) {
|
||||||
const id = parseInt(req.query.company, 10);
|
const id = parseInt(req.query.company, 10);
|
||||||
|
|||||||
+4
-3
@@ -973,11 +973,12 @@ async function cleanup() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// O7: несуществующий ?client_id= → upsert-ит новую компанию (безопасно)
|
// O7: несуществующий ?client_id= → игнорируется, фоллбек на WZ01325 (безопасность)
|
||||||
{
|
{
|
||||||
const r = await req.get('/api/v1/entries?client_id=NONEXISTENT').set(bearer(tokenMulti));
|
const r = await req.get('/api/v1/entries?client_id=NONEXISTENT').set(bearer(tokenMulti));
|
||||||
log(r.status === 200, 'O7: GET ?client_id=NONEXISTENT → 200 (создаёт пустую компанию)', `status=${r.status}`);
|
log(r.status === 200, 'O7: GET ?client_id=NONEXISTENT → 200 (игнор, фоллбек)', `status=${r.status}`);
|
||||||
log(json(r).entries?.length === 0, 'O7b: новая компания без записей');
|
// NONEXISTENT не в allClientIds → фоллбек на WZ01325 → записи ЕСТЬ
|
||||||
|
log(json(r).entries?.length > 0, 'O7b: фоллбек на WZ01325 — записи есть');
|
||||||
}
|
}
|
||||||
|
|
||||||
// O8: admin передаёт ?client_id= → использует свою компанию (игнор)
|
// O8: admin передаёт ?client_id= → использует свою компанию (игнор)
|
||||||
|
|||||||
Reference in New Issue
Block a user