UNPKG

@tanglemedia/directus-extension-bundle-page-views

Version:

A Directus extension bundle that adds a page views collection and dashboard to track page views.

156 lines (135 loc) 4.79 kB
import crypto from "crypto"; const COLLECTION_NAME = "tngl_page_views"; const ROLE_NAME = "Analytics"; const ROLE_DESCRIPTION = "Usage in auto-generating logs for analytics"; const ROLE_ICON = "area_chart"; // preset that applies to any user or role // create function to generate a uuidv4 function generateUUIDv4() { return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ ((crypto.randomBytes(1)[0] & 15) >> (c / 4))).toString(16) ); } export async function up(knex) { let analyticsRoleID = null; // check existence of the directus_permissions table const permTableExists = await knex.schema.hasTable("directus_permissions"); // check existence of the directus_policies table const policyTableExists = await knex.schema.hasTable("directus_policies"); // check existence of the directus_roles table const roleTableExists = await knex.schema.hasTable("directus_roles"); if (!roleTableExists) return; if (!permTableExists) return; // check if analytics role exists const analyticsRoleRow = await knex("directus_roles") .select("id") .where("name", ROLE_NAME) .first(); // if analytics roles does not exist, create one if (!analyticsRoleRow) { analyticsRoleID = generateUUIDv4(); await knex("directus_roles").insert({ id: analyticsRoleID, name: ROLE_NAME, icon: ROLE_ICON, description: ROLE_DESCRIPTION, }); } else { analyticsRoleID = analyticsRoleRow.id; } // then create a new policy if (policyTableExists) { // check if policy whose id = analyticsRoleID exists const analyticsPolicyRow = await knex("directus_policies") .select("id") .where("id", analyticsRoleID) .first(); // if policy whose id = analyticsRoleID does not exist, create one if (!analyticsPolicyRow) { await knex("directus_policies").insert({ id: analyticsRoleID, name: ROLE_NAME, icon: ROLE_ICON, description: ROLE_DESCRIPTION, }); } } if (analyticsRoleID) { // if directus_permissions table exists, add a new permission for the analytics role to create and upate the tngl_page_views collection const columns = await knex("directus_permissions").columnInfo(); const columnNames = Object.keys(columns); const analyticsActions = ["create", "update"]; const newPermissionRow = analyticsActions.map((action) => { const newPermission = {}; // fields that exist in v10 and v11 if (columnNames.includes("collection")) { newPermission.collection = COLLECTION_NAME; } if (columnNames.includes("action")) { newPermission.action = action; } if (columnNames.includes("permissions")) { newPermission.permissions = {}; } if (columnNames.includes("validation")) { newPermission.validation = {}; } if (columnNames.includes("presets")) { newPermission.presets = null; } if (columnNames.includes("fields")) { newPermission.fields = "*"; } // fields that exist in v10 if (columnNames.includes("role")) { newPermission.role = analyticsRoleID; } // fields that exist in v11 if (columnNames.includes("policy")) { newPermission.policy = analyticsRoleID; } return knex("directus_permissions").insert(newPermission); }); await Promise.all(newPermissionRow); } } export async function down(knex) { // check existence of the directus_permissions table const permTableExists = await knex.schema.hasTable("directus_permissions"); // check existence of the directus_policies table const policyTableExists = await knex.schema.hasTable("directus_policies"); // check existence of the directus_roles table const roleTableExists = await knex.schema.hasTable("directus_roles"); if (!roleTableExists) return; if (!permTableExists) return; // check if analytics role exists const analyticsRoleRow = await knex("directus_roles") .select("id") .where("name", ROLE_NAME) .first(); // if website roles does not exists, do not proceed with migration if (!analyticsRoleRow) { return; } if (analyticsRoleRow && analyticsRoleRow.id) { const analyticsRoleID = analyticsRoleRow.id; if (permTableExists) { const columns = await knex("directus_permissions").columnInfo(); const columnNames = Object.keys(columns); // remove permission for tngl_page_views collection if policy === analyticsRoleID and policy column exists if (columnNames.includes("policy")) { await knex("directus_permissions") .where("collection", COLLECTION_NAME) .andWhere("policy", analyticsRoleID) .del(); } // remove permission for tngl_page_views collection if role === analyticsRoleID and role column exists if (columnNames.includes("role")) { await knex("directus_permissions") .where("collection", COLLECTION_NAME) .andWhere("role", analyticsRoleID) .del(); } } } }