@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
JavaScript
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();
}
}
}
}