in api/v1/src/accounts/dataManager.js [88:173]
async function listAccounts(projectId, datasetId, policyId) {
const bigqueryUtil = new BigQueryUtil(projectId);
const table = bigqueryUtil.getTableFqdn(projectId, cfg.cdsDatasetId, cfg.cdsAccountViewId);
const policyTable = bigqueryUtil.getTableFqdn(projectId, cfg.cdsDatasetId, cfg.cdsPolicyViewId);
const limit = 10;
let sqlQuery = `SELECT ca.* except(policies),
array(
select as struct
pm.policyId,
pm.name,
pm.marketplace.solutionId,
pm.marketplace.planId
from unnest(ca.policies) p
join \`${policyTable}\` pm on p.policyId = pm.policyId
where pm.isDeleted is false
) as policies
FROM \`${table}\` ca
where ca.isDeleted is false;`
let options = {
query: sqlQuery
};
if (datasetId) {
sqlQuery = `with policies as (
select distinct
cp.policyId,
cp.name,
cp.isTableBased,
cp.marketplace.solutionId,
cp.marketplace.planId,
d.datasetId
FROM \`${policyTable}\` cp
cross join unnest(cp.datasets) d
where d.datasetId = @datasetId and cp.isDeleted is false
),
userPolicies as (
select
ca.* EXCEPT(policies),
cp.policyId,
cp.name,
cp.solutionId,
cp.planId
FROM \`${table}\` ca
cross join unnest(ca.policies) as p
join policies cp on p.policyId = cp.policyId
where ca.isDeleted IS false and cp.isTableBased IS false
)
select
up.rowId,
up.email,
up.emailType,
up.accountId,
up.createdAt,
up.createdBy,
up.version,
ARRAY_AGG(struct(policyId, name, solutionId, planId)) as policies
from userPolicies up
group by up.rowId, up.email, up.emailType, up.accountId, up.createdAt, up.createdBy, up.version`;
options = {
query: sqlQuery,
params: { datasetId: datasetId }
};
} else if (policyId) {
let fields = new Set(cfg.cdsAccountViewFields);
let remove = ['rowId', 'accountId', 'accountType', 'createdBy', 'policies', 'createdAt', 'version', 'isDeleted'];
remove.forEach(f => fields.delete(f));
fields = Array.from(fields).map(i => 'ca.' + i).join();
sqlQuery = `SELECT ${fields}
FROM \`${table}\` ca
CROSS JOIN UNNEST(ca.policies) as p
WHERE p.policyId = @policyId
LIMIT ${limit}`
options = {
query: sqlQuery,
params: { policyId: policyId }
};
}
try {
const [rows] = await bigqueryUtil.executeQuery(options);
const accounts = await checkProcurementEntitlements(projectId, rows);
return { success: true, data: accounts };
} catch (err) {
console.error(err);
return { success: false, code: 500, errors: ['Unable to retrieve accounts'] };
}
}