@opengis/fastify-table
Version:
core-plugins
94 lines (79 loc) • 3.26 kB
JavaScript
import pgClients from '../../pg/pgClients.js';
import getTemplate from '../../table/funcs/getTemplate.js';
import applyHook from '../../hook/funcs/applyHook.js';
const allActions = ['view', 'edit', 'add', 'del'];
const q = `select a.route_id as id, d.actions as user_roles, d.actions as role_actions, coalesce(b.actions, array['view']) as interface_actions, b.scope, c.role_id
from admin.routes a
left join admin.role_access b on
a.route_id=b.route_id
left join admin.roles c on
b.role_id=c.role_id
and c.enabled
left join admin.user_roles d on
c.role_id=d.role_id
and ( case when
d.expiration is not null
then d.expiration > CURRENT_DATE
else 1=1
end )
where $1 in (a.route_id, a.alias, a.table_name) and $2 in (b.user_uid, d.user_uid)`;
/**
* @param {Array} user_roles.actions Actions - user actions <> group actions
* @param {Array} role_access.actions Actions - user actions = group actions
* @param {String} body.actions Actions from table template
* @param {String} table Table name / Interface alias
* @param {Object} user User object
* @param {String} user.uid User ID
* @param {String} user.user_type User type
* @returns { scope: String, roles: String[], actions: String[], query: String }
*/
export default async function getAccess({ table, form, user = {} }, pg = pgClients.client) {
if (!table) return null;
const hookData = await applyHook('getAccess', { table, user, pg });
if (hookData) return hookData;
const { uid, user_type: userType = 'regular' } = user;
if (userType === 'superadmin') {
return { actions: allActions, query: '1=1' };
}
const body = await getTemplate('table', table);
const tableActions = !body && form
? allActions // if db table and form => full access (token)
: ['view'].concat(body?.actions || body?.action_default || []);
if (userType === 'admin') {
if (!(body?.actions || body?.action_default) && (body?.form || form)) {
return { actions: allActions, query: '1=1' };
}
return { actions: tableActions, query: '1=1' };
}
if (body?.public || body?.access === 'public') {
return { actions: tableActions, query: '1=1' };
}
if (body?.access === 'user' && uid) {
return { actions: tableActions, query: '1=1' };
}
if (!uid) {
return { actions: [], query: '1=1' };
}
const userAccess = pg?.pk?.['admin.routes']
&& pg.pk?.['admin.role_access']
&& pg.pk?.['admin.roles']
&& pg.pk?.['admin.user_roles']
? await pg.query(q, [table, uid])
.then(el => ({
...el.rows[0] || {},
roles: el.rows?.map?.(row => row.role_id) || [],
actions: el.rows?.map?.(row => row.actions).flat() || [],
}))
: {};
const query = userAccess?.scope === 'my' ? `uid='${uid}'` : '1=1';
const actions = userAccess?.interface_actions
?.filter?.((el, idx, arr) => arr.indexOf(el) === idx)
?.filter(el => (userAccess?.role_actions?.length ? userAccess?.role_actions.includes(el) : true))
?.filter(el => tableActions.includes(el));
return {
scope: userAccess?.scope,
roles: userAccess?.roles,
actions,
query,
};
}