Fix: Unknown site_uuid no longer filters all data out, so overview dashboard always shows charts
This commit is contained in:
1 parent
450a8a5daa
commit
856acdb6da
3 files changed
+25
-11
No files matched your search
@@ -7,7 +7,7 @@ const express = require('express');
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
const mongoose = require('mongoose');
|
const mongoose = require('mongoose');
|
||||||
const { Summary } = require('../../models/Schemas');
|
const { Summary } = require('../../models/Schemas');
|
||||||
const { getTimeFilter } = require('./helpers');
|
const { getTimeFilter, isKnownSite } = require('./helpers');
|
||||||
|
|
||||||
// GET /api/dashboard/agents/uptime
|
// GET /api/dashboard/agents/uptime
|
||||||
router.get('/agents/uptime', async (req, res) => {
|
router.get('/agents/uptime', async (req, res) => {
|
||||||
@@ -35,7 +35,7 @@ router.get('/agents/uptime', async (req, res) => {
|
|||||||
req.user?.role === 'EXECUTIVE' ||
|
req.user?.role === 'EXECUTIVE' ||
|
||||||
((!req.user?.site_uuid || req.user?.site_uuid === 'default') && ['SOC_ANALYST', 'ENGINEER'].includes(req.user?.role));
|
((!req.user?.site_uuid || req.user?.site_uuid === 'default') && ['SOC_ANALYST', 'ENGINEER'].includes(req.user?.role));
|
||||||
|
|
||||||
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all') {
|
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) {
|
||||||
query.site_uuid = { $in: [requestedSiteUuid, 'global'] };
|
query.site_uuid = { $in: [requestedSiteUuid, 'global'] };
|
||||||
} else if (!isGlobalUser && req.user?.site_uuid) {
|
} else if (!isGlobalUser && req.user?.site_uuid) {
|
||||||
query.site_uuid = { $in: [req.user.site_uuid, 'global'] };
|
query.site_uuid = { $in: [req.user.site_uuid, 'global'] };
|
||||||
@@ -80,7 +80,7 @@ router.get('/agents', async (req, res) => {
|
|||||||
const isGlobalUser = effectiveRole === 'SUPER_ADMIN' || effectiveRole === 'EXECUTIVE';
|
const isGlobalUser = effectiveRole === 'SUPER_ADMIN' || effectiveRole === 'EXECUTIVE';
|
||||||
const requestedSiteUuid = req.headers['x-backone-site-uuid'];
|
const requestedSiteUuid = req.headers['x-backone-site-uuid'];
|
||||||
|
|
||||||
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all') {
|
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) {
|
||||||
query.site_uuid = { $in: [requestedSiteUuid, 'global'] };
|
query.site_uuid = { $in: [requestedSiteUuid, 'global'] };
|
||||||
} else if (effectiveRole === 'TENANT_ADMIN') {
|
} else if (effectiveRole === 'TENANT_ADMIN') {
|
||||||
query.site_uuid = { $in: [req.user.site_uuid, 'global'] };
|
query.site_uuid = { $in: [req.user.site_uuid, 'global'] };
|
||||||
@@ -117,7 +117,7 @@ router.get('/agents/storage', async (req, res) => {
|
|||||||
((!req.user?.site_uuid || req.user?.site_uuid === 'default') && ['SOC_ANALYST', 'ENGINEER'].includes(req.user?.role));
|
((!req.user?.site_uuid || req.user?.site_uuid === 'default') && ['SOC_ANALYST', 'ENGINEER'].includes(req.user?.role));
|
||||||
|
|
||||||
let siteUuid = null;
|
let siteUuid = null;
|
||||||
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all') {
|
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) {
|
||||||
siteUuid = requestedSiteUuid;
|
siteUuid = requestedSiteUuid;
|
||||||
} else if (!isGlobalUser && req.user?.site_uuid) {
|
} else if (!isGlobalUser && req.user?.site_uuid) {
|
||||||
siteUuid = req.user.site_uuid;
|
siteUuid = req.user.site_uuid;
|
||||||
@@ -181,7 +181,7 @@ router.get('/agents/list', async (req, res) => {
|
|||||||
const effectiveRole = user?._originalRole || user?.role;
|
const effectiveRole = user?._originalRole || user?.role;
|
||||||
const isGlobalUser = effectiveRole === 'SUPER_ADMIN' || effectiveRole === 'EXECUTIVE';
|
const isGlobalUser = effectiveRole === 'SUPER_ADMIN' || effectiveRole === 'EXECUTIVE';
|
||||||
|
|
||||||
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all') {
|
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) {
|
||||||
filter.site_uuid = { $in: [requestedSiteUuid, 'global'] };
|
filter.site_uuid = { $in: [requestedSiteUuid, 'global'] };
|
||||||
} else if (user?.site_uuid) {
|
} else if (user?.site_uuid) {
|
||||||
filter.site_uuid = { $in: [user.site_uuid, 'global'] };
|
filter.site_uuid = { $in: [user.site_uuid, 'global'] };
|
||||||
|
|||||||
@@ -1,5 +1,18 @@
|
|||||||
const { CustomDeviceLabel, Flow } = require('../../models/Schemas');
|
const { CustomDeviceLabel, Flow } = require('../../models/Schemas');
|
||||||
|
|
||||||
|
// Valid tenant site UUIDs (from env). A global user requesting a site that is not
|
||||||
|
// in this list (e.g. a stale 'test-site' from the account's site_uuid column) must
|
||||||
|
// NOT silently filter everything out — treat it as "all sites" instead.
|
||||||
|
const KNOWN_SITES = (process.env.BACKONE_SITE_UUIDS || '')
|
||||||
|
.split(',')
|
||||||
|
.map(s => s.trim())
|
||||||
|
.filter(Boolean);
|
||||||
|
|
||||||
|
function isKnownSite(siteUuid) {
|
||||||
|
// Empty env => no known-site list configured, keep legacy behavior (filter anything).
|
||||||
|
return KNOWN_SITES.length === 0 || KNOWN_SITES.includes(siteUuid);
|
||||||
|
}
|
||||||
|
|
||||||
function getTimeFilter(req) {
|
function getTimeFilter(req) {
|
||||||
// Explicit calendar date range (from the per-page date picker) takes priority
|
// Explicit calendar date range (from the per-page date picker) takes priority
|
||||||
// over the global sidebar time range. Both dates are interpreted as WIB (UTC+7)
|
// over the global sidebar time range. Both dates are interpreted as WIB (UTC+7)
|
||||||
@@ -40,7 +53,7 @@ function getBaseFilter(req, timeFilter = null) {
|
|||||||
req.user?.role === 'EXECUTIVE' ||
|
req.user?.role === 'EXECUTIVE' ||
|
||||||
((!req.user?.site_uuid || req.user?.site_uuid === 'default') && ['SOC_ANALYST', 'ENGINEER'].includes(req.user?.role));
|
((!req.user?.site_uuid || req.user?.site_uuid === 'default') && ['SOC_ANALYST', 'ENGINEER'].includes(req.user?.role));
|
||||||
|
|
||||||
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all') {
|
if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) {
|
||||||
filter.site_uuid = { $in: [requestedSiteUuid, 'global'] };
|
filter.site_uuid = { $in: [requestedSiteUuid, 'global'] };
|
||||||
} else if (!isGlobalUser && req.user?.site_uuid) {
|
} else if (!isGlobalUser && req.user?.site_uuid) {
|
||||||
filter.site_uuid = { $in: [req.user.site_uuid, 'global'] };
|
filter.site_uuid = { $in: [req.user.site_uuid, 'global'] };
|
||||||
@@ -99,5 +112,6 @@ module.exports = {
|
|||||||
getTimeFilter,
|
getTimeFilter,
|
||||||
getBaseFilter,
|
getBaseFilter,
|
||||||
getCustomLabelsMap,
|
getCustomLabelsMap,
|
||||||
topFlowField
|
topFlowField,
|
||||||
|
isKnownSite
|
||||||
};
|
};
|
||||||
@@ -45,8 +45,9 @@ export function Sidebar({ isMobile = false, onClose }: SidebarProps) {
|
|||||||
// Role-aware site UUID logic:
|
// Role-aware site UUID logic:
|
||||||
// - Global roles (SUPER_ADMIN, EXECUTIVE, SOC_ANALYST, ENGINEER):
|
// - Global roles (SUPER_ADMIN, EXECUTIVE, SOC_ANALYST, ENGINEER):
|
||||||
// Prioritaskan pilihan yang TERSIMPAN di localStorage.
|
// Prioritaskan pilihan yang TERSIMPAN di localStorage.
|
||||||
// Hanya set dari DB jika belum ada pilihan tersimpan.
|
// Jangan pakai site_uuid dari DB — untuk role global nilainya bisa
|
||||||
// Ini agar site switcher tidak reset ke SIAB setiap page reload.
|
// placeholder (mis. 'test-site') yang bukan site asli, sehingga
|
||||||
|
// dashboard ikut terfilter kosong. Default yang aman adalah 'all'.
|
||||||
// - Restricted roles (TENANT_ADMIN, AGENT_VIEWER, COMPANY_*):
|
// - Restricted roles (TENANT_ADMIN, AGENT_VIEWER, COMPANY_*):
|
||||||
// Selalu pakai site_uuid dari DB (mereka tidak bisa ganti site).
|
// Selalu pakai site_uuid dari DB (mereka tidak bisa ganti site).
|
||||||
const globalRoles = ['SUPER_ADMIN', 'EXECUTIVE', 'SOC_ANALYST', 'ENGINEER'];
|
const globalRoles = ['SUPER_ADMIN', 'EXECUTIVE', 'SOC_ANALYST', 'ENGINEER'];
|
||||||
@@ -54,8 +55,7 @@ export function Sidebar({ isMobile = false, onClose }: SidebarProps) {
|
|||||||
const storedSiteUuid = localStorage.getItem('backone_site_uuid');
|
const storedSiteUuid = localStorage.getItem('backone_site_uuid');
|
||||||
|
|
||||||
if (isGlobalRole) {
|
if (isGlobalRole) {
|
||||||
// Pakai localStorage jika sudah ada, fallback ke DB, fallback ke SIAB default
|
const siteToUse = storedSiteUuid || 'all';
|
||||||
const siteToUse = storedSiteUuid || data.user.site_uuid || 'all';
|
|
||||||
localStorage.setItem('backone_site_uuid', siteToUse);
|
localStorage.setItem('backone_site_uuid', siteToUse);
|
||||||
setSelectedSite(siteToUse);
|
setSelectedSite(siteToUse);
|
||||||
} else if (data.user.site_uuid) {
|
} else if (data.user.site_uuid) {
|
||||||
|
|||||||
Reference in new issue
Block a user